@ricsam/isolate 0.1.5 → 0.1.7

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 (37) hide show
  1. package/README.md +26 -6
  2. package/dist/cjs/internal/async-context/index.cjs +269 -8
  3. package/dist/cjs/internal/async-context/index.cjs.map +3 -3
  4. package/dist/cjs/internal/core/index.cjs +12 -4
  5. package/dist/cjs/internal/core/index.cjs.map +3 -3
  6. package/dist/cjs/internal/fetch/index.cjs +52 -13
  7. package/dist/cjs/internal/fetch/index.cjs.map +3 -3
  8. package/dist/cjs/internal/module-loader/bundle.cjs +111 -35
  9. package/dist/cjs/internal/module-loader/bundle.cjs.map +3 -3
  10. package/dist/cjs/internal/runtime/index.cjs +2 -2
  11. package/dist/cjs/internal/runtime/index.cjs.map +2 -2
  12. package/dist/cjs/internal/server/index.cjs +150 -19
  13. package/dist/cjs/internal/server/index.cjs.map +3 -3
  14. package/dist/cjs/internal/timers/index.cjs +39 -9
  15. package/dist/cjs/internal/timers/index.cjs.map +3 -3
  16. package/dist/cjs/package.json +1 -1
  17. package/dist/cjs/server/app-server.cjs +12 -10
  18. package/dist/cjs/server/app-server.cjs.map +3 -3
  19. package/dist/mjs/internal/async-context/index.mjs +269 -8
  20. package/dist/mjs/internal/async-context/index.mjs.map +3 -3
  21. package/dist/mjs/internal/core/index.mjs +12 -4
  22. package/dist/mjs/internal/core/index.mjs.map +3 -3
  23. package/dist/mjs/internal/fetch/index.mjs +52 -13
  24. package/dist/mjs/internal/fetch/index.mjs.map +3 -3
  25. package/dist/mjs/internal/module-loader/bundle.mjs +111 -35
  26. package/dist/mjs/internal/module-loader/bundle.mjs.map +3 -3
  27. package/dist/mjs/internal/runtime/index.mjs +2 -2
  28. package/dist/mjs/internal/runtime/index.mjs.map +2 -2
  29. package/dist/mjs/internal/server/index.mjs +150 -19
  30. package/dist/mjs/internal/server/index.mjs.map +3 -3
  31. package/dist/mjs/internal/timers/index.mjs +39 -9
  32. package/dist/mjs/internal/timers/index.mjs.map +3 -3
  33. package/dist/mjs/package.json +1 -1
  34. package/dist/mjs/server/app-server.mjs +12 -10
  35. package/dist/mjs/server/app-server.mjs.map +3 -3
  36. package/dist/types/internal/server/index.d.ts +7 -2
  37. package/package.json +2 -2
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/internal/server/index.ts"],
4
4
  "sourcesContent": [
5
- "import type {\n DaemonConnection,\n DispatchOptions,\n RemoteRuntime,\n RuntimeOptions,\n UpgradeRequest,\n WebSocketCommand,\n} from \"../client/index.cjs\";\nimport { isBenignDisposeError } from \"../client/index.cjs\";\n\nconst LINKER_CONFLICT_ERROR = \"Module is currently being linked by another linker\";\n\nfunction isLinkerConflictError(error: unknown): boolean {\n const message = error instanceof Error ? error.message : String(error ?? \"\");\n return message.includes(LINKER_CONFLICT_ERROR);\n}\n\nexport interface IsolateServerOptions {\n namespaceId: string;\n getConnection: () => Promise<DaemonConnection>;\n}\n\nexport interface IsolateServerStartOptions {\n runtimeOptions: RuntimeOptions;\n entry: string;\n entryFilename?: string;\n onWebSocketCommand?: (cmd: WebSocketCommand) => void;\n}\n\nexport interface IsolateServerFetch {\n dispatchRequest(request: Request, options?: DispatchOptions): Promise<Response>;\n getUpgradeRequest(): Promise<UpgradeRequest | null>;\n dispatchWebSocketOpen(connectionId: string): Promise<void>;\n dispatchWebSocketMessage(connectionId: string, message: string | ArrayBuffer): Promise<void>;\n dispatchWebSocketClose(connectionId: string, code: number, reason: string): Promise<void>;\n dispatchWebSocketError(connectionId: string, error: Error): Promise<void>;\n hasServeHandler(): Promise<boolean>;\n hasActiveConnections(): Promise<boolean>;\n}\n\nexport class IsolateServer {\n private readonly namespaceId: string;\n private readonly getConnection: () => Promise<DaemonConnection>;\n private runtime: RemoteRuntime | null = null;\n private lastStartOptions: IsolateServerStartOptions | null = null;\n private lifecycleLock: Promise<void> = Promise.resolve();\n private closed = true;\n\n readonly fetch: IsolateServerFetch = {\n dispatchRequest: (request, options) => this.dispatchRequestWithRetry(request, options),\n getUpgradeRequest: async () => {\n const runtime = await this.getActiveRuntime();\n return runtime.fetch.getUpgradeRequest();\n },\n dispatchWebSocketOpen: async (connectionId) => {\n const runtime = await this.getActiveRuntime();\n await runtime.fetch.dispatchWebSocketOpen(connectionId);\n },\n dispatchWebSocketMessage: async (connectionId, message) => {\n const runtime = await this.getActiveRuntime();\n await runtime.fetch.dispatchWebSocketMessage(connectionId, message);\n },\n dispatchWebSocketClose: async (connectionId, code, reason) => {\n const runtime = await this.getActiveRuntime();\n await runtime.fetch.dispatchWebSocketClose(connectionId, code, reason);\n },\n dispatchWebSocketError: async (connectionId, error) => {\n const runtime = await this.getActiveRuntime();\n await runtime.fetch.dispatchWebSocketError(connectionId, error);\n },\n hasServeHandler: async () => {\n const runtime = await this.getActiveRuntime();\n return runtime.fetch.hasServeHandler();\n },\n hasActiveConnections: async () => {\n const runtime = await this.getActiveRuntime();\n return runtime.fetch.hasActiveConnections();\n },\n };\n\n constructor(options: IsolateServerOptions) {\n this.namespaceId = options.namespaceId;\n this.getConnection = options.getConnection;\n }\n\n async start(options: IsolateServerStartOptions): Promise<void> {\n this.lastStartOptions = options;\n this.closed = false;\n\n await this.withLifecycleLock(async () => {\n if (this.runtime) {\n return;\n }\n\n this.runtime = await this.createAndInitializeRuntime(options);\n });\n }\n\n async reload(): Promise<void> {\n const startOptions = this.lastStartOptions;\n if (!startOptions) {\n throw new Error(\"Server not configured. Call start() first.\");\n }\n\n this.closed = false;\n await this.withLifecycleLock(async () => {\n if (this.runtime) {\n const runtime = this.runtime;\n this.runtime = null;\n await this.disposeRuntime(runtime, {\n hard: true,\n reason: \"IsolateServer.reload()\",\n });\n }\n\n this.runtime = await this.createAndInitializeRuntime(startOptions);\n });\n }\n\n async close(): Promise<void> {\n await this.withLifecycleLock(async () => {\n if (this.runtime) {\n const runtime = this.runtime;\n this.runtime = null;\n await this.disposeRuntime(runtime);\n }\n\n this.closed = true;\n });\n }\n\n getRuntime(): RemoteRuntime | null {\n return this.runtime;\n }\n\n private async withLifecycleLock<T>(operation: () => Promise<T>): Promise<T> {\n const previous = this.lifecycleLock;\n let release!: () => void;\n this.lifecycleLock = new Promise<void>((resolve) => {\n release = resolve;\n });\n\n await previous;\n try {\n return await operation();\n } finally {\n release();\n }\n }\n\n private buildRuntimeOptions(options: IsolateServerStartOptions): RuntimeOptions {\n if (options.onWebSocketCommand) {\n return {\n ...options.runtimeOptions,\n onWebSocketCommand: options.onWebSocketCommand,\n };\n }\n\n return options.runtimeOptions;\n }\n\n private async createAndInitializeRuntime(\n options: IsolateServerStartOptions,\n allowRetry: boolean = true\n ): Promise<RemoteRuntime> {\n const connection = await this.getConnection();\n const namespace = connection.createNamespace(this.namespaceId);\n const runtimeOptions = this.buildRuntimeOptions(options);\n const runtime = await namespace.createRuntime(runtimeOptions);\n\n try {\n await runtime.eval(\n `import ${JSON.stringify(options.entry)};`,\n options.entryFilename ?? \"/isolate_server_entry.js\"\n );\n return runtime;\n } catch (error) {\n await this.disposeRuntime(runtime);\n if (!allowRetry || !isLinkerConflictError(error)) {\n throw error;\n }\n\n const retryRuntime = await namespace.createRuntime(runtimeOptions);\n try {\n await retryRuntime.eval(\n `import ${JSON.stringify(options.entry)};`,\n options.entryFilename ?? \"/isolate_server_entry.js\"\n );\n return retryRuntime;\n } catch (retryError) {\n await this.disposeRuntime(retryRuntime);\n throw retryError;\n }\n }\n }\n\n private async disposeRuntime(\n runtime: RemoteRuntime,\n options?: { hard?: boolean; reason?: string }\n ): Promise<void> {\n try {\n await runtime.dispose(options);\n } catch (error) {\n if (!isBenignDisposeError(error)) {\n throw error;\n }\n }\n }\n\n private async ensureStarted(): Promise<void> {\n if (this.runtime) {\n return;\n }\n\n if (!this.lastStartOptions) {\n throw new Error(\"Server not configured. Call start() first.\");\n }\n\n if (this.closed) {\n this.closed = false;\n }\n\n await this.start(this.lastStartOptions);\n }\n\n private async getActiveRuntime(): Promise<RemoteRuntime> {\n await this.ensureStarted();\n if (!this.runtime) {\n throw new Error(\"Server runtime failed to start.\");\n }\n return this.runtime;\n }\n\n private async dispatchRequestWithRetry(\n request: Request,\n options?: DispatchOptions\n ): Promise<Response> {\n const runtime = await this.getActiveRuntime();\n try {\n return await runtime.fetch.dispatchRequest(request, options);\n } catch (error) {\n if (!isLinkerConflictError(error)) {\n throw error;\n }\n\n await this.reload();\n const retryRuntime = await this.getActiveRuntime();\n return retryRuntime.fetch.dispatchRequest(request, options);\n }\n }\n}\n"
5
+ "import type {\n DaemonConnection,\n DispatchOptions,\n RemoteRuntime,\n RuntimeOptions,\n UpgradeRequest,\n WebSocketCommand,\n} from \"../client/index.cjs\";\nimport { isBenignDisposeError } from \"../client/index.cjs\";\n\nconst LINKER_CONFLICT_ERROR = \"Module is currently being linked by another linker\";\n\nfunction isLinkerConflictError(error: unknown): boolean {\n const message = error instanceof Error ? error.message : String(error ?? \"\");\n return message.includes(LINKER_CONFLICT_ERROR);\n}\n\nfunction isDisposedRuntimeError(error: unknown): boolean {\n const message = error instanceof Error ? error.message : String(error ?? \"\");\n return /runtime has been disposed|runtime was permanently disposed|runtime was soft-disposed|isolated is disposed/i.test(\n message\n );\n}\n\ntype RuntimeRetirementAction = \"reload\" | \"close\";\n\ninterface RuntimeRetirementRecord {\n runtimeId: string;\n action: RuntimeRetirementAction;\n reason: string;\n hard: boolean;\n at: number;\n activeRequests: number;\n replacementRuntimeId?: string;\n}\n\nfunction formatLifecycleReason(action: string, reason?: string): string {\n const trimmedReason = reason?.trim();\n return trimmedReason ? `${action}(${trimmedReason})` : `${action}()`;\n}\n\nfunction formatLogValue(value: unknown): string {\n if (typeof value === \"string\") {\n return JSON.stringify(value);\n }\n if (typeof value === \"number\" || typeof value === \"boolean\" || value === null) {\n return String(value);\n }\n\n try {\n return JSON.stringify(value);\n } catch {\n return JSON.stringify(String(value));\n }\n}\n\nfunction summarizeRequest(request: Request): string {\n try {\n const url = new URL(request.url);\n return `${request.method} ${url.origin}${url.pathname}${url.search}`;\n } catch {\n return `${request.method} ${request.url}`;\n }\n}\n\nexport interface IsolateServerOptions {\n namespaceId: string;\n getConnection: () => Promise<DaemonConnection>;\n}\n\nexport interface IsolateServerStartOptions {\n runtimeOptions: RuntimeOptions;\n entry: string;\n entryFilename?: string;\n onWebSocketCommand?: (cmd: WebSocketCommand) => void;\n}\n\nexport interface IsolateServerFetch {\n dispatchRequest(request: Request, options?: DispatchOptions): Promise<Response>;\n getUpgradeRequest(): Promise<UpgradeRequest | null>;\n dispatchWebSocketOpen(connectionId: string): Promise<void>;\n dispatchWebSocketMessage(connectionId: string, message: string | ArrayBuffer): Promise<void>;\n dispatchWebSocketClose(connectionId: string, code: number, reason: string): Promise<void>;\n dispatchWebSocketError(connectionId: string, error: Error): Promise<void>;\n hasServeHandler(): Promise<boolean>;\n hasActiveConnections(): Promise<boolean>;\n}\n\nexport class IsolateServer {\n private readonly namespaceId: string;\n private readonly getConnection: () => Promise<DaemonConnection>;\n private runtime: RemoteRuntime | null = null;\n private lastStartOptions: IsolateServerStartOptions | null = null;\n private lifecycleLock: Promise<void> = Promise.resolve();\n private activeRequestCount = 0;\n private lastRuntimeRetirement: RuntimeRetirementRecord | null = null;\n private closed = true;\n\n readonly fetch: IsolateServerFetch = {\n dispatchRequest: (request, options) => this.dispatchRequestWithRetry(request, options),\n getUpgradeRequest: async () => {\n const runtime = await this.getActiveRuntime();\n return runtime.fetch.getUpgradeRequest();\n },\n dispatchWebSocketOpen: async (connectionId) => {\n const runtime = await this.getActiveRuntime();\n await runtime.fetch.dispatchWebSocketOpen(connectionId);\n },\n dispatchWebSocketMessage: async (connectionId, message) => {\n const runtime = await this.getActiveRuntime();\n await runtime.fetch.dispatchWebSocketMessage(connectionId, message);\n },\n dispatchWebSocketClose: async (connectionId, code, reason) => {\n const runtime = await this.getActiveRuntime();\n await runtime.fetch.dispatchWebSocketClose(connectionId, code, reason);\n },\n dispatchWebSocketError: async (connectionId, error) => {\n const runtime = await this.getActiveRuntime();\n await runtime.fetch.dispatchWebSocketError(connectionId, error);\n },\n hasServeHandler: async () => {\n const runtime = await this.getActiveRuntime();\n return runtime.fetch.hasServeHandler();\n },\n hasActiveConnections: async () => {\n const runtime = await this.getActiveRuntime();\n return runtime.fetch.hasActiveConnections();\n },\n };\n\n constructor(options: IsolateServerOptions) {\n this.namespaceId = options.namespaceId;\n this.getConnection = options.getConnection;\n }\n\n async start(options: IsolateServerStartOptions): Promise<void> {\n this.lastStartOptions = options;\n this.closed = false;\n\n await this.withLifecycleLock(async () => {\n if (this.runtime) {\n return;\n }\n\n this.runtime = await this.createAndInitializeRuntime(options);\n });\n }\n\n async reload(reason?: string): Promise<void> {\n const startOptions = this.lastStartOptions;\n if (!startOptions) {\n throw new Error(\"Server not configured. Call start() first.\");\n }\n\n const lifecycleReason = formatLifecycleReason(\"IsolateServer.reload\", reason);\n this.closed = false;\n await this.withLifecycleLock(async () => {\n const previousRuntime = this.runtime;\n this.log(\"reload requested\", {\n namespaceId: this.namespaceId,\n runtimeId: previousRuntime?.id ?? null,\n reason: lifecycleReason,\n activeRequests: this.activeRequestCount,\n });\n\n if (previousRuntime) {\n this.runtime = null;\n this.recordRuntimeRetirement(previousRuntime, \"reload\", lifecycleReason, true);\n await this.disposeRuntime(previousRuntime, {\n hard: true,\n reason: lifecycleReason,\n });\n }\n\n try {\n const nextRuntime = await this.createAndInitializeRuntime(startOptions);\n this.runtime = nextRuntime;\n } catch (error) {\n this.log(\"reload failed\", {\n namespaceId: this.namespaceId,\n previousRuntimeId: previousRuntime?.id ?? null,\n reason: lifecycleReason,\n activeRequests: this.activeRequestCount,\n error: error instanceof Error ? error.message : String(error),\n }, \"warn\");\n throw error;\n }\n\n if (\n previousRuntime &&\n this.lastRuntimeRetirement?.runtimeId === previousRuntime.id &&\n this.lastRuntimeRetirement.action === \"reload\"\n ) {\n this.lastRuntimeRetirement.replacementRuntimeId = this.runtime?.id;\n }\n\n this.log(\"reload completed\", {\n namespaceId: this.namespaceId,\n previousRuntimeId: previousRuntime?.id ?? null,\n runtimeId: this.runtime?.id ?? null,\n reason: lifecycleReason,\n activeRequests: this.activeRequestCount,\n });\n });\n }\n\n async close(reason?: string): Promise<void> {\n const lifecycleReason = formatLifecycleReason(\"IsolateServer.close\", reason);\n await this.withLifecycleLock(async () => {\n const previousRuntime = this.runtime;\n this.log(\"close requested\", {\n namespaceId: this.namespaceId,\n runtimeId: previousRuntime?.id ?? null,\n reason: lifecycleReason,\n activeRequests: this.activeRequestCount,\n });\n\n if (previousRuntime) {\n this.runtime = null;\n this.recordRuntimeRetirement(previousRuntime, \"close\", lifecycleReason, false);\n await this.disposeRuntime(previousRuntime, {\n reason: lifecycleReason,\n });\n }\n\n this.closed = true;\n this.log(\"close completed\", {\n namespaceId: this.namespaceId,\n previousRuntimeId: previousRuntime?.id ?? null,\n reason: lifecycleReason,\n activeRequests: this.activeRequestCount,\n });\n });\n }\n\n getRuntime(): RemoteRuntime | null {\n return this.runtime;\n }\n\n private async withLifecycleLock<T>(operation: () => Promise<T>): Promise<T> {\n const previous = this.lifecycleLock;\n let release!: () => void;\n this.lifecycleLock = new Promise<void>((resolve) => {\n release = resolve;\n });\n\n await previous;\n try {\n return await operation();\n } finally {\n release();\n }\n }\n\n private buildRuntimeOptions(options: IsolateServerStartOptions): RuntimeOptions {\n if (options.onWebSocketCommand) {\n return {\n ...options.runtimeOptions,\n onWebSocketCommand: options.onWebSocketCommand,\n };\n }\n\n return options.runtimeOptions;\n }\n\n private async createAndInitializeRuntime(\n options: IsolateServerStartOptions,\n allowRetry: boolean = true\n ): Promise<RemoteRuntime> {\n const connection = await this.getConnection();\n const namespace = connection.createNamespace(this.namespaceId);\n const runtimeOptions = this.buildRuntimeOptions(options);\n const runtime = await namespace.createRuntime(runtimeOptions);\n\n try {\n await runtime.eval(\n `import ${JSON.stringify(options.entry)};`,\n options.entryFilename ?? \"/isolate_server_entry.js\"\n );\n return runtime;\n } catch (error) {\n await this.disposeRuntime(runtime);\n if (!allowRetry || !isLinkerConflictError(error)) {\n throw error;\n }\n\n const retryRuntime = await namespace.createRuntime(runtimeOptions);\n try {\n await retryRuntime.eval(\n `import ${JSON.stringify(options.entry)};`,\n options.entryFilename ?? \"/isolate_server_entry.js\"\n );\n return retryRuntime;\n } catch (retryError) {\n await this.disposeRuntime(retryRuntime);\n throw retryError;\n }\n }\n }\n\n private async disposeRuntime(\n runtime: RemoteRuntime,\n options?: { hard?: boolean; reason?: string }\n ): Promise<void> {\n try {\n await runtime.dispose(options);\n } catch (error) {\n if (!isBenignDisposeError(error)) {\n throw error;\n }\n }\n }\n\n private async ensureStarted(): Promise<void> {\n if (this.runtime) {\n return;\n }\n\n if (!this.lastStartOptions) {\n throw new Error(\"Server not configured. Call start() first.\");\n }\n\n if (this.closed) {\n this.closed = false;\n }\n\n await this.start(this.lastStartOptions);\n }\n\n private async getActiveRuntime(): Promise<RemoteRuntime> {\n await this.ensureStarted();\n if (!this.runtime) {\n throw new Error(\"Server runtime failed to start.\");\n }\n return this.runtime;\n }\n\n private recordRuntimeRetirement(\n runtime: RemoteRuntime,\n action: RuntimeRetirementAction,\n reason: string,\n hard: boolean\n ): RuntimeRetirementRecord {\n const record: RuntimeRetirementRecord = {\n runtimeId: runtime.id,\n action,\n reason,\n hard,\n at: Date.now(),\n activeRequests: this.activeRequestCount,\n };\n this.lastRuntimeRetirement = record;\n return record;\n }\n\n private getLastRuntimeRetirementLogFields(): Record<string, unknown> {\n if (!this.lastRuntimeRetirement) {\n return {\n lastRetirementAction: \"unknown\",\n };\n }\n\n return {\n lastRetirementAction: this.lastRuntimeRetirement.action,\n lastRetirementReason: this.lastRuntimeRetirement.reason,\n lastRetirementRuntimeId: this.lastRuntimeRetirement.runtimeId,\n lastRetirementHard: this.lastRuntimeRetirement.hard,\n lastRetirementAgeMs: Date.now() - this.lastRuntimeRetirement.at,\n lastRetirementActiveRequests: this.lastRuntimeRetirement.activeRequests,\n lastRetirementReplacementRuntimeId: this.lastRuntimeRetirement.replacementRuntimeId ?? null,\n };\n }\n\n private log(\n message: string,\n fields: Record<string, unknown>,\n level: \"log\" | \"warn\" = \"log\"\n ): void {\n const suffix = Object.entries(fields)\n .filter(([, value]) => value !== undefined)\n .map(([key, value]) => `${key}=${formatLogValue(value)}`)\n .join(\" \");\n\n const logger = level === \"warn\" ? console.warn : console.log;\n logger(`[isolate-server] ${message}${suffix ? `; ${suffix}` : \"\"}`);\n }\n\n private async dispatchRequestWithRetry(\n request: Request,\n options?: DispatchOptions\n ): Promise<Response> {\n this.activeRequestCount += 1;\n try {\n const runtime = await this.getActiveRuntime();\n try {\n return await runtime.fetch.dispatchRequest(request, options);\n } catch (error) {\n if (!isLinkerConflictError(error) && !isDisposedRuntimeError(error)) {\n throw error;\n }\n\n const requestSummary = summarizeRequest(request);\n if (isLinkerConflictError(error)) {\n await this.reload(`request-linker-conflict: ${requestSummary}`);\n } else if (this.runtime?.id === runtime.id) {\n this.runtime = null;\n }\n\n const retryRuntime = await this.getActiveRuntime();\n this.log(\n isLinkerConflictError(error)\n ? \"request recovered after linker conflict\"\n : \"request recovered after disposed runtime\",\n {\n namespaceId: this.namespaceId,\n request: requestSummary,\n requestId: options?.requestId ?? null,\n metadataKeys: Object.keys(options?.metadata ?? {}),\n previousRuntimeId: runtime.id,\n runtimeId: retryRuntime.id,\n activeRequests: this.activeRequestCount,\n error: error instanceof Error ? error.message : String(error),\n ...this.getLastRuntimeRetirementLogFields(),\n },\n \"warn\"\n );\n return retryRuntime.fetch.dispatchRequest(request, options);\n }\n } finally {\n this.activeRequestCount -= 1;\n }\n }\n}\n"
6
6
  ],
