orez 0.2.26 → 0.2.29

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (172) hide show
  1. package/dist/cf-do/worker.d.ts.map +1 -1
  2. package/dist/cf-do/worker.js +9 -1
  3. package/dist/cf-do/worker.js.map +1 -1
  4. package/dist/pg-proxy-do-backend.d.ts +2 -0
  5. package/dist/pg-proxy-do-backend.d.ts.map +1 -1
  6. package/dist/pg-proxy-do-backend.js +49 -7
  7. package/dist/pg-proxy-do-backend.js.map +1 -1
  8. package/dist/pg-sqlite-compiler/catalog/seed.d.ts +67 -0
  9. package/dist/pg-sqlite-compiler/catalog/seed.d.ts.map +1 -0
  10. package/dist/pg-sqlite-compiler/catalog/seed.js +436 -0
  11. package/dist/pg-sqlite-compiler/catalog/seed.js.map +1 -0
  12. package/dist/pg-sqlite-compiler/index.d.ts +12 -0
  13. package/dist/pg-sqlite-compiler/index.d.ts.map +1 -0
  14. package/dist/pg-sqlite-compiler/index.js +59 -0
  15. package/dist/pg-sqlite-compiler/index.js.map +1 -0
  16. package/dist/pg-sqlite-compiler/passes/ast-utils.d.ts +48 -0
  17. package/dist/pg-sqlite-compiler/passes/ast-utils.d.ts.map +1 -0
  18. package/dist/pg-sqlite-compiler/passes/ast-utils.js +93 -0
  19. package/dist/pg-sqlite-compiler/passes/ast-utils.js.map +1 -0
  20. package/dist/pg-sqlite-compiler/passes/catalog.d.ts +34 -0
  21. package/dist/pg-sqlite-compiler/passes/catalog.d.ts.map +1 -0
  22. package/dist/pg-sqlite-compiler/passes/catalog.js +30 -0
  23. package/dist/pg-sqlite-compiler/passes/catalog.js.map +1 -0
  24. package/dist/pg-sqlite-compiler/passes/datetime.d.ts +21 -0
  25. package/dist/pg-sqlite-compiler/passes/datetime.d.ts.map +1 -0
  26. package/dist/pg-sqlite-compiler/passes/datetime.js +53 -0
  27. package/dist/pg-sqlite-compiler/passes/datetime.js.map +1 -0
  28. package/dist/pg-sqlite-compiler/passes/index.d.ts +21 -0
  29. package/dist/pg-sqlite-compiler/passes/index.d.ts.map +1 -0
  30. package/dist/pg-sqlite-compiler/passes/index.js +39 -0
  31. package/dist/pg-sqlite-compiler/passes/index.js.map +1 -0
  32. package/dist/pg-sqlite-compiler/passes/types.d.ts +41 -0
  33. package/dist/pg-sqlite-compiler/passes/types.d.ts.map +1 -0
  34. package/dist/pg-sqlite-compiler/passes/types.js +103 -0
  35. package/dist/pg-sqlite-compiler/passes/types.js.map +1 -0
  36. package/dist/pg-sqlite-compiler/test/oracle.d.ts +34 -0
  37. package/dist/pg-sqlite-compiler/test/oracle.d.ts.map +1 -0
  38. package/dist/pg-sqlite-compiler/test/oracle.js +204 -0
  39. package/dist/pg-sqlite-compiler/test/oracle.js.map +1 -0
  40. package/dist/pg-sqlite-compiler/types.d.ts +55 -0
  41. package/dist/pg-sqlite-compiler/types.d.ts.map +1 -0
  42. package/dist/pg-sqlite-compiler/types.js +2 -0
  43. package/dist/pg-sqlite-compiler/types.js.map +1 -0
  44. package/package.json +8 -4
  45. package/src/admin/admin-data.test.ts +0 -348
  46. package/src/admin/http-proxy.ts +0 -252
  47. package/src/admin/log-store.ts +0 -192
  48. package/src/admin/server.ts +0 -471
  49. package/src/admin/ui.ts +0 -1322
  50. package/src/bench/proxy-throughput.bench.ts +0 -343
  51. package/src/bench/serial-mutations.bench.ts +0 -270
  52. package/src/browser.ts +0 -203
  53. package/src/cf-do/.wrangler/cache/cf.json +0 -1
  54. package/src/cf-do/.wrangler/state/v3/cache/miniflare-CacheObject/metadata.sqlite +0 -0
  55. package/src/cf-do/.wrangler/state/v3/cache/miniflare-CacheObject/metadata.sqlite-shm +0 -0
  56. package/src/cf-do/.wrangler/state/v3/cache/miniflare-CacheObject/metadata.sqlite-wal +0 -0
  57. package/src/cf-do/.wrangler/state/v3/do/zero-do-ZeroDO/0f0f3bdf0abda097eb6f1246db4657d9fc622081362d894d82c1a1ce067b05b6.sqlite +0 -0
  58. package/src/cf-do/.wrangler/state/v3/do/zero-do-ZeroDO/1ddd3a4a48a11b51658444f5458a1fb175194b1d5b6a5bda20ef3fe3205b900c.sqlite +0 -0
  59. package/src/cf-do/.wrangler/state/v3/do/zero-do-ZeroDO/204a39120310d37e972c5914cfd71ad55c151bdb9e8ed289a5f8c5b052dd60e4.sqlite +0 -0
  60. package/src/cf-do/.wrangler/state/v3/do/zero-do-ZeroDO/3835f242df9728adba3d127a238793fd054ed3e51df3f60749ee744c469bf2a2.sqlite +0 -0
  61. package/src/cf-do/.wrangler/state/v3/do/zero-do-ZeroDO/4aa9c80eb716cf55b8995ccf7afab0b36c683e6da07d7c37a3f9c570136036df.sqlite +0 -0
  62. package/src/cf-do/.wrangler/state/v3/do/zero-do-ZeroDO/533e2fd1d6ea46e7a9a0017916ef341802d438d72583462755f2c1f8225e9bf2.sqlite +0 -0
  63. package/src/cf-do/.wrangler/state/v3/do/zero-do-ZeroDO/5ffa1aced1225ecaeac6366f7586aa3de92761cdff8711d81fbd81f248076abd.sqlite +0 -0
  64. package/src/cf-do/.wrangler/state/v3/do/zero-do-ZeroDO/686c3a9f0d7e59ed2ab607efd4b76d779c97cafeb3818380033bf7c7eb86c819.sqlite +0 -0
  65. package/src/cf-do/.wrangler/state/v3/do/zero-do-ZeroDO/6e8214e8dcfadd0deb52d64e5e9ca85c6b329ace11193909845995396914c473.sqlite +0 -0
  66. package/src/cf-do/.wrangler/state/v3/do/zero-do-ZeroDO/78d9ec9ff873d3fe3507ff53c2a6f6dfc408b4268eb0db3f2a146c0678965366.sqlite +0 -0
  67. package/src/cf-do/.wrangler/state/v3/do/zero-do-ZeroDO/7eff9f0ed7e27ad0d3f9d923de0682fab1928591172c1ba336c5f79a134a5d85.sqlite +0 -0
  68. package/src/cf-do/.wrangler/state/v3/do/zero-do-ZeroDO/836cda5b995b25867d722ed4f4c2292167e80351a3c6038db626648eb247dd8b.sqlite +0 -0
  69. package/src/cf-do/.wrangler/state/v3/do/zero-do-ZeroDO/91ef63b112209ab30172763acd8a0935106c248f7f1bcae5545ce37a9f201551.sqlite +0 -0
  70. package/src/cf-do/.wrangler/state/v3/do/zero-do-ZeroDO/a66ea4293a5f5938bc6d116edfa2522bb85bc37aea3541fbc09c3b613b9b32c0.sqlite +0 -0
  71. package/src/cf-do/.wrangler/state/v3/do/zero-do-ZeroDO/ceb2ab26b80590840b65651deb6e948d3bf81565c6751f3a58752cf4bf4aecae.sqlite +0 -0
  72. package/src/cf-do/.wrangler/state/v3/do/zero-do-ZeroDO/metadata.sqlite +0 -0
  73. package/src/cf-do/.wrangler/state/v3/do/zero-do-ZeroDO/metadata.sqlite-shm +0 -0
  74. package/src/cf-do/.wrangler/state/v3/do/zero-do-ZeroDO/metadata.sqlite-wal +0 -0
  75. package/src/cf-do/ARCHITECTURE.md +0 -83
  76. package/src/cf-do/watermark.test.ts +0 -103
  77. package/src/cf-do/watermark.ts +0 -118
  78. package/src/cf-do/worker.ts +0 -1033
  79. package/src/cf-do/wrangler.toml +0 -11
  80. package/src/cf-pglite/README.md +0 -19
  81. package/src/change-tracking.ts +0 -25
  82. package/src/child-process.test.ts +0 -147
  83. package/src/child-process.ts +0 -90
  84. package/src/cli-entry.ts +0 -72
  85. package/src/cli.test.ts +0 -38
  86. package/src/cli.ts +0 -1214
  87. package/src/config.ts +0 -150
  88. package/src/do-sql-tracking.test.ts +0 -19
  89. package/src/do-sql-tracking.ts +0 -19
  90. package/src/index.ts +0 -1215
  91. package/src/integration/integration.test.ts +0 -517
  92. package/src/integration/native-binary.guard.test.ts +0 -13
  93. package/src/integration/native-startup.test.ts +0 -44
  94. package/src/integration/replication-latency.test.ts +0 -428
  95. package/src/integration/restore-live-stress.test.ts +0 -433
  96. package/src/integration/restore-reset.test.ts +0 -400
  97. package/src/integration/restore.test.ts +0 -274
  98. package/src/integration/test-permissions.ts +0 -147
  99. package/src/load-config.ts +0 -46
  100. package/src/log.ts +0 -96
  101. package/src/mutex.ts +0 -47
  102. package/src/pg-proxy-browser.singledb.test.ts +0 -233
  103. package/src/pg-proxy-browser.ts +0 -2022
  104. package/src/pg-proxy-do-backend.test.ts +0 -3890
  105. package/src/pg-proxy-do-backend.ts +0 -7157
  106. package/src/pg-proxy.ts +0 -1087
  107. package/src/pglite-ipc.test.ts +0 -116
  108. package/src/pglite-ipc.ts +0 -266
  109. package/src/pglite-manager.ts +0 -557
  110. package/src/pglite-web-proxy.test.ts +0 -57
  111. package/src/pglite-web-proxy.ts +0 -221
  112. package/src/pglite-web-worker.ts +0 -152
  113. package/src/pglite-worker-thread.ts +0 -253
  114. package/src/port.ts +0 -25
  115. package/src/process-title.ts +0 -9
  116. package/src/recovery.ts +0 -155
  117. package/src/replication/change-tracker.test.ts +0 -357
  118. package/src/replication/change-tracker.ts +0 -279
  119. package/src/replication/handler.test.ts +0 -511
  120. package/src/replication/handler.ts +0 -1190
  121. package/src/replication/pgoutput-encoder.test.ts +0 -697
  122. package/src/replication/pgoutput-encoder.ts +0 -373
  123. package/src/replication/tcp-replication.test.ts +0 -876
  124. package/src/replication/zero-compat.test.ts +0 -1150
  125. package/src/restore-stress.test.ts +0 -188
  126. package/src/s3-local.ts +0 -203
  127. package/src/shim/hooks.mjs +0 -120
  128. package/src/shim/register.mjs +0 -4
  129. package/src/sqlite-mode/apply-mode.ts +0 -224
  130. package/src/sqlite-mode/index.ts +0 -15
  131. package/src/sqlite-mode/native-binary.ts +0 -89
  132. package/src/sqlite-mode/package-resolve.ts +0 -17
  133. package/src/sqlite-mode/resolve-mode.ts +0 -80
  134. package/src/sqlite-mode/shim-template.ts +0 -159
  135. package/src/sqlite-mode/sqlite-mode.test.ts +0 -427
  136. package/src/sqlite-mode/types.ts +0 -30
  137. package/src/vite-plugin.ts +0 -67
  138. package/src/wasm-sqlite.test.ts +0 -537
  139. package/src/worker/browser-admin.ts +0 -52
  140. package/src/worker/browser-build-config.test.ts +0 -71
  141. package/src/worker/browser-build-config.ts +0 -109
  142. package/src/worker/browser-embed-admin.test.ts +0 -75
  143. package/src/worker/browser-embed.ts +0 -345
  144. package/src/worker/cf-patches.ts +0 -384
  145. package/src/worker/embed-integration.test.ts +0 -321
  146. package/src/worker/index.ts +0 -138
  147. package/src/worker/shims/fastify.test.ts +0 -255
  148. package/src/worker/shims/fastify.ts +0 -306
  149. package/src/worker/shims/http-service.test.ts +0 -355
  150. package/src/worker/shims/http-service.ts +0 -293
  151. package/src/worker/shims/node-stub.ts +0 -290
  152. package/src/worker/shims/oxfmt.ts +0 -3
  153. package/src/worker/shims/postgres-browser.ts +0 -59
  154. package/src/worker/shims/postgres-socket.test.ts +0 -576
  155. package/src/worker/shims/postgres-socket.ts +0 -310
  156. package/src/worker/shims/postgres.test.ts +0 -364
  157. package/src/worker/shims/postgres.ts +0 -1454
  158. package/src/worker/shims/sqlite-browser.test.ts +0 -233
  159. package/src/worker/shims/sqlite-browser.ts +0 -175
  160. package/src/worker/shims/sqlite.test.ts +0 -786
  161. package/src/worker/shims/sqlite.ts +0 -978
  162. package/src/worker/shims/stream-browser.ts +0 -15
  163. package/src/worker/shims/ws-browser.test.ts +0 -205
  164. package/src/worker/shims/ws-browser.ts +0 -248
  165. package/src/worker/shims/ws.test.ts +0 -288
  166. package/src/worker/shims/ws.ts +0 -467
  167. package/src/worker/shims/zero-process-env.ts +0 -11
  168. package/src/worker/types.ts +0 -75
  169. package/src/worker/worker-integration.test.ts +0 -223
  170. package/src/worker/worker.test.ts +0 -136
  171. package/src/worker/zero-cache-embed-cf.ts +0 -463
  172. package/src/worker/zero-cache-embed.ts +0 -277
