@ricsam/isolate 0.1.6 → 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.
- package/dist/cjs/internal/server/index.cjs +150 -19
- package/dist/cjs/internal/server/index.cjs.map +3 -3
- package/dist/cjs/package.json +1 -1
- package/dist/cjs/server/app-server.cjs +12 -10
- package/dist/cjs/server/app-server.cjs.map +3 -3
- package/dist/mjs/internal/server/index.mjs +150 -19
- package/dist/mjs/internal/server/index.mjs.map +3 -3
- package/dist/mjs/package.json +1 -1
- package/dist/mjs/server/app-server.mjs +12 -10
- package/dist/mjs/server/app-server.mjs.map +3 -3
- package/dist/types/internal/server/index.d.ts +7 -2
- package/package.json +1 -1
|
@@ -48,6 +48,35 @@ function isLinkerConflictError(error) {
|
|
|
48
48
|
const message = error instanceof Error ? error.message : String(error ?? "");
|
|
49
49
|
return message.includes(LINKER_CONFLICT_ERROR);
|
|
50
50
|
}
|
|
51
|
+
function isDisposedRuntimeError(error) {
|
|
52
|
+
const message = error instanceof Error ? error.message : String(error ?? "");
|
|
53
|
+
return /runtime has been disposed|runtime was permanently disposed|runtime was soft-disposed|isolated is disposed/i.test(message);
|
|
54
|
+
}
|
|
55
|
+
function formatLifecycleReason(action, reason) {
|
|
56
|
+
const trimmedReason = reason?.trim();
|
|
57
|
+
return trimmedReason ? `${action}(${trimmedReason})` : `${action}()`;
|
|
58
|
+
}
|
|
59
|
+
function formatLogValue(value) {
|
|
60
|
+
if (typeof value === "string") {
|
|
61
|
+
return JSON.stringify(value);
|
|
62
|
+
}
|
|
63
|
+
if (typeof value === "number" || typeof value === "boolean" || value === null) {
|
|
64
|
+
return String(value);
|
|
65
|
+
}
|
|
66
|
+
try {
|
|
67
|
+
return JSON.stringify(value);
|
|
68
|
+
} catch {
|
|
69
|
+
return JSON.stringify(String(value));
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
function summarizeRequest(request) {
|
|
73
|
+
try {
|
|
74
|
+
const url = new URL(request.url);
|
|
75
|
+
return `${request.method} ${url.origin}${url.pathname}${url.search}`;
|
|
76
|
+
} catch {
|
|
77
|
+
return `${request.method} ${request.url}`;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
51
80
|
|
|
52
81
|
class IsolateServer {
|
|
53
82
|
namespaceId;
|
|
@@ -55,6 +84,8 @@ class IsolateServer {
|
|
|
55
84
|
runtime = null;
|
|
56
85
|
lastStartOptions = null;
|
|
57
86
|
lifecycleLock = Promise.resolve();
|
|
87
|
+
activeRequestCount = 0;
|
|
88
|
+
lastRuntimeRetirement = null;
|
|
58
89
|
closed = true;
|
|
59
90
|
fetch = {
|
|
60
91
|
dispatchRequest: (request, options) => this.dispatchRequestWithRetry(request, options),
|
|
@@ -101,32 +132,78 @@ class IsolateServer {
|
|
|
101
132
|
this.runtime = await this.createAndInitializeRuntime(options);
|
|
102
133
|
});
|
|
103
134
|
}
|
|
104
|
-
async reload() {
|
|
135
|
+
async reload(reason) {
|
|
105
136
|
const startOptions = this.lastStartOptions;
|
|
106
137
|
if (!startOptions) {
|
|
107
138
|
throw new Error("Server not configured. Call start() first.");
|
|
108
139
|
}
|
|
140
|
+
const lifecycleReason = formatLifecycleReason("IsolateServer.reload", reason);
|
|
109
141
|
this.closed = false;
|
|
110
142
|
await this.withLifecycleLock(async () => {
|
|
111
|
-
|
|
112
|
-
|
|
143
|
+
const previousRuntime = this.runtime;
|
|
144
|
+
this.log("reload requested", {
|
|
145
|
+
namespaceId: this.namespaceId,
|
|
146
|
+
runtimeId: previousRuntime?.id ?? null,
|
|
147
|
+
reason: lifecycleReason,
|
|
148
|
+
activeRequests: this.activeRequestCount
|
|
149
|
+
});
|
|
150
|
+
if (previousRuntime) {
|
|
113
151
|
this.runtime = null;
|
|
114
|
-
|
|
152
|
+
this.recordRuntimeRetirement(previousRuntime, "reload", lifecycleReason, true);
|
|
153
|
+
await this.disposeRuntime(previousRuntime, {
|
|
115
154
|
hard: true,
|
|
116
|
-
reason:
|
|
155
|
+
reason: lifecycleReason
|
|
117
156
|
});
|
|
118
157
|
}
|
|
119
|
-
|
|
158
|
+
try {
|
|
159
|
+
const nextRuntime = await this.createAndInitializeRuntime(startOptions);
|
|
160
|
+
this.runtime = nextRuntime;
|
|
161
|
+
} catch (error) {
|
|
162
|
+
this.log("reload failed", {
|
|
163
|
+
namespaceId: this.namespaceId,
|
|
164
|
+
previousRuntimeId: previousRuntime?.id ?? null,
|
|
165
|
+
reason: lifecycleReason,
|
|
166
|
+
activeRequests: this.activeRequestCount,
|
|
167
|
+
error: error instanceof Error ? error.message : String(error)
|
|
168
|
+
}, "warn");
|
|
169
|
+
throw error;
|
|
170
|
+
}
|
|
171
|
+
if (previousRuntime && this.lastRuntimeRetirement?.runtimeId === previousRuntime.id && this.lastRuntimeRetirement.action === "reload") {
|
|
172
|
+
this.lastRuntimeRetirement.replacementRuntimeId = this.runtime?.id;
|
|
173
|
+
}
|
|
174
|
+
this.log("reload completed", {
|
|
175
|
+
namespaceId: this.namespaceId,
|
|
176
|
+
previousRuntimeId: previousRuntime?.id ?? null,
|
|
177
|
+
runtimeId: this.runtime?.id ?? null,
|
|
178
|
+
reason: lifecycleReason,
|
|
179
|
+
activeRequests: this.activeRequestCount
|
|
180
|
+
});
|
|
120
181
|
});
|
|
121
182
|
}
|
|
122
|
-
async close() {
|
|
183
|
+
async close(reason) {
|
|
184
|
+
const lifecycleReason = formatLifecycleReason("IsolateServer.close", reason);
|
|
123
185
|
await this.withLifecycleLock(async () => {
|
|
124
|
-
|
|
125
|
-
|
|
186
|
+
const previousRuntime = this.runtime;
|
|
187
|
+
this.log("close requested", {
|
|
188
|
+
namespaceId: this.namespaceId,
|
|
189
|
+
runtimeId: previousRuntime?.id ?? null,
|
|
190
|
+
reason: lifecycleReason,
|
|
191
|
+
activeRequests: this.activeRequestCount
|
|
192
|
+
});
|
|
193
|
+
if (previousRuntime) {
|
|
126
194
|
this.runtime = null;
|
|
127
|
-
|
|
195
|
+
this.recordRuntimeRetirement(previousRuntime, "close", lifecycleReason, false);
|
|
196
|
+
await this.disposeRuntime(previousRuntime, {
|
|
197
|
+
reason: lifecycleReason
|
|
198
|
+
});
|
|
128
199
|
}
|
|
129
200
|
this.closed = true;
|
|
201
|
+
this.log("close completed", {
|
|
202
|
+
namespaceId: this.namespaceId,
|
|
203
|
+
previousRuntimeId: previousRuntime?.id ?? null,
|
|
204
|
+
reason: lifecycleReason,
|
|
205
|
+
activeRequests: this.activeRequestCount
|
|
206
|
+
});
|
|
130
207
|
});
|
|
131
208
|
}
|
|
132
209
|
getRuntime() {
|
|
@@ -205,19 +282,73 @@ class IsolateServer {
|
|
|
205
282
|
}
|
|
206
283
|
return this.runtime;
|
|
207
284
|
}
|
|
285
|
+
recordRuntimeRetirement(runtime, action, reason, hard) {
|
|
286
|
+
const record = {
|
|
287
|
+
runtimeId: runtime.id,
|
|
288
|
+
action,
|
|
289
|
+
reason,
|
|
290
|
+
hard,
|
|
291
|
+
at: Date.now(),
|
|
292
|
+
activeRequests: this.activeRequestCount
|
|
293
|
+
};
|
|
294
|
+
this.lastRuntimeRetirement = record;
|
|
295
|
+
return record;
|
|
296
|
+
}
|
|
297
|
+
getLastRuntimeRetirementLogFields() {
|
|
298
|
+
if (!this.lastRuntimeRetirement) {
|
|
299
|
+
return {
|
|
300
|
+
lastRetirementAction: "unknown"
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
return {
|
|
304
|
+
lastRetirementAction: this.lastRuntimeRetirement.action,
|
|
305
|
+
lastRetirementReason: this.lastRuntimeRetirement.reason,
|
|
306
|
+
lastRetirementRuntimeId: this.lastRuntimeRetirement.runtimeId,
|
|
307
|
+
lastRetirementHard: this.lastRuntimeRetirement.hard,
|
|
308
|
+
lastRetirementAgeMs: Date.now() - this.lastRuntimeRetirement.at,
|
|
309
|
+
lastRetirementActiveRequests: this.lastRuntimeRetirement.activeRequests,
|
|
310
|
+
lastRetirementReplacementRuntimeId: this.lastRuntimeRetirement.replacementRuntimeId ?? null
|
|
311
|
+
};
|
|
312
|
+
}
|
|
313
|
+
log(message, fields, level = "log") {
|
|
314
|
+
const suffix = Object.entries(fields).filter(([, value]) => value !== undefined).map(([key, value]) => `${key}=${formatLogValue(value)}`).join(" ");
|
|
315
|
+
const logger = level === "warn" ? console.warn : console.log;
|
|
316
|
+
logger(`[isolate-server] ${message}${suffix ? `; ${suffix}` : ""}`);
|
|
317
|
+
}
|
|
208
318
|
async dispatchRequestWithRetry(request, options) {
|
|
209
|
-
|
|
319
|
+
this.activeRequestCount += 1;
|
|
210
320
|
try {
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
321
|
+
const runtime = await this.getActiveRuntime();
|
|
322
|
+
try {
|
|
323
|
+
return await runtime.fetch.dispatchRequest(request, options);
|
|
324
|
+
} catch (error) {
|
|
325
|
+
if (!isLinkerConflictError(error) && !isDisposedRuntimeError(error)) {
|
|
326
|
+
throw error;
|
|
327
|
+
}
|
|
328
|
+
const requestSummary = summarizeRequest(request);
|
|
329
|
+
if (isLinkerConflictError(error)) {
|
|
330
|
+
await this.reload(`request-linker-conflict: ${requestSummary}`);
|
|
331
|
+
} else if (this.runtime?.id === runtime.id) {
|
|
332
|
+
this.runtime = null;
|
|
333
|
+
}
|
|
334
|
+
const retryRuntime = await this.getActiveRuntime();
|
|
335
|
+
this.log(isLinkerConflictError(error) ? "request recovered after linker conflict" : "request recovered after disposed runtime", {
|
|
336
|
+
namespaceId: this.namespaceId,
|
|
337
|
+
request: requestSummary,
|
|
338
|
+
requestId: options?.requestId ?? null,
|
|
339
|
+
metadataKeys: Object.keys(options?.metadata ?? {}),
|
|
340
|
+
previousRuntimeId: runtime.id,
|
|
341
|
+
runtimeId: retryRuntime.id,
|
|
342
|
+
activeRequests: this.activeRequestCount,
|
|
343
|
+
error: error instanceof Error ? error.message : String(error),
|
|
344
|
+
...this.getLastRuntimeRetirementLogFields()
|
|
345
|
+
}, "warn");
|
|
346
|
+
return retryRuntime.fetch.dispatchRequest(request, options);
|
|
215
347
|
}
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
return retryRuntime.fetch.dispatchRequest(request, options);
|
|
348
|
+
} finally {
|
|
349
|
+
this.activeRequestCount -= 1;
|
|
219
350
|
}
|
|
220
351
|
}
|
|
221
352
|
}
|
|
222
353
|
|
|
223
|
-
//# debugId=
|
|
354
|
+
//# debugId=7EA2EF999F10580F64756E2164756E21
|
|
@@ -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": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQqC,IAArC;AAEA,IAAM,wBAAwB;AAE9B,SAAS,qBAAqB,CAAC,OAAyB;AAAA,EACtD,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,SAAS,EAAE;AAAA,EAC3E,OAAO,QAAQ,SAAS,qBAAqB;AAAA;AAAA;
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "7EA2EF999F10580F64756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
package/dist/cjs/package.json
CHANGED
|
@@ -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
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
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
|
-
|
|
146
|
-
|
|
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=
|
|
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
|
|
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": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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,
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "34E29BF0A88C356464756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
|
@@ -5,6 +5,35 @@ function isLinkerConflictError(error) {
|
|
|
5
5
|
const message = error instanceof Error ? error.message : String(error ?? "");
|
|
6
6
|
return message.includes(LINKER_CONFLICT_ERROR);
|
|
7
7
|
}
|
|
8
|
+
function isDisposedRuntimeError(error) {
|
|
9
|
+
const message = error instanceof Error ? error.message : String(error ?? "");
|
|
10
|
+
return /runtime has been disposed|runtime was permanently disposed|runtime was soft-disposed|isolated is disposed/i.test(message);
|
|
11
|
+
}
|
|
12
|
+
function formatLifecycleReason(action, reason) {
|
|
13
|
+
const trimmedReason = reason?.trim();
|
|
14
|
+
return trimmedReason ? `${action}(${trimmedReason})` : `${action}()`;
|
|
15
|
+
}
|
|
16
|
+
function formatLogValue(value) {
|
|
17
|
+
if (typeof value === "string") {
|
|
18
|
+
return JSON.stringify(value);
|
|
19
|
+
}
|
|
20
|
+
if (typeof value === "number" || typeof value === "boolean" || value === null) {
|
|
21
|
+
return String(value);
|
|
22
|
+
}
|
|
23
|
+
try {
|
|
24
|
+
return JSON.stringify(value);
|
|
25
|
+
} catch {
|
|
26
|
+
return JSON.stringify(String(value));
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
function summarizeRequest(request) {
|
|
30
|
+
try {
|
|
31
|
+
const url = new URL(request.url);
|
|
32
|
+
return `${request.method} ${url.origin}${url.pathname}${url.search}`;
|
|
33
|
+
} catch {
|
|
34
|
+
return `${request.method} ${request.url}`;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
8
37
|
|
|
9
38
|
class IsolateServer {
|
|
10
39
|
namespaceId;
|
|
@@ -12,6 +41,8 @@ class IsolateServer {
|
|
|
12
41
|
runtime = null;
|
|
13
42
|
lastStartOptions = null;
|
|
14
43
|
lifecycleLock = Promise.resolve();
|
|
44
|
+
activeRequestCount = 0;
|
|
45
|
+
lastRuntimeRetirement = null;
|
|
15
46
|
closed = true;
|
|
16
47
|
fetch = {
|
|
17
48
|
dispatchRequest: (request, options) => this.dispatchRequestWithRetry(request, options),
|
|
@@ -58,32 +89,78 @@ class IsolateServer {
|
|
|
58
89
|
this.runtime = await this.createAndInitializeRuntime(options);
|
|
59
90
|
});
|
|
60
91
|
}
|
|
61
|
-
async reload() {
|
|
92
|
+
async reload(reason) {
|
|
62
93
|
const startOptions = this.lastStartOptions;
|
|
63
94
|
if (!startOptions) {
|
|
64
95
|
throw new Error("Server not configured. Call start() first.");
|
|
65
96
|
}
|
|
97
|
+
const lifecycleReason = formatLifecycleReason("IsolateServer.reload", reason);
|
|
66
98
|
this.closed = false;
|
|
67
99
|
await this.withLifecycleLock(async () => {
|
|
68
|
-
|
|
69
|
-
|
|
100
|
+
const previousRuntime = this.runtime;
|
|
101
|
+
this.log("reload requested", {
|
|
102
|
+
namespaceId: this.namespaceId,
|
|
103
|
+
runtimeId: previousRuntime?.id ?? null,
|
|
104
|
+
reason: lifecycleReason,
|
|
105
|
+
activeRequests: this.activeRequestCount
|
|
106
|
+
});
|
|
107
|
+
if (previousRuntime) {
|
|
70
108
|
this.runtime = null;
|
|
71
|
-
|
|
109
|
+
this.recordRuntimeRetirement(previousRuntime, "reload", lifecycleReason, true);
|
|
110
|
+
await this.disposeRuntime(previousRuntime, {
|
|
72
111
|
hard: true,
|
|
73
|
-
reason:
|
|
112
|
+
reason: lifecycleReason
|
|
74
113
|
});
|
|
75
114
|
}
|
|
76
|
-
|
|
115
|
+
try {
|
|
116
|
+
const nextRuntime = await this.createAndInitializeRuntime(startOptions);
|
|
117
|
+
this.runtime = nextRuntime;
|
|
118
|
+
} catch (error) {
|
|
119
|
+
this.log("reload failed", {
|
|
120
|
+
namespaceId: this.namespaceId,
|
|
121
|
+
previousRuntimeId: previousRuntime?.id ?? null,
|
|
122
|
+
reason: lifecycleReason,
|
|
123
|
+
activeRequests: this.activeRequestCount,
|
|
124
|
+
error: error instanceof Error ? error.message : String(error)
|
|
125
|
+
}, "warn");
|
|
126
|
+
throw error;
|
|
127
|
+
}
|
|
128
|
+
if (previousRuntime && this.lastRuntimeRetirement?.runtimeId === previousRuntime.id && this.lastRuntimeRetirement.action === "reload") {
|
|
129
|
+
this.lastRuntimeRetirement.replacementRuntimeId = this.runtime?.id;
|
|
130
|
+
}
|
|
131
|
+
this.log("reload completed", {
|
|
132
|
+
namespaceId: this.namespaceId,
|
|
133
|
+
previousRuntimeId: previousRuntime?.id ?? null,
|
|
134
|
+
runtimeId: this.runtime?.id ?? null,
|
|
135
|
+
reason: lifecycleReason,
|
|
136
|
+
activeRequests: this.activeRequestCount
|
|
137
|
+
});
|
|
77
138
|
});
|
|
78
139
|
}
|
|
79
|
-
async close() {
|
|
140
|
+
async close(reason) {
|
|
141
|
+
const lifecycleReason = formatLifecycleReason("IsolateServer.close", reason);
|
|
80
142
|
await this.withLifecycleLock(async () => {
|
|
81
|
-
|
|
82
|
-
|
|
143
|
+
const previousRuntime = this.runtime;
|
|
144
|
+
this.log("close requested", {
|
|
145
|
+
namespaceId: this.namespaceId,
|
|
146
|
+
runtimeId: previousRuntime?.id ?? null,
|
|
147
|
+
reason: lifecycleReason,
|
|
148
|
+
activeRequests: this.activeRequestCount
|
|
149
|
+
});
|
|
150
|
+
if (previousRuntime) {
|
|
83
151
|
this.runtime = null;
|
|
84
|
-
|
|
152
|
+
this.recordRuntimeRetirement(previousRuntime, "close", lifecycleReason, false);
|
|
153
|
+
await this.disposeRuntime(previousRuntime, {
|
|
154
|
+
reason: lifecycleReason
|
|
155
|
+
});
|
|
85
156
|
}
|
|
86
157
|
this.closed = true;
|
|
158
|
+
this.log("close completed", {
|
|
159
|
+
namespaceId: this.namespaceId,
|
|
160
|
+
previousRuntimeId: previousRuntime?.id ?? null,
|
|
161
|
+
reason: lifecycleReason,
|
|
162
|
+
activeRequests: this.activeRequestCount
|
|
163
|
+
});
|
|
87
164
|
});
|
|
88
165
|
}
|
|
89
166
|
getRuntime() {
|
|
@@ -162,17 +239,71 @@ class IsolateServer {
|
|
|
162
239
|
}
|
|
163
240
|
return this.runtime;
|
|
164
241
|
}
|
|
242
|
+
recordRuntimeRetirement(runtime, action, reason, hard) {
|
|
243
|
+
const record = {
|
|
244
|
+
runtimeId: runtime.id,
|
|
245
|
+
action,
|
|
246
|
+
reason,
|
|
247
|
+
hard,
|
|
248
|
+
at: Date.now(),
|
|
249
|
+
activeRequests: this.activeRequestCount
|
|
250
|
+
};
|
|
251
|
+
this.lastRuntimeRetirement = record;
|
|
252
|
+
return record;
|
|
253
|
+
}
|
|
254
|
+
getLastRuntimeRetirementLogFields() {
|
|
255
|
+
if (!this.lastRuntimeRetirement) {
|
|
256
|
+
return {
|
|
257
|
+
lastRetirementAction: "unknown"
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
return {
|
|
261
|
+
lastRetirementAction: this.lastRuntimeRetirement.action,
|
|
262
|
+
lastRetirementReason: this.lastRuntimeRetirement.reason,
|
|
263
|
+
lastRetirementRuntimeId: this.lastRuntimeRetirement.runtimeId,
|
|
264
|
+
lastRetirementHard: this.lastRuntimeRetirement.hard,
|
|
265
|
+
lastRetirementAgeMs: Date.now() - this.lastRuntimeRetirement.at,
|
|
266
|
+
lastRetirementActiveRequests: this.lastRuntimeRetirement.activeRequests,
|
|
267
|
+
lastRetirementReplacementRuntimeId: this.lastRuntimeRetirement.replacementRuntimeId ?? null
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
log(message, fields, level = "log") {
|
|
271
|
+
const suffix = Object.entries(fields).filter(([, value]) => value !== undefined).map(([key, value]) => `${key}=${formatLogValue(value)}`).join(" ");
|
|
272
|
+
const logger = level === "warn" ? console.warn : console.log;
|
|
273
|
+
logger(`[isolate-server] ${message}${suffix ? `; ${suffix}` : ""}`);
|
|
274
|
+
}
|
|
165
275
|
async dispatchRequestWithRetry(request, options) {
|
|
166
|
-
|
|
276
|
+
this.activeRequestCount += 1;
|
|
167
277
|
try {
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
278
|
+
const runtime = await this.getActiveRuntime();
|
|
279
|
+
try {
|
|
280
|
+
return await runtime.fetch.dispatchRequest(request, options);
|
|
281
|
+
} catch (error) {
|
|
282
|
+
if (!isLinkerConflictError(error) && !isDisposedRuntimeError(error)) {
|
|
283
|
+
throw error;
|
|
284
|
+
}
|
|
285
|
+
const requestSummary = summarizeRequest(request);
|
|
286
|
+
if (isLinkerConflictError(error)) {
|
|
287
|
+
await this.reload(`request-linker-conflict: ${requestSummary}`);
|
|
288
|
+
} else if (this.runtime?.id === runtime.id) {
|
|
289
|
+
this.runtime = null;
|
|
290
|
+
}
|
|
291
|
+
const retryRuntime = await this.getActiveRuntime();
|
|
292
|
+
this.log(isLinkerConflictError(error) ? "request recovered after linker conflict" : "request recovered after disposed runtime", {
|
|
293
|
+
namespaceId: this.namespaceId,
|
|
294
|
+
request: requestSummary,
|
|
295
|
+
requestId: options?.requestId ?? null,
|
|
296
|
+
metadataKeys: Object.keys(options?.metadata ?? {}),
|
|
297
|
+
previousRuntimeId: runtime.id,
|
|
298
|
+
runtimeId: retryRuntime.id,
|
|
299
|
+
activeRequests: this.activeRequestCount,
|
|
300
|
+
error: error instanceof Error ? error.message : String(error),
|
|
301
|
+
...this.getLastRuntimeRetirementLogFields()
|
|
302
|
+
}, "warn");
|
|
303
|
+
return retryRuntime.fetch.dispatchRequest(request, options);
|
|
172
304
|
}
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
return retryRuntime.fetch.dispatchRequest(request, options);
|
|
305
|
+
} finally {
|
|
306
|
+
this.activeRequestCount -= 1;
|
|
176
307
|
}
|
|
177
308
|
}
|
|
178
309
|
}
|
|
@@ -180,4 +311,4 @@ export {
|
|
|
180
311
|
IsolateServer
|
|
181
312
|
};
|
|
182
313
|
|
|
183
|
-
//# debugId=
|
|
314
|
+
//# debugId=E1A61983BC24D6F664756E2164756E21
|
|
@@ -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.mjs\";\nimport { isBenignDisposeError } from \"../client/index.mjs\";\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.mjs\";\nimport { isBenignDisposeError } from \"../client/index.mjs\";\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": ";AAQA;AAEA,IAAM,wBAAwB;AAE9B,SAAS,qBAAqB,CAAC,OAAyB;AAAA,EACtD,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,SAAS,EAAE;AAAA,EAC3E,OAAO,QAAQ,SAAS,qBAAqB;AAAA;AAAA;
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "E1A61983BC24D6F664756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
package/dist/mjs/package.json
CHANGED
|
@@ -79,11 +79,11 @@ async function createAppServerAdapter(getConnection, options) {
|
|
|
79
79
|
await server.fetch.dispatchWebSocketError(connectionId, error);
|
|
80
80
|
}
|
|
81
81
|
},
|
|
82
|
-
reload: async () => {
|
|
82
|
+
reload: async (reason) => {
|
|
83
83
|
diagnostics.lifecycleState = "reloading";
|
|
84
84
|
try {
|
|
85
|
-
bindingsAdapter.reset("AppServer.reload()");
|
|
86
|
-
await server.reload();
|
|
85
|
+
bindingsAdapter.reset(reason ? `AppServer.reload(${reason})` : "AppServer.reload()");
|
|
86
|
+
await server.reload(reason);
|
|
87
87
|
runtimeId = server.getRuntime()?.id ?? options.key;
|
|
88
88
|
} finally {
|
|
89
89
|
diagnostics.lifecycleState = "idle";
|
|
@@ -93,14 +93,16 @@ async function createAppServerAdapter(getConnection, options) {
|
|
|
93
93
|
diagnostics.lifecycleState = "disposing";
|
|
94
94
|
try {
|
|
95
95
|
if (disposeOptions?.hard) {
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
96
|
+
const hardDisposeReason = disposeOptions?.reason ? `AppServer.dispose(hard): ${disposeOptions.reason}` : "AppServer.dispose(hard)";
|
|
97
|
+
bindingsAdapter.reset(hardDisposeReason);
|
|
98
|
+
await server.reload(hardDisposeReason);
|
|
99
|
+
bindingsAdapter.abort(hardDisposeReason);
|
|
100
|
+
await server.close(hardDisposeReason);
|
|
100
101
|
return;
|
|
101
102
|
}
|
|
102
|
-
|
|
103
|
-
|
|
103
|
+
const disposeReason = disposeOptions?.reason ? `AppServer.dispose(): ${disposeOptions.reason}` : "AppServer.dispose()";
|
|
104
|
+
bindingsAdapter.abort(disposeReason);
|
|
105
|
+
await server.close(disposeReason);
|
|
104
106
|
} finally {
|
|
105
107
|
diagnostics.lifecycleState = "idle";
|
|
106
108
|
}
|
|
@@ -115,4 +117,4 @@ export {
|
|
|
115
117
|
createAppServerAdapter
|
|
116
118
|
};
|
|
117
119
|
|
|
118
|
-
//# debugId=
|
|
120
|
+
//# debugId=5AA39498EBE5037464756E2164756E21
|
|
@@ -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.mjs\";\nimport type { DaemonConnection } from \"../internal/client/index.mjs\";\nimport { createRuntimeDiagnostics } from \"../bridge/diagnostics.mjs\";\nimport { createRuntimeBindingsAdapter } from \"../bridge/runtime-bindings.mjs\";\nimport { withRequestContext } from \"../bridge/request-context.mjs\";\nimport type { AppServer, CreateAppServerOptions, RequestResult } from \"../types.mjs\";\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
|
|
5
|
+
"import { IsolateServer } from \"../internal/server/index.mjs\";\nimport type { DaemonConnection } from \"../internal/client/index.mjs\";\nimport { createRuntimeDiagnostics } from \"../bridge/diagnostics.mjs\";\nimport { createRuntimeBindingsAdapter } from \"../bridge/runtime-bindings.mjs\";\nimport { withRequestContext } from \"../bridge/request-context.mjs\";\nimport type { AppServer, CreateAppServerOptions, RequestResult } from \"../types.mjs\";\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": ";AAAA;AAEA;AACA;AACA;AAGA,eAAsB,sBAAsB,CAC1C,eACA,SACoB;AAAA,EACpB,MAAM,cAAc,yBAAyB;AAAA,EAC7C,MAAM,SAAS,IAAI,cAAc;AAAA,IAC/B,aAAa,QAAQ;AAAA,IACrB;AAAA,EACF,CAAC;AAAA,EAED,IAAI,YAAY,QAAQ;AAAA,EACxB,MAAM,kBAAkB,6BACtB,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,mBACX;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,
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "5AA39498EBE5037464756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
|
@@ -25,12 +25,14 @@ export declare class IsolateServer {
|
|
|
25
25
|
private runtime;
|
|
26
26
|
private lastStartOptions;
|
|
27
27
|
private lifecycleLock;
|
|
28
|
+
private activeRequestCount;
|
|
29
|
+
private lastRuntimeRetirement;
|
|
28
30
|
private closed;
|
|
29
31
|
readonly fetch: IsolateServerFetch;
|
|
30
32
|
constructor(options: IsolateServerOptions);
|
|
31
33
|
start(options: IsolateServerStartOptions): Promise<void>;
|
|
32
|
-
reload(): Promise<void>;
|
|
33
|
-
close(): Promise<void>;
|
|
34
|
+
reload(reason?: string): Promise<void>;
|
|
35
|
+
close(reason?: string): Promise<void>;
|
|
34
36
|
getRuntime(): RemoteRuntime | null;
|
|
35
37
|
private withLifecycleLock;
|
|
36
38
|
private buildRuntimeOptions;
|
|
@@ -38,5 +40,8 @@ export declare class IsolateServer {
|
|
|
38
40
|
private disposeRuntime;
|
|
39
41
|
private ensureStarted;
|
|
40
42
|
private getActiveRuntime;
|
|
43
|
+
private recordRuntimeRetirement;
|
|
44
|
+
private getLastRuntimeRetirementLogFields;
|
|
45
|
+
private log;
|
|
41
46
|
private dispatchRequestWithRetry;
|
|
42
47
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ricsam/isolate",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.7",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Unified runtime host for app servers, script runtimes, browser runtimes, module resolution, file bindings, and typechecking",
|
|
6
6
|
"author": "ricsam <oss@ricsam.dev>",
|