7
- "mappings": "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",
8
- "debugId": "92DF47A502A2457564756E2164756E21",
7
+ "mappings": "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",
8
+ "debugId": "7EA2EF999F10580F64756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -119,18 +119,27 @@ async function setupTimers(context) {
119
119
  const timersCode = `
120
120
  (function() {
121
121
  const __timers_callbacks = new Map();
122
- const __wrapAsyncContextCallback = (callback) => (
123
- typeof callback === 'function' && globalThis.AsyncContext?.Snapshot?.wrap
124
- ? globalThis.AsyncContext.Snapshot.wrap(callback)
122
+ const __wrapAsyncContextCallback = (callback, type) => (
123
+ typeof callback === 'function' && globalThis.__isolateAsyncContextInternals?.wrapCallback
124
+ ? globalThis.__isolateAsyncContextInternals.wrapCallback(callback, { type })
125
125
  : callback
126
126
  );
127
+ const __releaseAsyncContextCallback = (callback) => (
128
+ typeof callback === 'function' && globalThis.__isolateAsyncContextInternals?.releaseCallback
129
+ ? globalThis.__isolateAsyncContextInternals.releaseCallback(callback)
130
+ : false
131
+ );
127
132
 
128
133
  globalThis.setTimeout = function(callback, delay, ...args) {
129
134
  if (typeof callback !== 'function') {
130
135
  throw new TypeError('Callback must be a function');
131
136
  }
132
137
  const id = __timers_registerTimeout(delay || 0);
133
- __timers_callbacks.set(id, { callback: __wrapAsyncContextCallback(callback), args });
138
+ __timers_callbacks.set(id, {
139
+ args,
140
+ callback: __wrapAsyncContextCallback(callback, 'Timeout'),
141
+ repeat: false,
142
+ });
134
143
  return id;
135
144
  };
136
145
 
@@ -139,13 +148,21 @@ async function setupTimers(context) {
139
148
  throw new TypeError('Callback must be a function');
140
149
  }
141
150
  const id = __timers_registerInterval(delay || 0);
142
- __timers_callbacks.set(id, { callback: __wrapAsyncContextCallback(callback), args });
151
+ __timers_callbacks.set(id, {
152
+ args,
153
+ callback: __wrapAsyncContextCallback(callback, 'Timeout'),
154
+ repeat: true,
155
+ });
143
156
  return id;
144
157
  };
145
158
 
146
159
  globalThis.clearTimeout = function(id) {
147
160
  __timers_clear(id);
148
- __timers_callbacks.delete(id);
161
+ const entry = __timers_callbacks.get(id);
162
+ if (entry) {
163
+ __releaseAsyncContextCallback(entry.callback);
164
+ __timers_callbacks.delete(id);
165
+ }
149
166
  };
150
167
 
151
168
  globalThis.clearInterval = globalThis.clearTimeout;
@@ -154,18 +171,31 @@ async function setupTimers(context) {
154
171
  globalThis.__timers_execute = function(id) {
155
172
  const entry = __timers_callbacks.get(id);
156
173
  if (entry) {
157
- entry.callback(...entry.args);
174
+ try {
175
+ entry.callback(...entry.args);
176
+ } finally {
177
+ if (!entry.repeat) {
178
+ __releaseAsyncContextCallback(entry.callback);
179
+ }
180
+ }
158
181
  }
159
182
  };
160
183
 
161
184
  // Called by host clearAll() to clear all callbacks
162
185
  globalThis.__timers_clearCallbacks = function() {
186
+ for (const entry of __timers_callbacks.values()) {
187
+ __releaseAsyncContextCallback(entry.callback);
188
+ }
163
189
  __timers_callbacks.clear();
164
190
  };
165
191
 
166
192
  // Called to remove a one-shot timeout callback after execution
167
193
  globalThis.__timers_removeCallback = function(id) {
168
- __timers_callbacks.delete(id);
194
+ const entry = __timers_callbacks.get(id);
195
+ if (entry) {
196
+ __releaseAsyncContextCallback(entry.callback);
197
+ __timers_callbacks.delete(id);
198
+ }
169
199
  };
170
200
  })();
171
201
  `;
