@@ -9,7 +9,7 @@ import {
|
9 | 9 | closeOpenClawStateDatabaseForTest, |
10 | 10 | openOpenClawStateDatabase, |
11 | 11 | } from "../../state/openclaw-state-db.js"; |
12 | | -import { createChannelIngressQueue } from "./ingress-queue.js"; |
| 12 | +import { createChannelIngressQueue, createStateDirEnv } from "./ingress-queue.js"; |
13 | 13 | |
14 | 14 | type ChannelIngressTestDatabase = Pick<OpenClawStateKyselyDatabase, "channel_ingress_events">; |
15 | 15 | |
@@ -28,6 +28,33 @@ describe("channel ingress queue", () => {
|
28 | 28 | closeOpenClawStateDatabaseForTest(); |
29 | 29 | }); |
30 | 30 | |
| 31 | +it("opens a custom state database without copying the full process env", async () => { |
| 32 | +const baseEnv: NodeJS.ProcessEnv = { |
| 33 | +HOME: "/home/openclaw", |
| 34 | +PATH: "/usr/local/bin:/usr/bin", |
| 35 | +}; |
| 36 | +for (let index = 0; index < 10_000; index += 1) { |
| 37 | +baseEnv[`KUBERNETES_SERVICE_${index}`] = "tcp://10.0.0.1:443"; |
| 38 | +} |
| 39 | +const inheritedEnv = new Proxy(baseEnv, { |
| 40 | +ownKeys() { |
| 41 | +throw new Error("inherited env should not be enumerated"); |
| 42 | +}, |
| 43 | +}); |
| 44 | + |
| 45 | +await withTempState(async (stateDir) => { |
| 46 | +const env = createStateDirEnv(stateDir, inheritedEnv); |
| 47 | + |
| 48 | +expect(env.OPENCLAW_STATE_DIR).toBe(stateDir); |
| 49 | +expect(env.HOME).toBe("/home/openclaw"); |
| 50 | +expect(Object.getPrototypeOf(env)).toBe(inheritedEnv); |
| 51 | +expect(Object.keys(env)).toEqual(["OPENCLAW_STATE_DIR"]); |
| 52 | + |
| 53 | +const database = openOpenClawStateDatabase({ env }); |
| 54 | +expect(database.path).toBe(path.join(stateDir, "state", "openclaw.sqlite")); |
| 55 | +}); |
| 56 | +}); |
| 57 | + |
31 | 58 | it("deduplicates pending and completed ingress events", async () => { |
32 | 59 | await withTempState(async (stateDir) => { |
33 | 60 | const queue = createChannelIngressQueue< |
@@ -284,7 +311,7 @@ describe("channel ingress queue", () => {
|
284 | 311 | await queue.complete("retry", { completedAt: 27 }); |
285 | 312 | |
286 | 313 | const database = openOpenClawStateDatabase({ |
287 | | -env: { ...process.env, OPENCLAW_STATE_DIR: stateDir }, |
| 314 | +env: createStateDirEnv(stateDir), |
288 | 315 | }); |
289 | 316 | const kysely = getNodeSqliteKysely<ChannelIngressTestDatabase>(database.db); |
290 | 317 | const rows = executeSqliteQuerySync( |
|