@@ -1,277 +0,0 @@
1
- /**
2
- * zero-cache embedded runner.
3
- *
4
- * runs zero-cache in-process with SINGLE_PROCESS=1 instead of spawning
5
- * a child process. uses the same TCP proxy approach as startZeroLite()
6
- * for database connectivity — zero-cache connects to PGlite via the proxy.
7
- *
8
- * two modes:
9
- *
10
- * 1. **development** (this file): zero-cache uses real postgres package
11
- * to connect to PGlite via TCP proxy. no bundler aliases needed.
12
- *
13
- * 2. **CF Workers** (future): bundler aliases swap postgres/sqlite3 for
14
- * our shims. no TCP proxy, no port binding, all in-process.
15
- *
16
- * env vars:
17
- * SINGLE_PROCESS=1 — all workers in-process via EventEmitter
18
- * ZERO_UPSTREAM_DB — postgres connection string (to TCP proxy)
19
- * ZERO_CVR_DB — postgres connection string (to TCP proxy)
20
- * ZERO_CHANGE_DB — postgres connection string (to TCP proxy)
21
- * ZERO_REPLICA_FILE — sqlite replica file path
22
- * ZERO_PORT — HTTP port for zero-cache dispatcher
23
- */
24
-
25
- import EventEmitter from 'node:events'
26
- import { resolve } from 'node:path'
27
-
28
- import type { PGlite } from '@electric-sql/pglite'
29
-
30
- export interface ZeroCacheEmbedOptions {
31
- /** PGlite instance (not used directly — zero-cache connects via TCP proxy) */
32
- pglite: PGlite
33
-
34
- /** connection string for the upstream database (postgres://...) */
35
- upstreamDb: string
36
-
37
- /** connection string for the CVR database */
38
- cvrDb: string
39
-
40
- /** connection string for the change database */
41
- changeDb: string
42
-
43
- /** path to the SQLite replica file */
44
- replicaFile: string
45
-
46
- /** port for zero-cache HTTP server (0 = random) */
47
- port?: number
48
-
49
- /** zero app ID (default: 'zero') */
50
- appId?: string
51
-
52
- /** publication names */
53
- publications?: string[]
54
-
55
- /** additional env vars passed to zero-cache */
56
- env?: Record<string, string>
57
-
58
- /** timeout in ms waiting for zero-cache to be ready (default: 60000) */
59
- readyTimeout?: number
60
- }
61
-
62
- export interface ZeroCacheEmbed {
63
- /** the port zero-cache is listening on */
64
- readonly port: number
65
-
66
- /** whether zero-cache is ready to handle requests */
67
- readonly ready: boolean
68
-
69
- /** stop zero-cache and all in-process workers */
70
- stop(): Promise<void>
71
- }
72
-
73
- /**
74
- * start zero-cache in embedded (in-process) mode.
75
- *
76
- * instead of spawning a child process, imports and runs zero-cache's
77
- * runWorker() directly with SINGLE_PROCESS=1. all worker coordination
78
- * happens via EventEmitter IPC channels instead of process.fork().
79
- *
80
- * zero-cache still connects to PGlite via the TCP proxy (same as
81
- * the child process mode), so no bundler aliases are needed.
82
- */
83
- export async function startZeroCacheEmbed(
84
- opts: ZeroCacheEmbedOptions
85
- ): Promise<ZeroCacheEmbed> {
86
- const appId = opts.appId || 'zero'
87
- const publications = opts.publications?.join(',') || `orez_${appId}_public`
88
- const readyTimeout = opts.readyTimeout ?? 60000
89
-
90
- // CRITICAL: set SINGLE_PROCESS on process.env BEFORE importing zero-cache.
91
- // zero-cache's childWorker() and ProcessManager check process.env directly,
92
- // not the env object passed to runWorker(). without this, zero-cache will
93
- // fork() child processes instead of using inProcChannel().
94
- process.env.SINGLE_PROCESS = '1'
95
-
96
- // also set NODE_ENV on process.env — zero-cache's config normalization
97
- // reads process.env.NODE_ENV to decide production vs development mode
98
- const origNodeEnv = process.env.NODE_ENV
99
- process.env.NODE_ENV = 'development'
100
-
101
- // build env for zero-cache. these are passed to runWorker() and also
102
- // propagated to in-process child workers via childWorker().
103
- const env: Record<string, string> = {
104
- // inherit process env for NODE_PATH, PATH, etc.
105
- ...(process.env as Record<string, string>),
106
- // zero-cache config (must come after spread to override)
107
- SINGLE_PROCESS: '1',
108
- NODE_ENV: 'development',
109
- ZERO_UPSTREAM_DB: opts.upstreamDb,
110
- ZERO_CVR_DB: opts.cvrDb,
111
- ZERO_CHANGE_DB: opts.changeDb,
112
- ZERO_REPLICA_FILE: opts.replicaFile,
113
- ZERO_PORT: String(opts.port ?? 0),
114
- ZERO_APP_ID: appId,
115
- ZERO_APP_PUBLICATIONS: publications,
116
- ZERO_LOG_LEVEL: opts.env?.ZERO_LOG_LEVEL || 'info',
117
- ZERO_NUM_SYNC_WORKERS: opts.env?.ZERO_NUM_SYNC_WORKERS || '1',
118
- ZERO_ENABLE_QUERY_PLANNER: 'false',
119
- ...opts.env,
120
- }
121
-
122
- // create a fake parent that zero-cache's runWorker() can communicate with.
123
- // in normal mode, this is the child process object. here it's an EventEmitter.
124
- const parent = new EventEmitter() as EventEmitter & {
125
- send: (msg: unknown) => boolean
126
- kill: (signal?: string) => void
127
- pid: number
128
- }
129
-
130
- // capture messages from zero-cache
131
- const parentMessages: unknown[] = []
132
- const parentEmitter = new EventEmitter()
133
-
134
- parent.send = (message: unknown) => {
135
- parentMessages.push(message)
136
- parentEmitter.emit('message', message)
137
- return true
138
- }
139
- parent.kill = (signal = 'SIGTERM') => {
140
- parent.emit(signal, signal)
141
- }
142
- parent.pid = process.pid
143
-
144
- // wrap parent with onMessageType/onceMessageType helpers that zero-cache expects
145
- const wrappedParent = new Proxy(parent, {
146
- get(target, prop, receiver) {
147
- if (prop === 'onMessageType') {
148
- return (type: string, handler: (msg: unknown) => void) => {
149
- target.on('message', (data: unknown) => {
150
- if (Array.isArray(data) && data.length === 2 && data[0] === type) {
151
- handler(data[1])
152
- }
153
- })
154
- return receiver
155
- }
156
- }
157
- if (prop === 'onceMessageType') {
158
- return (type: string, handler: (msg: unknown) => void) => {
159
- const listener = (data: unknown) => {
160
- if (Array.isArray(data) && data.length === 2 && data[0] === type) {
161
- target.off('message', listener)
162
- handler(data[1])
163
- }
164
- }
165
- target.on('message', listener)
166
- return receiver
167
- }
168
- }
169
- return Reflect.get(target, prop, receiver)
170
- },
171
- })
172
-
173
- // import and start zero-cache's runner
174
- let runWorkerFn: (parent: unknown, env: Record<string, string>) => Promise<void>
175
- try {
176
- // @rocicorp/zero's package.json exports don't expose internal modules,
177
- // so we resolve the full filesystem path and import directly.
178
- const { createRequire } = await import('node:module')
179
- const require = createRequire(import.meta.url)
180
- const zeroEntry = require.resolve('@rocicorp/zero')
181
- const runWorkerPath = zeroEntry.replace(
182
- /\/out\/.*$/,
183
- '/out/zero-cache/src/server/runner/run-worker.js'
184
- )
185
- const mod = await (import(runWorkerPath) as Promise<{
186
- runWorker: typeof runWorkerFn
187
- }>)
188
- runWorkerFn = mod.runWorker
189
- } catch (err) {
190
- throw new Error(
191
- `failed to import zero-cache runWorker: ${err}. ` +
192
- 'ensure @rocicorp/zero is installed.'
193
- )
194
- }
195
-
196
- // track state
197
- let isReady = false
198
- let resolvedPort = opts.port ?? 0
199
- let runWorkerPromise: Promise<void> | null = null
200
-
201
- // wait for "ready" message from zero-cache
202
- const readyPromise = new Promise<void>((resolve, reject) => {
203
- const timeout = setTimeout(() => {
204
- reject(
205
- new Error(`zero-cache embed: timed out waiting for ready after ${readyTimeout}ms`)
206
- )
207
- }, readyTimeout)
208
-
209
- parentEmitter.on('message', (msg: unknown) => {
210
- if (Array.isArray(msg) && msg[0] === 'ready') {
211
- clearTimeout(timeout)
212
- isReady = true
213
- resolve()
214
- }
215
- })
216
- })
217
-
218
- // intercept process.exit() — zero-cache's ProcessManager may call it
219
- // during shutdown even in single-process mode (nested ProcessManagers).
220
- // we convert it to a no-op and handle cleanup ourselves.
221
- const origExit = process.exit
222
- process.exit = ((code?: number) => {
223
- // don't actually exit — just emit on parent to trigger cleanup
224
- parent.emit('exit', code ?? 0)
225
- }) as never
226
-
227
- // start runWorker (runs until killed)
228
- runWorkerPromise = runWorkerFn(wrappedParent, env).catch((err) => {
229
- if (!isReady) {
230
- throw err
231
- }
232
- // after ready, errors during shutdown are expected
233
- })
234
-
235
- // wait for zero-cache to be ready
236
- await readyPromise
237
-
238
- // if port was 0, we need to discover the actual port.
239
- // zero-cache logs the address but doesn't expose it programmatically.
240
- // for now, if port=0, the caller needs to discover it themselves.
241
- if (opts.port && opts.port > 0) {
242
- resolvedPort = opts.port
243
- }
244
-
245
- return {
246
- get port() {
247
- return resolvedPort
248
- },
249
-
250
- get ready() {
251
- return isReady
252
- },
253
-
254
- async stop() {
255
- isReady = false
256
- // send SIGTERM to trigger graceful shutdown
257
- wrappedParent.kill('SIGTERM')
258
- // wait for runWorker to finish (with timeout).
259
- // IMPORTANT: do NOT clean up process.env.SINGLE_PROCESS until after
260
- // runWorker completes — the ProcessManager's async exit handler
261
- // checks singleProcessMode() and must find it still set.
262
- if (runWorkerPromise) {
263
- await Promise.race([runWorkerPromise, new Promise((r) => setTimeout(r, 5000))])
264
- }
265
- // give async exit handlers time to complete
266
- await new Promise((r) => setTimeout(r, 200))
267
- // now safe to restore process.exit and process.env
268
- process.exit = origExit
269
- delete process.env.SINGLE_PROCESS
270
- if (origNodeEnv !== undefined) {
271
- process.env.NODE_ENV = origNodeEnv
272
- } else {
273
- delete process.env.NODE_ENV
274
- }
275
- },
276
- }
277
- }