@@ -202,4 +232,4 @@ async function setupTimers(context) {
202
232
  };
203
233
  }
204
234
 
205
- //# debugId=7CECFF821A504CE764756E2164756E21
235
+ //# debugId=1F15FD83CCC6783564756E2164756E21
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/internal/timers/index.ts"],
4
4
  "sourcesContent": [
5
- "import ivm from \"@ricsam/isolated-vm\";\n\nexport interface TimersHandle {\n /** Clear all pending timers */\n clearAll(): void;\n /** Dispose the timers handle */\n dispose(): void;\n}\n\nfunction releaseIfSupported(handle: unknown): void {\n const maybeHandle = handle as { release?: () => void };\n if (typeof maybeHandle.release === \"function\") {\n maybeHandle.release();\n }\n}\n\n/**\n * Setup timer APIs in an isolated-vm context\n *\n * Injects setTimeout, setInterval, clearTimeout, clearInterval\n *\n * Uses real time - timers fire automatically based on actual elapsed time.\n *\n * @example\n * const handle = await setupTimers(context);\n * await context.eval(`\n * setTimeout(() => console.log(\"hello\"), 1000);\n * `);\n * // Timer will fire automatically after 1 second\n */\nexport async function setupTimers(\n context: ivm.Context\n): Promise<TimersHandle> {\n let nextTimerId = 1;\n const pendingTimers = new Map<number, NodeJS.Timeout>();\n let disposed = false;\n\n const global = context.global;\n\n // Register timeout on host, return ID\n const registerTimeoutCallback = new ivm.Callback((delay: number) => {\n const id = nextTimerId++;\n const normalizedDelay = Math.max(0, delay || 0);\n\n const handle = setTimeout(() => {\n if (disposed || !pendingTimers.has(id)) return;\n pendingTimers.delete(id);\n try {\n context.evalSync(`__timers_execute(${id})`);\n context.evalSync(`__timers_removeCallback(${id})`);\n } catch {\n // Context may have been disposed\n }\n }, normalizedDelay);\n\n pendingTimers.set(id, handle);\n return id;\n });\n global.setSync(\n \"__timers_registerTimeout\",\n registerTimeoutCallback\n );\n\n // Register interval on host, return ID\n const registerIntervalCallback = new ivm.Callback((delay: number) => {\n const id = nextTimerId++;\n const normalizedDelay = Math.max(0, delay || 0);\n\n const handle = setInterval(() => {\n if (disposed || !pendingTimers.has(id)) return;\n try {\n context.evalSync(`__timers_execute(${id})`);\n } catch {\n // Context may have been disposed\n }\n }, normalizedDelay);\n\n pendingTimers.set(id, handle);\n return id;\n });\n global.setSync(\n \"__timers_registerInterval\",\n registerIntervalCallback\n );\n\n // Clear timer by ID\n const clearTimerCallback = new ivm.Callback((id: number) => {\n const handle = pendingTimers.get(id);\n if (handle) {\n clearTimeout(handle); // works for both timeout and interval\n pendingTimers.delete(id);\n }\n });\n global.setSync(\n \"__timers_clear\",\n clearTimerCallback\n );\n\n // Inject JavaScript timer APIs\n const timersCode = `\n(function() {\n const __timers_callbacks = new Map();\n const __wrapAsyncContextCallback = (callback) => (\n typeof callback === 'function' && globalThis.AsyncContext?.Snapshot?.wrap\n ? globalThis.AsyncContext.Snapshot.wrap(callback)\n : callback\n );\n\n globalThis.setTimeout = function(callback, delay, ...args) {\n if (typeof callback !== 'function') {\n throw new TypeError('Callback must be a function');\n }\n const id = __timers_registerTimeout(delay || 0);\n __timers_callbacks.set(id, { callback: __wrapAsyncContextCallback(callback), args });\n return id;\n };\n\n globalThis.setInterval = function(callback, delay, ...args) {\n if (typeof callback !== 'function') {\n throw new TypeError('Callback must be a function');\n }\n const id = __timers_registerInterval(delay || 0);\n __timers_callbacks.set(id, { callback: __wrapAsyncContextCallback(callback), args });\n return id;\n };\n\n globalThis.clearTimeout = function(id) {\n __timers_clear(id);\n __timers_callbacks.delete(id);\n };\n\n globalThis.clearInterval = globalThis.clearTimeout;\n\n // Called by host to execute a timer callback\n globalThis.__timers_execute = function(id) {\n const entry = __timers_callbacks.get(id);\n if (entry) {\n entry.callback(...entry.args);\n }\n };\n\n // Called by host clearAll() to clear all callbacks\n globalThis.__timers_clearCallbacks = function() {\n __timers_callbacks.clear();\n };\n\n // Called to remove a one-shot timeout callback after execution\n globalThis.__timers_removeCallback = function(id) {\n __timers_callbacks.delete(id);\n };\n})();\n`;\n\n context.evalSync(timersCode);\n\n return {\n clearAll() {\n for (const handle of pendingTimers.values()) {\n clearTimeout(handle);\n }\n pendingTimers.clear();\n try {\n context.evalSync(\"__timers_clearCallbacks()\");\n } catch {\n // Context may have been disposed\n }\n },\n\n dispose() {\n disposed = true;\n for (const handle of pendingTimers.values()) {\n clearTimeout(handle);\n }\n pendingTimers.clear();\n try {\n context.evalSync(\"__timers_clearCallbacks()\");\n } catch {\n // Context may have been disposed\n }\n try {\n releaseIfSupported(registerTimeoutCallback);\n } catch {\n // Ignore repeated dispose races\n }\n try {\n releaseIfSupported(registerIntervalCallback);\n } catch {\n // Ignore repeated dispose races\n }\n try {\n releaseIfSupported(clearTimerCallback);\n } catch {\n // Ignore repeated dispose races\n }\n },\n };\n}\n"
5
+ "import ivm from \"@ricsam/isolated-vm\";\n\nexport interface TimersHandle {\n /** Clear all pending timers */\n clearAll(): void;\n /** Dispose the timers handle */\n dispose(): void;\n}\n\nfunction releaseIfSupported(handle: unknown): void {\n const maybeHandle = handle as { release?: () => void };\n if (typeof maybeHandle.release === \"function\") {\n maybeHandle.release();\n }\n}\n\n/**\n * Setup timer APIs in an isolated-vm context\n *\n * Injects setTimeout, setInterval, clearTimeout, clearInterval\n *\n * Uses real time - timers fire automatically based on actual elapsed time.\n *\n * @example\n * const handle = await setupTimers(context);\n * await context.eval(`\n * setTimeout(() => console.log(\"hello\"), 1000);\n * `);\n * // Timer will fire automatically after 1 second\n */\nexport async function setupTimers(\n context: ivm.Context\n): Promise<TimersHandle> {\n let nextTimerId = 1;\n const pendingTimers = new Map<number, NodeJS.Timeout>();\n let disposed = false;\n\n const global = context.global;\n\n // Register timeout on host, return ID\n const registerTimeoutCallback = new ivm.Callback((delay: number) => {\n const id = nextTimerId++;\n const normalizedDelay = Math.max(0, delay || 0);\n\n const handle = setTimeout(() => {\n if (disposed || !pendingTimers.has(id)) return;\n pendingTimers.delete(id);\n try {\n context.evalSync(`__timers_execute(${id})`);\n context.evalSync(`__timers_removeCallback(${id})`);\n } catch {\n // Context may have been disposed\n }\n }, normalizedDelay);\n\n pendingTimers.set(id, handle);\n return id;\n });\n global.setSync(\n \"__timers_registerTimeout\",\n registerTimeoutCallback\n );\n\n // Register interval on host, return ID\n const registerIntervalCallback = new ivm.Callback((delay: number) => {\n const id = nextTimerId++;\n const normalizedDelay = Math.max(0, delay || 0);\n\n const handle = setInterval(() => {\n if (disposed || !pendingTimers.has(id)) return;\n try {\n context.evalSync(`__timers_execute(${id})`);\n } catch {\n // Context may have been disposed\n }\n }, normalizedDelay);\n\n pendingTimers.set(id, handle);\n return id;\n });\n global.setSync(\n \"__timers_registerInterval\",\n registerIntervalCallback\n );\n\n // Clear timer by ID\n const clearTimerCallback = new ivm.Callback((id: number) => {\n const handle = pendingTimers.get(id);\n if (handle) {\n clearTimeout(handle); // works for both timeout and interval\n pendingTimers.delete(id);\n }\n });\n global.setSync(\n \"__timers_clear\",\n clearTimerCallback\n );\n\n // Inject JavaScript timer APIs\n const timersCode = `\n(function() {\n const __timers_callbacks = new Map();\n const __wrapAsyncContextCallback = (callback, type) => (\n typeof callback === 'function' && globalThis.__isolateAsyncContextInternals?.wrapCallback\n ? globalThis.__isolateAsyncContextInternals.wrapCallback(callback, { type })\n : callback\n );\n const __releaseAsyncContextCallback = (callback) => (\n typeof callback === 'function' && globalThis.__isolateAsyncContextInternals?.releaseCallback\n ? globalThis.__isolateAsyncContextInternals.releaseCallback(callback)\n : false\n );\n\n globalThis.setTimeout = function(callback, delay, ...args) {\n if (typeof callback !== 'function') {\n throw new TypeError('Callback must be a function');\n }\n const id = __timers_registerTimeout(delay || 0);\n __timers_callbacks.set(id, {\n args,\n callback: __wrapAsyncContextCallback(callback, 'Timeout'),\n repeat: false,\n });\n return id;\n };\n\n globalThis.setInterval = function(callback, delay, ...args) {\n if (typeof callback !== 'function') {\n throw new TypeError('Callback must be a function');\n }\n const id = __timers_registerInterval(delay || 0);\n __timers_callbacks.set(id, {\n args,\n callback: __wrapAsyncContextCallback(callback, 'Timeout'),\n repeat: true,\n });\n return id;\n };\n\n globalThis.clearTimeout = function(id) {\n __timers_clear(id);\n const entry = __timers_callbacks.get(id);\n if (entry) {\n __releaseAsyncContextCallback(entry.callback);\n __timers_callbacks.delete(id);\n }\n };\n\n globalThis.clearInterval = globalThis.clearTimeout;\n\n // Called by host to execute a timer callback\n globalThis.__timers_execute = function(id) {\n const entry = __timers_callbacks.get(id);\n if (entry) {\n try {\n entry.callback(...entry.args);\n } finally {\n if (!entry.repeat) {\n __releaseAsyncContextCallback(entry.callback);\n }\n }\n }\n };\n\n // Called by host clearAll() to clear all callbacks\n globalThis.__timers_clearCallbacks = function() {\n for (const entry of __timers_callbacks.values()) {\n __releaseAsyncContextCallback(entry.callback);\n }\n __timers_callbacks.clear();\n };\n\n // Called to remove a one-shot timeout callback after execution\n globalThis.__timers_removeCallback = function(id) {\n const entry = __timers_callbacks.get(id);\n if (entry) {\n __releaseAsyncContextCallback(entry.callback);\n __timers_callbacks.delete(id);\n }\n };\n})();\n`;\n\n context.evalSync(timersCode);\n\n return {\n clearAll() {\n for (const handle of pendingTimers.values()) {\n clearTimeout(handle);\n }\n pendingTimers.clear();\n try {\n context.evalSync(\"__timers_clearCallbacks()\");\n } catch {\n // Context may have been disposed\n }\n },\n\n dispose() {\n disposed = true;\n for (const handle of pendingTimers.values()) {\n clearTimeout(handle);\n }\n pendingTimers.clear();\n try {\n context.evalSync(\"__timers_clearCallbacks()\");\n } catch {\n // Context may have been disposed\n }\n try {\n releaseIfSupported(registerTimeoutCallback);\n } catch {\n // Ignore repeated dispose races\n }\n try {\n releaseIfSupported(registerIntervalCallback);\n } catch {\n // Ignore repeated dispose races\n }\n try {\n releaseIfSupported(clearTimerCallback);\n } catch {\n // Ignore repeated dispose races\n }\n },\n };\n}\n"
6
6
  ],
7
- "mappings": "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",
8
- "debugId": "7CECFF821A504CE764756E2164756E21",
7
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAgB,IAAhB;AASA,SAAS,kBAAkB,CAAC,QAAuB;AAAA,EACjD,MAAM,cAAc;AAAA,EACpB,IAAI,OAAO,YAAY,YAAY,YAAY;AAAA,IAC7C,YAAY,QAAQ;AAAA,EACtB;AAAA;AAiBF,eAAsB,WAAW,CAC/B,SACuB;AAAA,EACvB,IAAI,cAAc;AAAA,EAClB,MAAM,gBAAgB,IAAI;AAAA,EAC1B,IAAI,WAAW;AAAA,EAEf,MAAM,SAAS,QAAQ;AAAA,EAGvB,MAAM,0BAA0B,IAAI,2BAAI,SAAS,CAAC,UAAkB;AAAA,IAClE,MAAM,KAAK;AAAA,IACX,MAAM,kBAAkB,KAAK,IAAI,GAAG,SAAS,CAAC;AAAA,IAE9C,MAAM,SAAS,WAAW,MAAM;AAAA,MAC9B,IAAI,YAAY,CAAC,cAAc,IAAI,EAAE;AAAA,QAAG;AAAA,MACxC,cAAc,OAAO,EAAE;AAAA,MACvB,IAAI;AAAA,QACF,QAAQ,SAAS,oBAAoB,KAAK;AAAA,QAC1C,QAAQ,SAAS,2BAA2B,KAAK;AAAA,QACjD,MAAM;AAAA,OAGP,eAAe;AAAA,IAElB,cAAc,IAAI,IAAI,MAAM;AAAA,IAC5B,OAAO;AAAA,GACR;AAAA,EACD,OAAO,QACL,4BACA,uBACF;AAAA,EAGA,MAAM,2BAA2B,IAAI,2BAAI,SAAS,CAAC,UAAkB;AAAA,IACnE,MAAM,KAAK;AAAA,IACX,MAAM,kBAAkB,KAAK,IAAI,GAAG,SAAS,CAAC;AAAA,IAE9C,MAAM,SAAS,YAAY,MAAM;AAAA,MAC/B,IAAI,YAAY,CAAC,cAAc,IAAI,EAAE;AAAA,QAAG;AAAA,MACxC,IAAI;AAAA,QACF,QAAQ,SAAS,oBAAoB,KAAK;AAAA,QAC1C,MAAM;AAAA,OAGP,eAAe;AAAA,IAElB,cAAc,IAAI,IAAI,MAAM;AAAA,IAC5B,OAAO;AAAA,GACR;AAAA,EACD,OAAO,QACL,6BACA,wBACF;AAAA,EAGA,MAAM,qBAAqB,IAAI,2BAAI,SAAS,CAAC,OAAe;AAAA,IAC1D,MAAM,SAAS,cAAc,IAAI,EAAE;AAAA,IACnC,IAAI,QAAQ;AAAA,MACV,aAAa,MAAM;AAAA,MACnB,cAAc,OAAO,EAAE;AAAA,IACzB;AAAA,GACD;AAAA,EACD,OAAO,QACL,kBACA,kBACF;AAAA,EAGA,MAAM,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoFnB,QAAQ,SAAS,UAAU;AAAA,EAE3B,OAAO;AAAA,IACL,QAAQ,GAAG;AAAA,MACT,WAAW,UAAU,cAAc,OAAO,GAAG;AAAA,QAC3C,aAAa,MAAM;AAAA,MACrB;AAAA,MACA,cAAc,MAAM;AAAA,MACpB,IAAI;AAAA,QACF,QAAQ,SAAS,2BAA2B;AAAA,QAC5C,MAAM;AAAA;AAAA,IAKV,OAAO,GAAG;AAAA,MACR,WAAW;AAAA,MACX,WAAW,UAAU,cAAc,OAAO,GAAG;AAAA,QAC3C,aAAa,MAAM;AAAA,MACrB;AAAA,MACA,cAAc,MAAM;AAAA,MACpB,IAAI;AAAA,QACF,QAAQ,SAAS,2BAA2B;AAAA,QAC5C,MAAM;AAAA,MAGR,IAAI;AAAA,QACF,mBAAmB,uBAAuB;AAAA,QAC1C,MAAM;AAAA,MAGR,IAAI;AAAA,QACF,mBAAmB,wBAAwB;AAAA,QAC3C,MAAM;AAAA,MAGR,IAAI;AAAA,QACF,mBAAmB,kBAAkB;AAAA,QACrC,MAAM;AAAA;AAAA,EAIZ;AAAA;",
8
+ "debugId": "1F15FD83CCC6783564756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@ricsam/isolate",
3
- "version": "0.1.5",
3
+ "version": "0.1.7",
4
4
  "type": "commonjs"
5
5
  }
@@ -122,11 +122,11 @@ async function createAppServerAdapter(getConnection, options) {
122
122
  await server.fetch.dispatchWebSocketError(connectionId, error);
123
123
  }
124
124
  },
125
- reload: async () => {
125
+ reload: async (reason) => {
126
126
  diagnostics.lifecycleState = "reloading";
127
127
  try {
128
- bindingsAdapter.reset("AppServer.reload()");
129
- await server.reload();
128
+ bindingsAdapter.reset(reason ? `AppServer.reload(${reason})` : "AppServer.reload()");
129
+ await server.reload(reason);
130
130
  runtimeId = server.getRuntime()?.id ?? options.key;
131
131
  } finally {
132
132
  diagnostics.lifecycleState = "idle";
@@ -136,14 +136,16 @@ async function createAppServerAdapter(getConnection, options) {
136
136
  diagnostics.lifecycleState = "disposing";
137
137
  try {
138
138
  if (disposeOptions?.hard) {
139
- bindingsAdapter.reset(disposeOptions?.reason ?? "AppServer.dispose(hard)");
140
- await server.reload();
141
- bindingsAdapter.abort(disposeOptions?.reason ?? "AppServer.dispose(hard)");
142
- await server.close();
139
+ const hardDisposeReason = disposeOptions?.reason ? `AppServer.dispose(hard): ${disposeOptions.reason}` : "AppServer.dispose(hard)";
140
+ bindingsAdapter.reset(hardDisposeReason);
141
+ await server.reload(hardDisposeReason);
142
+ bindingsAdapter.abort(hardDisposeReason);
143
+ await server.close(hardDisposeReason);
143
144
  return;
144
145
  }
145
- bindingsAdapter.abort(disposeOptions?.reason ?? "AppServer.dispose()");
146
- await server.close();
146
+ const disposeReason = disposeOptions?.reason ? `AppServer.dispose(): ${disposeOptions.reason}` : "AppServer.dispose()";
147
+ bindingsAdapter.abort(disposeReason);
148
+ await server.close(disposeReason);
147
149
  } finally {
148
150
  diagnostics.lifecycleState = "idle";
149
151
  }
@@ -155,4 +157,4 @@ async function createAppServerAdapter(getConnection, options) {
155
157
  };
156
158
  }
157
159
 
158
- //# debugId=035A30B7A1437CB364756E2164756E21
160
+ //# debugId=34E29BF0A88C356464756E2164756E21
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../src/server/app-server.ts"],
4
4
  "sourcesContent": [
5
- "import { IsolateServer } from \"../internal/server/index.cjs\";\nimport type { DaemonConnection } from \"../internal/client/index.cjs\";\nimport { createRuntimeDiagnostics } from \"../bridge/diagnostics.cjs\";\nimport { createRuntimeBindingsAdapter } from \"../bridge/runtime-bindings.cjs\";\nimport { withRequestContext } from \"../bridge/request-context.cjs\";\nimport type { AppServer, CreateAppServerOptions, RequestResult } from \"../types.cjs\";\n\nexport async function createAppServerAdapter(\n getConnection: () => Promise<DaemonConnection>,\n options: CreateAppServerOptions,\n): Promise<AppServer> {\n const diagnostics = createRuntimeDiagnostics();\n const server = new IsolateServer({\n namespaceId: options.key,\n getConnection,\n });\n\n let runtimeId = options.key;\n const bindingsAdapter = createRuntimeBindingsAdapter(\n options.bindings,\n () => runtimeId,\n diagnostics,\n );\n await server.start({\n entry: options.entry,\n entryFilename: options.entryFilename,\n runtimeOptions: {\n ...bindingsAdapter.runtimeOptions,\n cwd: options.cwd,\n memoryLimitMB: options.memoryLimitMB,\n executionTimeout: options.executionTimeout,\n testEnvironment: options.features?.tests ?? false,\n },\n onWebSocketCommand: (command) => {\n options.webSockets?.onCommand?.(command);\n },\n });\n runtimeId = server.getRuntime()?.id ?? options.key;\n\n async function handleRequest(request: Request, handleOptions?: { requestId?: string; signal?: AbortSignal; metadata?: Record<string, string> }): Promise<RequestResult> {\n diagnostics.activeRequests += 1;\n diagnostics.lifecycleState = \"active\";\n try {\n return await withRequestContext(\n {\n requestId: handleOptions?.requestId,\n metadata: handleOptions?.metadata,\n signal: handleOptions?.signal ?? request.signal,\n },\n async () => {\n const response = await server.fetch.dispatchRequest(request, {\n signal: handleOptions?.signal,\n requestId: handleOptions?.requestId,\n metadata: handleOptions?.metadata,\n });\n const upgradeRequest = await server.fetch.getUpgradeRequest();\n if (upgradeRequest?.requested) {\n return {\n type: \"websocket\",\n upgradeData: {\n requested: upgradeRequest.requested,\n connectionId: upgradeRequest.connectionId,\n },\n };\n }\n\n return {\n type: \"response\",\n response,\n };\n },\n );\n } catch (error) {\n diagnostics.lastError = error instanceof Error ? error.message : String(error);\n throw error;\n } finally {\n diagnostics.activeRequests -= 1;\n diagnostics.lifecycleState = \"idle\";\n }\n }\n\n return {\n handle: handleRequest,\n ws: {\n open: async (connectionId) => {\n await server.fetch.dispatchWebSocketOpen(connectionId);\n },\n message: async (connectionId, data) => {\n await server.fetch.dispatchWebSocketMessage(connectionId, data);\n },\n close: async (connectionId, code, reason) => {\n await server.fetch.dispatchWebSocketClose(connectionId, code, reason);\n },\n error: async (connectionId, error) => {\n await server.fetch.dispatchWebSocketError(connectionId, error);\n },\n },\n reload: async () => {\n diagnostics.lifecycleState = \"reloading\";\n try {\n bindingsAdapter.reset(\"AppServer.reload()\");\n await server.reload();\n runtimeId = server.getRuntime()?.id ?? options.key;\n } finally {\n diagnostics.lifecycleState = \"idle\";\n }\n },\n dispose: async (disposeOptions) => {\n diagnostics.lifecycleState = \"disposing\";\n try {\n if (disposeOptions?.hard) {\n bindingsAdapter.reset(disposeOptions?.reason ?? \"AppServer.dispose(hard)\");\n await server.reload();\n bindingsAdapter.abort(disposeOptions?.reason ?? \"AppServer.dispose(hard)\");\n await server.close();\n return;\n }\n bindingsAdapter.abort(disposeOptions?.reason ?? \"AppServer.dispose()\");\n await server.close();\n } finally {\n diagnostics.lifecycleState = \"idle\";\n }\n },\n diagnostics: async () => ({\n ...diagnostics,\n reused: server.getRuntime()?.reused,\n }),\n };\n}\n"
5
+ "import { IsolateServer } from \"../internal/server/index.cjs\";\nimport type { DaemonConnection } from \"../internal/client/index.cjs\";\nimport { createRuntimeDiagnostics } from \"../bridge/diagnostics.cjs\";\nimport { createRuntimeBindingsAdapter } from \"../bridge/runtime-bindings.cjs\";\nimport { withRequestContext } from \"../bridge/request-context.cjs\";\nimport type { AppServer, CreateAppServerOptions, RequestResult } from \"../types.cjs\";\n\nexport async function createAppServerAdapter(\n getConnection: () => Promise<DaemonConnection>,\n options: CreateAppServerOptions,\n): Promise<AppServer> {\n const diagnostics = createRuntimeDiagnostics();\n const server = new IsolateServer({\n namespaceId: options.key,\n getConnection,\n });\n\n let runtimeId = options.key;\n const bindingsAdapter = createRuntimeBindingsAdapter(\n options.bindings,\n () => runtimeId,\n diagnostics,\n );\n await server.start({\n entry: options.entry,\n entryFilename: options.entryFilename,\n runtimeOptions: {\n ...bindingsAdapter.runtimeOptions,\n cwd: options.cwd,\n memoryLimitMB: options.memoryLimitMB,\n executionTimeout: options.executionTimeout,\n testEnvironment: options.features?.tests ?? false,\n },\n onWebSocketCommand: (command) => {\n options.webSockets?.onCommand?.(command);\n },\n });\n runtimeId = server.getRuntime()?.id ?? options.key;\n\n async function handleRequest(request: Request, handleOptions?: { requestId?: string; signal?: AbortSignal; metadata?: Record<string, string> }): Promise<RequestResult> {\n diagnostics.activeRequests += 1;\n diagnostics.lifecycleState = \"active\";\n try {\n return await withRequestContext(\n {\n requestId: handleOptions?.requestId,\n metadata: handleOptions?.metadata,\n signal: handleOptions?.signal ?? request.signal,\n },\n async () => {\n const response = await server.fetch.dispatchRequest(request, {\n signal: handleOptions?.signal,\n requestId: handleOptions?.requestId,\n metadata: handleOptions?.metadata,\n });\n const upgradeRequest = await server.fetch.getUpgradeRequest();\n if (upgradeRequest?.requested) {\n return {\n type: \"websocket\",\n upgradeData: {\n requested: upgradeRequest.requested,\n connectionId: upgradeRequest.connectionId,\n },\n };\n }\n\n return {\n type: \"response\",\n response,\n };\n },\n );\n } catch (error) {\n diagnostics.lastError = error instanceof Error ? error.message : String(error);\n throw error;\n } finally {\n diagnostics.activeRequests -= 1;\n diagnostics.lifecycleState = \"idle\";\n }\n }\n\n return {\n handle: handleRequest,\n ws: {\n open: async (connectionId) => {\n await server.fetch.dispatchWebSocketOpen(connectionId);\n },\n message: async (connectionId, data) => {\n await server.fetch.dispatchWebSocketMessage(connectionId, data);\n },\n close: async (connectionId, code, reason) => {\n await server.fetch.dispatchWebSocketClose(connectionId, code, reason);\n },\n error: async (connectionId, error) => {\n await server.fetch.dispatchWebSocketError(connectionId, error);\n },\n },\n reload: async (reason) => {\n diagnostics.lifecycleState = \"reloading\";\n try {\n bindingsAdapter.reset(reason ? `AppServer.reload(${reason})` : \"AppServer.reload()\");\n await server.reload(reason);\n runtimeId = server.getRuntime()?.id ?? options.key;\n } finally {\n diagnostics.lifecycleState = \"idle\";\n }\n },\n dispose: async (disposeOptions) => {\n diagnostics.lifecycleState = \"disposing\";\n try {\n if (disposeOptions?.hard) {\n const hardDisposeReason = disposeOptions?.reason\n ? `AppServer.dispose(hard): ${disposeOptions.reason}`\n : \"AppServer.dispose(hard)\";\n bindingsAdapter.reset(hardDisposeReason);\n await server.reload(hardDisposeReason);\n bindingsAdapter.abort(hardDisposeReason);\n await server.close(hardDisposeReason);\n return;\n }\n const disposeReason = disposeOptions?.reason\n ? `AppServer.dispose(): ${disposeOptions.reason}`\n : \"AppServer.dispose()\";\n bindingsAdapter.abort(disposeReason);\n await server.close(disposeReason);\n } finally {\n diagnostics.lifecycleState = \"idle\";\n }\n },\n diagnostics: async () => ({\n ...diagnostics,\n reused: server.getRuntime()?.reused,\n }),\n };\n}\n"
6
6
  ],
7
- "mappings": "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",
8
- "debugId": "035A30B7A1437CB364756E2164756E21",
7
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAA8B,IAA9B;AAEyC,IAAzC;AAC6C,IAA7C;AACmC,IAAnC;AAGA,eAAsB,sBAAsB,CAC1C,eACA,SACoB;AAAA,EACpB,MAAM,cAAc,4CAAyB;AAAA,EAC7C,MAAM,SAAS,IAAI,4BAAc;AAAA,IAC/B,aAAa,QAAQ;AAAA,IACrB;AAAA,EACF,CAAC;AAAA,EAED,IAAI,YAAY,QAAQ;AAAA,EACxB,MAAM,kBAAkB,qDACtB,QAAQ,UACR,MAAM,WACN,WACF;AAAA,EACA,MAAM,OAAO,MAAM;AAAA,IACjB,OAAO,QAAQ;AAAA,IACf,eAAe,QAAQ;AAAA,IACvB,gBAAgB;AAAA,SACX,gBAAgB;AAAA,MACnB,KAAK,QAAQ;AAAA,MACb,eAAe,QAAQ;AAAA,MACvB,kBAAkB,QAAQ;AAAA,MAC1B,iBAAiB,QAAQ,UAAU,SAAS;AAAA,IAC9C;AAAA,IACA,oBAAoB,CAAC,YAAY;AAAA,MAC/B,QAAQ,YAAY,YAAY,OAAO;AAAA;AAAA,EAE3C,CAAC;AAAA,EACD,YAAY,OAAO,WAAW,GAAG,MAAM,QAAQ;AAAA,EAE/C,eAAe,aAAa,CAAC,SAAkB,eAAyH;AAAA,IACtK,YAAY,kBAAkB;AAAA,IAC9B,YAAY,iBAAiB;AAAA,IAC7B,IAAI;AAAA,MACF,OAAO,MAAM,0CACX;AAAA,QACE,WAAW,eAAe;AAAA,QAC1B,UAAU,eAAe;AAAA,QACzB,QAAQ,eAAe,UAAU,QAAQ;AAAA,MAC3C,GACA,YAAY;AAAA,QACV,MAAM,WAAW,MAAM,OAAO,MAAM,gBAAgB,SAAS;AAAA,UAC3D,QAAQ,eAAe;AAAA,UACvB,WAAW,eAAe;AAAA,UAC1B,UAAU,eAAe;AAAA,QAC3B,CAAC;AAAA,QACD,MAAM,iBAAiB,MAAM,OAAO,MAAM,kBAAkB;AAAA,QAC5D,IAAI,gBAAgB,WAAW;AAAA,UAC7B,OAAO;AAAA,YACL,MAAM;AAAA,YACN,aAAa;AAAA,cACX,WAAW,eAAe;AAAA,cAC1B,cAAc,eAAe;AAAA,YAC/B;AAAA,UACF;AAAA,QACF;AAAA,QAEA,OAAO;AAAA,UACL,MAAM;AAAA,UACN;AAAA,QACF;AAAA,OAEJ;AAAA,MACA,OAAO,OAAO;AAAA,MACd,YAAY,YAAY,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MAC7E,MAAM;AAAA,cACN;AAAA,MACA,YAAY,kBAAkB;AAAA,MAC9B,YAAY,iBAAiB;AAAA;AAAA;AAAA,EAIjC,OAAO;AAAA,IACL,QAAQ;AAAA,IACR,IAAI;AAAA,MACF,MAAM,OAAO,iBAAiB;AAAA,QAC5B,MAAM,OAAO,MAAM,sBAAsB,YAAY;AAAA;AAAA,MAEvD,SAAS,OAAO,cAAc,SAAS;AAAA,QACrC,MAAM,OAAO,MAAM,yBAAyB,cAAc,IAAI;AAAA;AAAA,MAEhE,OAAO,OAAO,cAAc,MAAM,WAAW;AAAA,QAC3C,MAAM,OAAO,MAAM,uBAAuB,cAAc,MAAM,MAAM;AAAA;AAAA,MAEtE,OAAO,OAAO,cAAc,UAAU;AAAA,QACpC,MAAM,OAAO,MAAM,uBAAuB,cAAc,KAAK;AAAA;AAAA,IAEjE;AAAA,IACA,QAAQ,OAAO,WAAW;AAAA,MACxB,YAAY,iBAAiB;AAAA,MAC7B,IAAI;AAAA,QACF,gBAAgB,MAAM,SAAS,oBAAoB,YAAY,oBAAoB;AAAA,QACnF,MAAM,OAAO,OAAO,MAAM;AAAA,QAC1B,YAAY,OAAO,WAAW,GAAG,MAAM,QAAQ;AAAA,gBAC/C;AAAA,QACA,YAAY,iBAAiB;AAAA;AAAA;AAAA,IAGjC,SAAS,OAAO,mBAAmB;AAAA,MACjC,YAAY,iBAAiB;AAAA,MAC7B,IAAI;AAAA,QACF,IAAI,gBAAgB,MAAM;AAAA,UACxB,MAAM,oBAAoB,gBAAgB,SACtC,4BAA4B,eAAe,WAC3C;AAAA,UACJ,gBAAgB,MAAM,iBAAiB;AAAA,UACvC,MAAM,OAAO,OAAO,iBAAiB;AAAA,UACrC,gBAAgB,MAAM,iBAAiB;AAAA,UACvC,MAAM,OAAO,MAAM,iBAAiB;AAAA,UACpC;AAAA,QACF;AAAA,QACA,MAAM,gBAAgB,gBAAgB,SAClC,wBAAwB,eAAe,WACvC;AAAA,QACJ,gBAAgB,MAAM,aAAa;AAAA,QACnC,MAAM,OAAO,MAAM,aAAa;AAAA,gBAChC;AAAA,QACA,YAAY,iBAAiB;AAAA;AAAA;AAAA,IAGjC,aAAa,aAAa;AAAA,SACrB;AAAA,MACH,QAAQ,OAAO,WAAW,GAAG;AAAA,IAC/B;AAAA,EACF;AAAA;",
8
+ "debugId": "34E29BF0A88C356464756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -14,6 +14,7 @@ var ASYNC_CONTEXT_BOOTSTRAP = `
14
14
  || !native
15
15
  || typeof native.getContinuationPreservedEmbedderData !== "function"
16
16
  || typeof native.setContinuationPreservedEmbedderData !== "function"
17
+ || typeof native.setPromiseHooks !== "function"
17
18
  ) {
18
19
  throw new Error(
19
20
  "The installed isolated-vm runtime does not expose async context support. " +
@@ -54,17 +55,259 @@ var ASYNC_CONTEXT_BOOTSTRAP = `
54
55
  enumerable: false,
55
56
  value: true,
56
57
  });
57
- const currentAsyncResource = new AsyncContext.Variable({
58
- name: "isolate.asyncResource",
59
- defaultValue: undefined,
58
+
59
+ const topLevelResource = {};
60
+ const topLevelExecutionState = {
61
+ asyncId: 1,
62
+ triggerAsyncId: 0,
63
+ type: "ROOT",
64
+ resource: topLevelResource,
65
+ destroyed: false,
66
+ };
67
+ const currentExecutionState = new AsyncContext.Variable({
68
+ name: "isolate.executionState",
69
+ defaultValue: topLevelExecutionState,
60
70
  });
61
71
 
62
- const wrapCallback = (callback) => {
72
+ const promiseStateByPromise = new WeakMap();
73
+ const activeHooks = new Map();
74
+ const promiseFrameStack = [];
75
+ const kWrappedState = Symbol("isolate.asyncResourceState");
76
+ const kWrappedDestroy = Symbol("isolate.destroyAsyncResource");
77
+ let nextAsyncId = 2;
78
+ let hookDispatchDepth = 0;
79
+ let promiseHooksEnabled = false;
80
+
81
+ function getCurrentExecutionState() {
82
+ return currentExecutionState.get();
83
+ }
84
+
85
+ function normalizeType(type, fallback) {
86
+ if (typeof type === "string" && type.length > 0) {
87
+ return type;
88
+ }
89
+ return fallback;
90
+ }
91
+
92
+ function normalizeTriggerAsyncId(triggerAsyncId) {
93
+ return Number.isSafeInteger(triggerAsyncId) && triggerAsyncId >= 0
94
+ ? triggerAsyncId
95
+ : undefined;
96
+ }
97
+
98
+ function dispatchHook(name, args) {
99
+ if (hookDispatchDepth > 0 || activeHooks.size === 0) {
100
+ return;
101
+ }
102
+
103
+ hookDispatchDepth++;
104
+ try {
105
+ for (const [hook, callbacks] of Array.from(activeHooks.entries())) {
106
+ const callback = callbacks[name];
107
+ if (typeof callback === "function") {
108
+ Reflect.apply(callback, hook, args);
109
+ }
110
+ }
111
+ } finally {
112
+ hookDispatchDepth--;
113
+ }
114
+ }
115
+
116
+ function createResource(type, resource, options = {}) {
117
+ const normalizedOptions =
118
+ options && typeof options === "object" ? options : {};
119
+ const state = {
120
+ asyncId: nextAsyncId++,
121
+ triggerAsyncId:
122
+ normalizeTriggerAsyncId(normalizedOptions.triggerAsyncId)
123
+ ?? getCurrentExecutionState().asyncId,
124
+ type: normalizeType(type, "isolate.resource"),
125
+ resource:
126
+ resource !== undefined && resource !== null ? resource : {},
127
+ destroyed: false,
128
+ };
129
+
130
+ if (normalizedOptions.emitInit !== false) {
131
+ dispatchHook("init", [
132
+ state.asyncId,
133
+ state.type,
134
+ state.triggerAsyncId,
135
+ state.resource,
136
+ ]);
137
+ }
138
+
139
+ return state;
140
+ }
141
+
142
+ function enterResource(resourceState) {
143
+ return AsyncContextFrame.exchange(
144
+ new AsyncContextFrame(currentExecutionState, resourceState),
145
+ );
146
+ }
147
+
148
+ function destroyResource(resourceState) {
149
+ if (!resourceState || resourceState.destroyed) {
150
+ return false;
151
+ }
152
+ resourceState.destroyed = true;
153
+ dispatchHook("destroy", [resourceState.asyncId]);
154
+ return true;
155
+ }
156
+
157
+ function runWithResource(resourceState, fn, thisArg, args) {
158
+ const priorFrame = enterResource(resourceState);
159
+ let didRunBeforeHook = false;
160
+ try {
161
+ dispatchHook("before", [resourceState.asyncId]);
162
+ didRunBeforeHook = true;
163
+ return Reflect.apply(fn, thisArg, args);
164
+ } finally {
165
+ try {
166
+ if (didRunBeforeHook) {
167
+ dispatchHook("after", [resourceState.asyncId]);
168
+ }
169
+ } finally {
170
+ AsyncContextFrame.set(priorFrame);
171
+ }
172
+ }
173
+ }
174
+
175
+ function wrapCallback(callback, options = {}) {
63
176
  if (typeof callback !== "function") {
64
177
  return callback;
65
178
  }
66
- return AsyncContext.Snapshot.wrap(callback);
67
- };
179
+
180
+ const normalizedOptions =
181
+ options && typeof options === "object" ? options : {};
182
+ const snapshot = new AsyncContext.Snapshot();
183
+ const resourceState = createResource(
184
+ normalizedOptions.type,
185
+ normalizedOptions.resource,
186
+ normalizedOptions,
187
+ );
188
+
189
+ function wrapped(...args) {
190
+ const thisArg = normalizedOptions.thisArg === undefined
191
+ ? this
192
+ : normalizedOptions.thisArg;
193
+ return snapshot.run(
194
+ () => runWithResource(resourceState, callback, thisArg, args),
195
+ );
196
+ }
197
+
198
+ try {
199
+ Object.defineProperty(wrapped, "name", {
200
+ configurable: true,
201
+ value: callback.name ? "wrapped " + callback.name : "wrapped",
202
+ });
203
+ } catch {}
204
+
205
+ Object.defineProperty(wrapped, kWrappedState, {
206
+ configurable: false,
207
+ enumerable: false,
208
+ value: resourceState,
209
+ writable: false,
210
+ });
211
+ Object.defineProperty(wrapped, kWrappedDestroy, {
212
+ configurable: false,
213
+ enumerable: false,
214
+ value: () => destroyResource(resourceState),
215
+ writable: false,
216
+ });
217
+
218
+ return wrapped;
219
+ }
220
+
221
+ function releaseCallback(callback) {
222
+ if (typeof callback !== "function") {
223
+ return false;
224
+ }
225
+ const destroy = callback[kWrappedDestroy];
226
+ if (typeof destroy === "function") {
227
+ return destroy();
228
+ }
229
+ return false;
230
+ }
231
+
232
+ function onPromiseInit(promise, parentPromise) {
233
+ const parentState = (
234
+ parentPromise && typeof parentPromise === "object"
235
+ ? promiseStateByPromise.get(parentPromise)
236
+ : undefined
237
+ );
238
+ const promiseState = createResource("PROMISE", promise, {
239
+ triggerAsyncId: parentState?.asyncId ?? getCurrentExecutionState().asyncId,
240
+ });
241
+ promiseStateByPromise.set(promise, promiseState);
242
+ }
243
+
244
+ function onPromiseBefore(promise) {
245
+ const promiseState = promiseStateByPromise.get(promise);
246
+ if (!promiseState) {
247
+ return;
248
+ }
249
+ const priorFrame = enterResource(promiseState);
250
+ promiseFrameStack.push(priorFrame);
251
+ try {
252
+ dispatchHook("before", [promiseState.asyncId]);
253
+ } catch (error) {
254
+ promiseFrameStack.pop();
255
+ AsyncContextFrame.set(priorFrame);
256
+ throw error;
257
+ }
258
+ }
259
+
260
+ function onPromiseAfter(promise) {
261
+ const promiseState = promiseStateByPromise.get(promise);
262
+ if (!promiseState) {
263
+ return;
264
+ }
265
+ const priorFrame = promiseFrameStack.pop();
266
+ try {
267
+ dispatchHook("after", [promiseState.asyncId]);
268
+ } finally {
269
+ AsyncContextFrame.set(priorFrame);
270
+ }
271
+ }
272
+
273
+ function onPromiseResolve(promise) {
274
+ const promiseState = promiseStateByPromise.get(promise);
275
+ if (!promiseState) {
276
+ return;
277
+ }
278
+ dispatchHook("promiseResolve", [promiseState.asyncId]);
279
+ }
280
+
281
+ function refreshPromiseHooks() {
282
+ if (activeHooks.size > 0) {
283
+ if (!promiseHooksEnabled) {
284
+ native.setPromiseHooks(
285
+ onPromiseInit,
286
+ onPromiseBefore,
287
+ onPromiseAfter,
288
+ onPromiseResolve,
289
+ );
290
+ promiseHooksEnabled = true;
291
+ }
292
+ return;
293
+ }
294
+
295
+ if (promiseHooksEnabled) {
296
+ native.setPromiseHooks(undefined, undefined, undefined, undefined);
297
+ promiseFrameStack.length = 0;
298
+ promiseHooksEnabled = false;
299
+ }
300
+ }
301
+
302
+ function enableHook(hook, callbacks) {
303
+ activeHooks.set(hook, callbacks);
304
+ refreshPromiseHooks();
305
+ }
306
+
307
+ function disableHook(hook) {
308
+ activeHooks.delete(hook);
309
+ refreshPromiseHooks();
310
+ }
68
311
 
69
312
  Object.defineProperty(globalThis, "__isolateAsyncContextInternals", {
70
313
  configurable: true,
@@ -72,8 +315,25 @@ var ASYNC_CONTEXT_BOOTSTRAP = `
72
315
  writable: false,
73
316
  value: {
74
317
  AsyncContextFrame,
75
- currentAsyncResource,
318
+ topLevelExecutionState,
319
+ currentExecutionState,
320
+ getCurrentExecutionState,
321
+ executionAsyncId() {
322
+ return getCurrentExecutionState().asyncId;
323
+ },
324
+ triggerAsyncId() {
325
+ return getCurrentExecutionState().triggerAsyncId;
326
+ },
327
+ executionAsyncResource() {
328
+ return getCurrentExecutionState().resource;
329
+ },
330
+ createResource,
331
+ runWithResource,
332
+ destroyResource,
76
333
  wrapCallback,
334
+ releaseCallback,
335
+ enableHook,
336
+ disableHook,
77
337
  },
78
338
  });
79
339
  })();
@@ -86,6 +346,7 @@ async function setupAsyncContext(context) {
86
346
  && typeof globalThis.__ivmAsyncContextInternal === "object"
87
347
  && typeof globalThis.__ivmAsyncContextInternal?.getContinuationPreservedEmbedderData === "function"
88
348
  && typeof globalThis.__ivmAsyncContextInternal?.setContinuationPreservedEmbedderData === "function"
349
+ && typeof globalThis.__ivmAsyncContextInternal?.setPromiseHooks === "function"
89
350
  `);
90
351
  if (!supported) {
91
352
  throw new Error("The installed isolated-vm runtime does not support AsyncContext. " + "Use the async-context-enabled isolate engine build.");
@@ -97,4 +358,4 @@ export {
97
358
  setupAsyncContext
98
359
  };
99
360
 
100
- //# debugId=ABEE91399587999E64756E2164756E21
361
+ //# debugId=8F09A2B6E55A095964756E2164756E21