@gadgetinc/substrate 0.1.0-rc.1

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 (181) hide show
  1. package/dist/assets/kernel.wasm +0 -0
  2. package/dist/assets/manifest.json +32 -0
  3. package/dist/assets/network-driver.js +2 -0
  4. package/dist/assets/network-driver.js.map +1 -0
  5. package/dist/assets/runtime.js +264 -0
  6. package/dist/assets/runtime.js.map +1 -0
  7. package/dist/binaries.d.ts +58 -0
  8. package/dist/binaries.d.ts.map +1 -0
  9. package/dist/boot/index.d.ts +318 -0
  10. package/dist/boot/index.d.ts.map +1 -0
  11. package/dist/index.d.ts +8 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +4589 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/kernel/bridge.d.ts +64 -0
  16. package/dist/kernel/bridge.d.ts.map +1 -0
  17. package/dist/kernel/types.d.ts +518 -0
  18. package/dist/kernel/types.d.ts.map +1 -0
  19. package/dist/kernel/wasm.d.ts +20 -0
  20. package/dist/kernel/wasm.d.ts.map +1 -0
  21. package/dist/node/assert.d.ts +99 -0
  22. package/dist/node/assert.d.ts.map +1 -0
  23. package/dist/node/async_hooks.d.ts +88 -0
  24. package/dist/node/async_hooks.d.ts.map +1 -0
  25. package/dist/node/buffer.d.ts +62 -0
  26. package/dist/node/buffer.d.ts.map +1 -0
  27. package/dist/node/child_process.d.ts +300 -0
  28. package/dist/node/child_process.d.ts.map +1 -0
  29. package/dist/node/cluster.d.ts +37 -0
  30. package/dist/node/cluster.d.ts.map +1 -0
  31. package/dist/node/constants.d.ts +306 -0
  32. package/dist/node/constants.d.ts.map +1 -0
  33. package/dist/node/crypto.d.ts +176 -0
  34. package/dist/node/crypto.d.ts.map +1 -0
  35. package/dist/node/dgram.d.ts +44 -0
  36. package/dist/node/dgram.d.ts.map +1 -0
  37. package/dist/node/diagnostics_channel.d.ts +57 -0
  38. package/dist/node/diagnostics_channel.d.ts.map +1 -0
  39. package/dist/node/dns.d.ts +278 -0
  40. package/dist/node/dns.d.ts.map +1 -0
  41. package/dist/node/domain.d.ts +21 -0
  42. package/dist/node/domain.d.ts.map +1 -0
  43. package/dist/node/events.d.ts +54 -0
  44. package/dist/node/events.d.ts.map +1 -0
  45. package/dist/node/fs/promises.d.ts +116 -0
  46. package/dist/node/fs/promises.d.ts.map +1 -0
  47. package/dist/node/fs.d.ts +536 -0
  48. package/dist/node/fs.d.ts.map +1 -0
  49. package/dist/node/http.d.ts +471 -0
  50. package/dist/node/http.d.ts.map +1 -0
  51. package/dist/node/http2.d.ts +508 -0
  52. package/dist/node/http2.d.ts.map +1 -0
  53. package/dist/node/https.d.ts +42 -0
  54. package/dist/node/https.d.ts.map +1 -0
  55. package/dist/node/inspector.d.ts +25 -0
  56. package/dist/node/inspector.d.ts.map +1 -0
  57. package/dist/node/net.d.ts +231 -0
  58. package/dist/node/net.d.ts.map +1 -0
  59. package/dist/node/os.d.ts +318 -0
  60. package/dist/node/os.d.ts.map +1 -0
  61. package/dist/node/path.d.ts +144 -0
  62. package/dist/node/path.d.ts.map +1 -0
  63. package/dist/node/process.d.ts +105 -0
  64. package/dist/node/process.d.ts.map +1 -0
  65. package/dist/node/punycode.d.ts +34 -0
  66. package/dist/node/punycode.d.ts.map +1 -0
  67. package/dist/node/querystring.d.ts +49 -0
  68. package/dist/node/querystring.d.ts.map +1 -0
  69. package/dist/node/readline.d.ts +99 -0
  70. package/dist/node/readline.d.ts.map +1 -0
  71. package/dist/node/stream.d.ts +409 -0
  72. package/dist/node/stream.d.ts.map +1 -0
  73. package/dist/node/string_decoder.d.ts +46 -0
  74. package/dist/node/string_decoder.d.ts.map +1 -0
  75. package/dist/node/timers.d.ts +79 -0
  76. package/dist/node/timers.d.ts.map +1 -0
  77. package/dist/node/tls.d.ts +159 -0
  78. package/dist/node/tls.d.ts.map +1 -0
  79. package/dist/node/trace_events.d.ts +18 -0
  80. package/dist/node/trace_events.d.ts.map +1 -0
  81. package/dist/node/tty.d.ts +67 -0
  82. package/dist/node/tty.d.ts.map +1 -0
  83. package/dist/node/url.d.ts +85 -0
  84. package/dist/node/url.d.ts.map +1 -0
  85. package/dist/node/util.d.ts +252 -0
  86. package/dist/node/util.d.ts.map +1 -0
  87. package/dist/node/v8.d.ts +134 -0
  88. package/dist/node/v8.d.ts.map +1 -0
  89. package/dist/node/vm.d.ts +89 -0
  90. package/dist/node/vm.d.ts.map +1 -0
  91. package/dist/node/wasi.d.ts +25 -0
  92. package/dist/node/wasi.d.ts.map +1 -0
  93. package/dist/node/worker_threads.d.ts +206 -0
  94. package/dist/node/worker_threads.d.ts.map +1 -0
  95. package/dist/node/ws.d.ts +110 -0
  96. package/dist/node/ws.d.ts.map +1 -0
  97. package/dist/node/zlib.d.ts +328 -0
  98. package/dist/node/zlib.d.ts.map +1 -0
  99. package/dist/persistence/opfs-store.d.ts +93 -0
  100. package/dist/persistence/opfs-store.d.ts.map +1 -0
  101. package/dist/runtime/async-function-shim.d.ts +27 -0
  102. package/dist/runtime/async-function-shim.d.ts.map +1 -0
  103. package/dist/runtime/fs-interface.d.ts +60 -0
  104. package/dist/runtime/fs-interface.d.ts.map +1 -0
  105. package/dist/runtime/index.d.ts +113 -0
  106. package/dist/runtime/index.d.ts.map +1 -0
  107. package/dist/runtime/loader.d.ts +50 -0
  108. package/dist/runtime/loader.d.ts.map +1 -0
  109. package/dist/runtime/loaders/async-transform.d.ts +40 -0
  110. package/dist/runtime/loaders/async-transform.d.ts.map +1 -0
  111. package/dist/runtime/loaders/cjs.d.ts +37 -0
  112. package/dist/runtime/loaders/cjs.d.ts.map +1 -0
  113. package/dist/runtime/loaders/detect-module-type.d.ts +21 -0
  114. package/dist/runtime/loaders/detect-module-type.d.ts.map +1 -0
  115. package/dist/runtime/loaders/esm.d.ts +140 -0
  116. package/dist/runtime/loaders/esm.d.ts.map +1 -0
  117. package/dist/runtime/loaders/source-map-registry.d.ts +43 -0
  118. package/dist/runtime/loaders/source-map-registry.d.ts.map +1 -0
  119. package/dist/runtime/loaders/source-map.d.ts +50 -0
  120. package/dist/runtime/loaders/source-map.d.ts.map +1 -0
  121. package/dist/runtime/loaders/utils.d.ts +6 -0
  122. package/dist/runtime/loaders/utils.d.ts.map +1 -0
  123. package/dist/runtime/native-globals.d.ts +24 -0
  124. package/dist/runtime/native-globals.d.ts.map +1 -0
  125. package/dist/runtime/network-driver.d.ts +78 -0
  126. package/dist/runtime/network-driver.d.ts.map +1 -0
  127. package/dist/runtime/process-context.d.ts +96 -0
  128. package/dist/runtime/process-context.d.ts.map +1 -0
  129. package/dist/runtime/process-event-loop.d.ts +356 -0
  130. package/dist/runtime/process-event-loop.d.ts.map +1 -0
  131. package/dist/runtime/process-handler.d.ts +71 -0
  132. package/dist/runtime/process-handler.d.ts.map +1 -0
  133. package/dist/runtime/process-handlers/node.d.ts +22 -0
  134. package/dist/runtime/process-handlers/node.d.ts.map +1 -0
  135. package/dist/runtime/process-handlers/npm.d.ts +20 -0
  136. package/dist/runtime/process-handlers/npm.d.ts.map +1 -0
  137. package/dist/runtime/process-handlers/npx.d.ts +11 -0
  138. package/dist/runtime/process-handlers/npx.d.ts.map +1 -0
  139. package/dist/runtime/process-handlers/pnpm.d.ts +12 -0
  140. package/dist/runtime/process-handlers/pnpm.d.ts.map +1 -0
  141. package/dist/runtime/process-handlers/shell.d.ts +24 -0
  142. package/dist/runtime/process-handlers/shell.d.ts.map +1 -0
  143. package/dist/runtime/process-handlers/yarn.d.ts +12 -0
  144. package/dist/runtime/process-handlers/yarn.d.ts.map +1 -0
  145. package/dist/runtime/process-helpers.d.ts +17 -0
  146. package/dist/runtime/process-helpers.d.ts.map +1 -0
  147. package/dist/runtime/process-manager.d.ts +87 -0
  148. package/dist/runtime/process-manager.d.ts.map +1 -0
  149. package/dist/runtime/process-scheduler.d.ts +123 -0
  150. package/dist/runtime/process-scheduler.d.ts.map +1 -0
  151. package/dist/runtime/process-waker.d.ts +24 -0
  152. package/dist/runtime/process-waker.d.ts.map +1 -0
  153. package/dist/runtime/promise.d.ts +44 -0
  154. package/dist/runtime/promise.d.ts.map +1 -0
  155. package/dist/runtime/stack-trace.d.ts +52 -0
  156. package/dist/runtime/stack-trace.d.ts.map +1 -0
  157. package/dist/runtime/wasm-package-interceptor.d.ts +141 -0
  158. package/dist/runtime/wasm-package-interceptor.d.ts.map +1 -0
  159. package/dist/runtime/web-streams.d.ts +57 -0
  160. package/dist/runtime/web-streams.d.ts.map +1 -0
  161. package/dist/runtime/websocket.d.ts +102 -0
  162. package/dist/runtime/websocket.d.ts.map +1 -0
  163. package/dist/shim/websocket-shim-inline.d.ts +9 -0
  164. package/dist/shim/websocket-shim-inline.d.ts.map +1 -0
  165. package/dist/shim/websocket-shim.d.ts +15 -0
  166. package/dist/shim/websocket-shim.d.ts.map +1 -0
  167. package/dist/sw/index.d.ts +53 -0
  168. package/dist/sw/index.d.ts.map +1 -0
  169. package/dist/utils/debug.d.ts +75 -0
  170. package/dist/utils/debug.d.ts.map +1 -0
  171. package/dist/utils/path.d.ts +20 -0
  172. package/dist/utils/path.d.ts.map +1 -0
  173. package/dist/utils/tarball.d.ts +37 -0
  174. package/dist/utils/tarball.d.ts.map +1 -0
  175. package/dist/utils/websocket-protocol.d.ts +102 -0
  176. package/dist/utils/websocket-protocol.d.ts.map +1 -0
  177. package/dist/worker/host.d.ts +14 -0
  178. package/dist/worker/host.d.ts.map +1 -0
  179. package/dist/worker/types.d.ts +209 -0
  180. package/dist/worker/types.d.ts.map +1 -0
  181. package/package.json +53 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["exports","Emitter"],"sources":["../../../node_modules/.pnpm/vscode-jsonrpc@8.2.1/node_modules/vscode-jsonrpc/lib/common/is.js","../../../node_modules/.pnpm/vscode-jsonrpc@8.2.1/node_modules/vscode-jsonrpc/lib/common/messages.js","../../../node_modules/.pnpm/vscode-jsonrpc@8.2.1/node_modules/vscode-jsonrpc/lib/common/linkedMap.js","../../../node_modules/.pnpm/vscode-jsonrpc@8.2.1/node_modules/vscode-jsonrpc/lib/common/disposable.js","../../../node_modules/.pnpm/vscode-jsonrpc@8.2.1/node_modules/vscode-jsonrpc/lib/common/ral.js","../../../node_modules/.pnpm/vscode-jsonrpc@8.2.1/node_modules/vscode-jsonrpc/lib/common/events.js","../../../node_modules/.pnpm/vscode-jsonrpc@8.2.1/node_modules/vscode-jsonrpc/lib/common/cancellation.js","../../../node_modules/.pnpm/vscode-jsonrpc@8.2.1/node_modules/vscode-jsonrpc/lib/common/sharedArrayCancellation.js","../../../node_modules/.pnpm/vscode-jsonrpc@8.2.1/node_modules/vscode-jsonrpc/lib/common/semaphore.js","../../../node_modules/.pnpm/vscode-jsonrpc@8.2.1/node_modules/vscode-jsonrpc/lib/common/messageReader.js","../../../node_modules/.pnpm/vscode-jsonrpc@8.2.1/node_modules/vscode-jsonrpc/lib/common/messageWriter.js","../../../node_modules/.pnpm/vscode-jsonrpc@8.2.1/node_modules/vscode-jsonrpc/lib/common/messageBuffer.js","../../../node_modules/.pnpm/vscode-jsonrpc@8.2.1/node_modules/vscode-jsonrpc/lib/common/connection.js","../../../node_modules/.pnpm/vscode-jsonrpc@8.2.1/node_modules/vscode-jsonrpc/lib/common/api.js","../../../node_modules/.pnpm/vscode-jsonrpc@8.2.1/node_modules/vscode-jsonrpc/lib/browser/ril.js","../../../node_modules/.pnpm/vscode-jsonrpc@8.2.1/node_modules/vscode-jsonrpc/lib/browser/main.js","../../../node_modules/.pnpm/thumbdrive@0.3.0_tslib@2.8.1/node_modules/thumbdrive/dist/MultiTabWorkerBroker.js","../src/utils/debug.ts","../src/kernel/wasm.ts","../src/utils/path.ts","../src/binaries.ts","../src/boot/index.ts"],"sourcesContent":["\"use strict\";\n/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.stringArray = exports.array = exports.func = exports.error = exports.number = exports.string = exports.boolean = void 0;\nfunction boolean(value) {\n return value === true || value === false;\n}\nexports.boolean = boolean;\nfunction string(value) {\n return typeof value === 'string' || value instanceof String;\n}\nexports.string = string;\nfunction number(value) {\n return typeof value === 'number' || value instanceof Number;\n}\nexports.number = number;\nfunction error(value) {\n return value instanceof Error;\n}\nexports.error = error;\nfunction func(value) {\n return typeof value === 'function';\n}\nexports.func = func;\nfunction array(value) {\n return Array.isArray(value);\n}\nexports.array = array;\nfunction stringArray(value) {\n return array(value) && value.every(elem => string(elem));\n}\nexports.stringArray = stringArray;\n","\"use strict\";\n/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Message = exports.NotificationType9 = exports.NotificationType8 = exports.NotificationType7 = exports.NotificationType6 = exports.NotificationType5 = exports.NotificationType4 = exports.NotificationType3 = exports.NotificationType2 = exports.NotificationType1 = exports.NotificationType0 = exports.NotificationType = exports.RequestType9 = exports.RequestType8 = exports.RequestType7 = exports.RequestType6 = exports.RequestType5 = exports.RequestType4 = exports.RequestType3 = exports.RequestType2 = exports.RequestType1 = exports.RequestType = exports.RequestType0 = exports.AbstractMessageSignature = exports.ParameterStructures = exports.ResponseError = exports.ErrorCodes = void 0;\nconst is = require(\"./is\");\n/**\n * Predefined error codes.\n */\nvar ErrorCodes;\n(function (ErrorCodes) {\n // Defined by JSON RPC\n ErrorCodes.ParseError = -32700;\n ErrorCodes.InvalidRequest = -32600;\n ErrorCodes.MethodNotFound = -32601;\n ErrorCodes.InvalidParams = -32602;\n ErrorCodes.InternalError = -32603;\n /**\n * This is the start range of JSON RPC reserved error codes.\n * It doesn't denote a real error code. No application error codes should\n * be defined between the start and end range. For backwards\n * compatibility the `ServerNotInitialized` and the `UnknownErrorCode`\n * are left in the range.\n *\n * @since 3.16.0\n */\n ErrorCodes.jsonrpcReservedErrorRangeStart = -32099;\n /** @deprecated use jsonrpcReservedErrorRangeStart */\n ErrorCodes.serverErrorStart = -32099;\n /**\n * An error occurred when write a message to the transport layer.\n */\n ErrorCodes.MessageWriteError = -32099;\n /**\n * An error occurred when reading a message from the transport layer.\n */\n ErrorCodes.MessageReadError = -32098;\n /**\n * The connection got disposed or lost and all pending responses got\n * rejected.\n */\n ErrorCodes.PendingResponseRejected = -32097;\n /**\n * The connection is inactive and a use of it failed.\n */\n ErrorCodes.ConnectionInactive = -32096;\n /**\n * Error code indicating that a server received a notification or\n * request before the server has received the `initialize` request.\n */\n ErrorCodes.ServerNotInitialized = -32002;\n ErrorCodes.UnknownErrorCode = -32001;\n /**\n * This is the end range of JSON RPC reserved error codes.\n * It doesn't denote a real error code.\n *\n * @since 3.16.0\n */\n ErrorCodes.jsonrpcReservedErrorRangeEnd = -32000;\n /** @deprecated use jsonrpcReservedErrorRangeEnd */\n ErrorCodes.serverErrorEnd = -32000;\n})(ErrorCodes || (exports.ErrorCodes = ErrorCodes = {}));\n/**\n * An error object return in a response in case a request\n * has failed.\n */\nclass ResponseError extends Error {\n constructor(code, message, data) {\n super(message);\n this.code = is.number(code) ? code : ErrorCodes.UnknownErrorCode;\n this.data = data;\n Object.setPrototypeOf(this, ResponseError.prototype);\n }\n toJson() {\n const result = {\n code: this.code,\n message: this.message\n };\n if (this.data !== undefined) {\n result.data = this.data;\n }\n return result;\n }\n}\nexports.ResponseError = ResponseError;\nclass ParameterStructures {\n constructor(kind) {\n this.kind = kind;\n }\n static is(value) {\n return value === ParameterStructures.auto || value === ParameterStructures.byName || value === ParameterStructures.byPosition;\n }\n toString() {\n return this.kind;\n }\n}\nexports.ParameterStructures = ParameterStructures;\n/**\n * The parameter structure is automatically inferred on the number of parameters\n * and the parameter type in case of a single param.\n */\nParameterStructures.auto = new ParameterStructures('auto');\n/**\n * Forces `byPosition` parameter structure. This is useful if you have a single\n * parameter which has a literal type.\n */\nParameterStructures.byPosition = new ParameterStructures('byPosition');\n/**\n * Forces `byName` parameter structure. This is only useful when having a single\n * parameter. The library will report errors if used with a different number of\n * parameters.\n */\nParameterStructures.byName = new ParameterStructures('byName');\n/**\n * An abstract implementation of a MessageType.\n */\nclass AbstractMessageSignature {\n constructor(method, numberOfParams) {\n this.method = method;\n this.numberOfParams = numberOfParams;\n }\n get parameterStructures() {\n return ParameterStructures.auto;\n }\n}\nexports.AbstractMessageSignature = AbstractMessageSignature;\n/**\n * Classes to type request response pairs\n */\nclass RequestType0 extends AbstractMessageSignature {\n constructor(method) {\n super(method, 0);\n }\n}\nexports.RequestType0 = RequestType0;\nclass RequestType extends AbstractMessageSignature {\n constructor(method, _parameterStructures = ParameterStructures.auto) {\n super(method, 1);\n this._parameterStructures = _parameterStructures;\n }\n get parameterStructures() {\n return this._parameterStructures;\n }\n}\nexports.RequestType = RequestType;\nclass RequestType1 extends AbstractMessageSignature {\n constructor(method, _parameterStructures = ParameterStructures.auto) {\n super(method, 1);\n this._parameterStructures = _parameterStructures;\n }\n get parameterStructures() {\n return this._parameterStructures;\n }\n}\nexports.RequestType1 = RequestType1;\nclass RequestType2 extends AbstractMessageSignature {\n constructor(method) {\n super(method, 2);\n }\n}\nexports.RequestType2 = RequestType2;\nclass RequestType3 extends AbstractMessageSignature {\n constructor(method) {\n super(method, 3);\n }\n}\nexports.RequestType3 = RequestType3;\nclass RequestType4 extends AbstractMessageSignature {\n constructor(method) {\n super(method, 4);\n }\n}\nexports.RequestType4 = RequestType4;\nclass RequestType5 extends AbstractMessageSignature {\n constructor(method) {\n super(method, 5);\n }\n}\nexports.RequestType5 = RequestType5;\nclass RequestType6 extends AbstractMessageSignature {\n constructor(method) {\n super(method, 6);\n }\n}\nexports.RequestType6 = RequestType6;\nclass RequestType7 extends AbstractMessageSignature {\n constructor(method) {\n super(method, 7);\n }\n}\nexports.RequestType7 = RequestType7;\nclass RequestType8 extends AbstractMessageSignature {\n constructor(method) {\n super(method, 8);\n }\n}\nexports.RequestType8 = RequestType8;\nclass RequestType9 extends AbstractMessageSignature {\n constructor(method) {\n super(method, 9);\n }\n}\nexports.RequestType9 = RequestType9;\nclass NotificationType extends AbstractMessageSignature {\n constructor(method, _parameterStructures = ParameterStructures.auto) {\n super(method, 1);\n this._parameterStructures = _parameterStructures;\n }\n get parameterStructures() {\n return this._parameterStructures;\n }\n}\nexports.NotificationType = NotificationType;\nclass NotificationType0 extends AbstractMessageSignature {\n constructor(method) {\n super(method, 0);\n }\n}\nexports.NotificationType0 = NotificationType0;\nclass NotificationType1 extends AbstractMessageSignature {\n constructor(method, _parameterStructures = ParameterStructures.auto) {\n super(method, 1);\n this._parameterStructures = _parameterStructures;\n }\n get parameterStructures() {\n return this._parameterStructures;\n }\n}\nexports.NotificationType1 = NotificationType1;\nclass NotificationType2 extends AbstractMessageSignature {\n constructor(method) {\n super(method, 2);\n }\n}\nexports.NotificationType2 = NotificationType2;\nclass NotificationType3 extends AbstractMessageSignature {\n constructor(method) {\n super(method, 3);\n }\n}\nexports.NotificationType3 = NotificationType3;\nclass NotificationType4 extends AbstractMessageSignature {\n constructor(method) {\n super(method, 4);\n }\n}\nexports.NotificationType4 = NotificationType4;\nclass NotificationType5 extends AbstractMessageSignature {\n constructor(method) {\n super(method, 5);\n }\n}\nexports.NotificationType5 = NotificationType5;\nclass NotificationType6 extends AbstractMessageSignature {\n constructor(method) {\n super(method, 6);\n }\n}\nexports.NotificationType6 = NotificationType6;\nclass NotificationType7 extends AbstractMessageSignature {\n constructor(method) {\n super(method, 7);\n }\n}\nexports.NotificationType7 = NotificationType7;\nclass NotificationType8 extends AbstractMessageSignature {\n constructor(method) {\n super(method, 8);\n }\n}\nexports.NotificationType8 = NotificationType8;\nclass NotificationType9 extends AbstractMessageSignature {\n constructor(method) {\n super(method, 9);\n }\n}\nexports.NotificationType9 = NotificationType9;\nvar Message;\n(function (Message) {\n /**\n * Tests if the given message is a request message\n */\n function isRequest(message) {\n const candidate = message;\n return candidate && is.string(candidate.method) && (is.string(candidate.id) || is.number(candidate.id));\n }\n Message.isRequest = isRequest;\n /**\n * Tests if the given message is a notification message\n */\n function isNotification(message) {\n const candidate = message;\n return candidate && is.string(candidate.method) && message.id === void 0;\n }\n Message.isNotification = isNotification;\n /**\n * Tests if the given message is a response message\n */\n function isResponse(message) {\n const candidate = message;\n return candidate && (candidate.result !== void 0 || !!candidate.error) && (is.string(candidate.id) || is.number(candidate.id) || candidate.id === null);\n }\n Message.isResponse = isResponse;\n})(Message || (exports.Message = Message = {}));\n","\"use strict\";\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nvar _a;\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.LRUCache = exports.LinkedMap = exports.Touch = void 0;\nvar Touch;\n(function (Touch) {\n Touch.None = 0;\n Touch.First = 1;\n Touch.AsOld = Touch.First;\n Touch.Last = 2;\n Touch.AsNew = Touch.Last;\n})(Touch || (exports.Touch = Touch = {}));\nclass LinkedMap {\n constructor() {\n this[_a] = 'LinkedMap';\n this._map = new Map();\n this._head = undefined;\n this._tail = undefined;\n this._size = 0;\n this._state = 0;\n }\n clear() {\n this._map.clear();\n this._head = undefined;\n this._tail = undefined;\n this._size = 0;\n this._state++;\n }\n isEmpty() {\n return !this._head && !this._tail;\n }\n get size() {\n return this._size;\n }\n get first() {\n return this._head?.value;\n }\n get last() {\n return this._tail?.value;\n }\n has(key) {\n return this._map.has(key);\n }\n get(key, touch = Touch.None) {\n const item = this._map.get(key);\n if (!item) {\n return undefined;\n }\n if (touch !== Touch.None) {\n this.touch(item, touch);\n }\n return item.value;\n }\n set(key, value, touch = Touch.None) {\n let item = this._map.get(key);\n if (item) {\n item.value = value;\n if (touch !== Touch.None) {\n this.touch(item, touch);\n }\n }\n else {\n item = { key, value, next: undefined, previous: undefined };\n switch (touch) {\n case Touch.None:\n this.addItemLast(item);\n break;\n case Touch.First:\n this.addItemFirst(item);\n break;\n case Touch.Last:\n this.addItemLast(item);\n break;\n default:\n this.addItemLast(item);\n break;\n }\n this._map.set(key, item);\n this._size++;\n }\n return this;\n }\n delete(key) {\n return !!this.remove(key);\n }\n remove(key) {\n const item = this._map.get(key);\n if (!item) {\n return undefined;\n }\n this._map.delete(key);\n this.removeItem(item);\n this._size--;\n return item.value;\n }\n shift() {\n if (!this._head && !this._tail) {\n return undefined;\n }\n if (!this._head || !this._tail) {\n throw new Error('Invalid list');\n }\n const item = this._head;\n this._map.delete(item.key);\n this.removeItem(item);\n this._size--;\n return item.value;\n }\n forEach(callbackfn, thisArg) {\n const state = this._state;\n let current = this._head;\n while (current) {\n if (thisArg) {\n callbackfn.bind(thisArg)(current.value, current.key, this);\n }\n else {\n callbackfn(current.value, current.key, this);\n }\n if (this._state !== state) {\n throw new Error(`LinkedMap got modified during iteration.`);\n }\n current = current.next;\n }\n }\n keys() {\n const state = this._state;\n let current = this._head;\n const iterator = {\n [Symbol.iterator]: () => {\n return iterator;\n },\n next: () => {\n if (this._state !== state) {\n throw new Error(`LinkedMap got modified during iteration.`);\n }\n if (current) {\n const result = { value: current.key, done: false };\n current = current.next;\n return result;\n }\n else {\n return { value: undefined, done: true };\n }\n }\n };\n return iterator;\n }\n values() {\n const state = this._state;\n let current = this._head;\n const iterator = {\n [Symbol.iterator]: () => {\n return iterator;\n },\n next: () => {\n if (this._state !== state) {\n throw new Error(`LinkedMap got modified during iteration.`);\n }\n if (current) {\n const result = { value: current.value, done: false };\n current = current.next;\n return result;\n }\n else {\n return { value: undefined, done: true };\n }\n }\n };\n return iterator;\n }\n entries() {\n const state = this._state;\n let current = this._head;\n const iterator = {\n [Symbol.iterator]: () => {\n return iterator;\n },\n next: () => {\n if (this._state !== state) {\n throw new Error(`LinkedMap got modified during iteration.`);\n }\n if (current) {\n const result = { value: [current.key, current.value], done: false };\n current = current.next;\n return result;\n }\n else {\n return { value: undefined, done: true };\n }\n }\n };\n return iterator;\n }\n [(_a = Symbol.toStringTag, Symbol.iterator)]() {\n return this.entries();\n }\n trimOld(newSize) {\n if (newSize >= this.size) {\n return;\n }\n if (newSize === 0) {\n this.clear();\n return;\n }\n let current = this._head;\n let currentSize = this.size;\n while (current && currentSize > newSize) {\n this._map.delete(current.key);\n current = current.next;\n currentSize--;\n }\n this._head = current;\n this._size = currentSize;\n if (current) {\n current.previous = undefined;\n }\n this._state++;\n }\n addItemFirst(item) {\n // First time Insert\n if (!this._head && !this._tail) {\n this._tail = item;\n }\n else if (!this._head) {\n throw new Error('Invalid list');\n }\n else {\n item.next = this._head;\n this._head.previous = item;\n }\n this._head = item;\n this._state++;\n }\n addItemLast(item) {\n // First time Insert\n if (!this._head && !this._tail) {\n this._head = item;\n }\n else if (!this._tail) {\n throw new Error('Invalid list');\n }\n else {\n item.previous = this._tail;\n this._tail.next = item;\n }\n this._tail = item;\n this._state++;\n }\n removeItem(item) {\n if (item === this._head && item === this._tail) {\n this._head = undefined;\n this._tail = undefined;\n }\n else if (item === this._head) {\n // This can only happened if size === 1 which is handle\n // by the case above.\n if (!item.next) {\n throw new Error('Invalid list');\n }\n item.next.previous = undefined;\n this._head = item.next;\n }\n else if (item === this._tail) {\n // This can only happened if size === 1 which is handle\n // by the case above.\n if (!item.previous) {\n throw new Error('Invalid list');\n }\n item.previous.next = undefined;\n this._tail = item.previous;\n }\n else {\n const next = item.next;\n const previous = item.previous;\n if (!next || !previous) {\n throw new Error('Invalid list');\n }\n next.previous = previous;\n previous.next = next;\n }\n item.next = undefined;\n item.previous = undefined;\n this._state++;\n }\n touch(item, touch) {\n if (!this._head || !this._tail) {\n throw new Error('Invalid list');\n }\n if ((touch !== Touch.First && touch !== Touch.Last)) {\n return;\n }\n if (touch === Touch.First) {\n if (item === this._head) {\n return;\n }\n const next = item.next;\n const previous = item.previous;\n // Unlink the item\n if (item === this._tail) {\n // previous must be defined since item was not head but is tail\n // So there are more than on item in the map\n previous.next = undefined;\n this._tail = previous;\n }\n else {\n // Both next and previous are not undefined since item was neither head nor tail.\n next.previous = previous;\n previous.next = next;\n }\n // Insert the node at head\n item.previous = undefined;\n item.next = this._head;\n this._head.previous = item;\n this._head = item;\n this._state++;\n }\n else if (touch === Touch.Last) {\n if (item === this._tail) {\n return;\n }\n const next = item.next;\n const previous = item.previous;\n // Unlink the item.\n if (item === this._head) {\n // next must be defined since item was not tail but is head\n // So there are more than on item in the map\n next.previous = undefined;\n this._head = next;\n }\n else {\n // Both next and previous are not undefined since item was neither head nor tail.\n next.previous = previous;\n previous.next = next;\n }\n item.next = undefined;\n item.previous = this._tail;\n this._tail.next = item;\n this._tail = item;\n this._state++;\n }\n }\n toJSON() {\n const data = [];\n this.forEach((value, key) => {\n data.push([key, value]);\n });\n return data;\n }\n fromJSON(data) {\n this.clear();\n for (const [key, value] of data) {\n this.set(key, value);\n }\n }\n}\nexports.LinkedMap = LinkedMap;\nclass LRUCache extends LinkedMap {\n constructor(limit, ratio = 1) {\n super();\n this._limit = limit;\n this._ratio = Math.min(Math.max(0, ratio), 1);\n }\n get limit() {\n return this._limit;\n }\n set limit(limit) {\n this._limit = limit;\n this.checkTrim();\n }\n get ratio() {\n return this._ratio;\n }\n set ratio(ratio) {\n this._ratio = Math.min(Math.max(0, ratio), 1);\n this.checkTrim();\n }\n get(key, touch = Touch.AsNew) {\n return super.get(key, touch);\n }\n peek(key) {\n return super.get(key, Touch.None);\n }\n set(key, value) {\n super.set(key, value, Touch.Last);\n this.checkTrim();\n return this;\n }\n checkTrim() {\n if (this.size > this._limit) {\n this.trimOld(Math.round(this._limit * this._ratio));\n }\n }\n}\nexports.LRUCache = LRUCache;\n","\"use strict\";\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Disposable = void 0;\nvar Disposable;\n(function (Disposable) {\n function create(func) {\n return {\n dispose: func\n };\n }\n Disposable.create = create;\n})(Disposable || (exports.Disposable = Disposable = {}));\n","\"use strict\";\n/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nlet _ral;\nfunction RAL() {\n if (_ral === undefined) {\n throw new Error(`No runtime abstraction layer installed`);\n }\n return _ral;\n}\n(function (RAL) {\n function install(ral) {\n if (ral === undefined) {\n throw new Error(`No runtime abstraction layer provided`);\n }\n _ral = ral;\n }\n RAL.install = install;\n})(RAL || (RAL = {}));\nexports.default = RAL;\n","\"use strict\";\n/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Emitter = exports.Event = void 0;\nconst ral_1 = require(\"./ral\");\nvar Event;\n(function (Event) {\n const _disposable = { dispose() { } };\n Event.None = function () { return _disposable; };\n})(Event || (exports.Event = Event = {}));\nclass CallbackList {\n add(callback, context = null, bucket) {\n if (!this._callbacks) {\n this._callbacks = [];\n this._contexts = [];\n }\n this._callbacks.push(callback);\n this._contexts.push(context);\n if (Array.isArray(bucket)) {\n bucket.push({ dispose: () => this.remove(callback, context) });\n }\n }\n remove(callback, context = null) {\n if (!this._callbacks) {\n return;\n }\n let foundCallbackWithDifferentContext = false;\n for (let i = 0, len = this._callbacks.length; i < len; i++) {\n if (this._callbacks[i] === callback) {\n if (this._contexts[i] === context) {\n // callback & context match => remove it\n this._callbacks.splice(i, 1);\n this._contexts.splice(i, 1);\n return;\n }\n else {\n foundCallbackWithDifferentContext = true;\n }\n }\n }\n if (foundCallbackWithDifferentContext) {\n throw new Error('When adding a listener with a context, you should remove it with the same context');\n }\n }\n invoke(...args) {\n if (!this._callbacks) {\n return [];\n }\n const ret = [], callbacks = this._callbacks.slice(0), contexts = this._contexts.slice(0);\n for (let i = 0, len = callbacks.length; i < len; i++) {\n try {\n ret.push(callbacks[i].apply(contexts[i], args));\n }\n catch (e) {\n // eslint-disable-next-line no-console\n (0, ral_1.default)().console.error(e);\n }\n }\n return ret;\n }\n isEmpty() {\n return !this._callbacks || this._callbacks.length === 0;\n }\n dispose() {\n this._callbacks = undefined;\n this._contexts = undefined;\n }\n}\nclass Emitter {\n constructor(_options) {\n this._options = _options;\n }\n /**\n * For the public to allow to subscribe\n * to events from this Emitter\n */\n get event() {\n if (!this._event) {\n this._event = (listener, thisArgs, disposables) => {\n if (!this._callbacks) {\n this._callbacks = new CallbackList();\n }\n if (this._options && this._options.onFirstListenerAdd && this._callbacks.isEmpty()) {\n this._options.onFirstListenerAdd(this);\n }\n this._callbacks.add(listener, thisArgs);\n const result = {\n dispose: () => {\n if (!this._callbacks) {\n // disposable is disposed after emitter is disposed.\n return;\n }\n this._callbacks.remove(listener, thisArgs);\n result.dispose = Emitter._noop;\n if (this._options && this._options.onLastListenerRemove && this._callbacks.isEmpty()) {\n this._options.onLastListenerRemove(this);\n }\n }\n };\n if (Array.isArray(disposables)) {\n disposables.push(result);\n }\n return result;\n };\n }\n return this._event;\n }\n /**\n * To be kept private to fire an event to\n * subscribers\n */\n fire(event) {\n if (this._callbacks) {\n this._callbacks.invoke.call(this._callbacks, event);\n }\n }\n dispose() {\n if (this._callbacks) {\n this._callbacks.dispose();\n this._callbacks = undefined;\n }\n }\n}\nexports.Emitter = Emitter;\nEmitter._noop = function () { };\n","\"use strict\";\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.CancellationTokenSource = exports.CancellationToken = void 0;\nconst ral_1 = require(\"./ral\");\nconst Is = require(\"./is\");\nconst events_1 = require(\"./events\");\nvar CancellationToken;\n(function (CancellationToken) {\n CancellationToken.None = Object.freeze({\n isCancellationRequested: false,\n onCancellationRequested: events_1.Event.None\n });\n CancellationToken.Cancelled = Object.freeze({\n isCancellationRequested: true,\n onCancellationRequested: events_1.Event.None\n });\n function is(value) {\n const candidate = value;\n return candidate && (candidate === CancellationToken.None\n || candidate === CancellationToken.Cancelled\n || (Is.boolean(candidate.isCancellationRequested) && !!candidate.onCancellationRequested));\n }\n CancellationToken.is = is;\n})(CancellationToken || (exports.CancellationToken = CancellationToken = {}));\nconst shortcutEvent = Object.freeze(function (callback, context) {\n const handle = (0, ral_1.default)().timer.setTimeout(callback.bind(context), 0);\n return { dispose() { handle.dispose(); } };\n});\nclass MutableToken {\n constructor() {\n this._isCancelled = false;\n }\n cancel() {\n if (!this._isCancelled) {\n this._isCancelled = true;\n if (this._emitter) {\n this._emitter.fire(undefined);\n this.dispose();\n }\n }\n }\n get isCancellationRequested() {\n return this._isCancelled;\n }\n get onCancellationRequested() {\n if (this._isCancelled) {\n return shortcutEvent;\n }\n if (!this._emitter) {\n this._emitter = new events_1.Emitter();\n }\n return this._emitter.event;\n }\n dispose() {\n if (this._emitter) {\n this._emitter.dispose();\n this._emitter = undefined;\n }\n }\n}\nclass CancellationTokenSource {\n get token() {\n if (!this._token) {\n // be lazy and create the token only when\n // actually needed\n this._token = new MutableToken();\n }\n return this._token;\n }\n cancel() {\n if (!this._token) {\n // save an object by returning the default\n // cancelled token when cancellation happens\n // before someone asks for the token\n this._token = CancellationToken.Cancelled;\n }\n else {\n this._token.cancel();\n }\n }\n dispose() {\n if (!this._token) {\n // ensure to initialize with an empty token if we had none\n this._token = CancellationToken.None;\n }\n else if (this._token instanceof MutableToken) {\n // actually dispose\n this._token.dispose();\n }\n }\n}\nexports.CancellationTokenSource = CancellationTokenSource;\n","\"use strict\";\n/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SharedArrayReceiverStrategy = exports.SharedArraySenderStrategy = void 0;\nconst cancellation_1 = require(\"./cancellation\");\nvar CancellationState;\n(function (CancellationState) {\n CancellationState.Continue = 0;\n CancellationState.Cancelled = 1;\n})(CancellationState || (CancellationState = {}));\nclass SharedArraySenderStrategy {\n constructor() {\n this.buffers = new Map();\n }\n enableCancellation(request) {\n if (request.id === null) {\n return;\n }\n const buffer = new SharedArrayBuffer(4);\n const data = new Int32Array(buffer, 0, 1);\n data[0] = CancellationState.Continue;\n this.buffers.set(request.id, buffer);\n request.$cancellationData = buffer;\n }\n async sendCancellation(_conn, id) {\n const buffer = this.buffers.get(id);\n if (buffer === undefined) {\n return;\n }\n const data = new Int32Array(buffer, 0, 1);\n Atomics.store(data, 0, CancellationState.Cancelled);\n }\n cleanup(id) {\n this.buffers.delete(id);\n }\n dispose() {\n this.buffers.clear();\n }\n}\nexports.SharedArraySenderStrategy = SharedArraySenderStrategy;\nclass SharedArrayBufferCancellationToken {\n constructor(buffer) {\n this.data = new Int32Array(buffer, 0, 1);\n }\n get isCancellationRequested() {\n return Atomics.load(this.data, 0) === CancellationState.Cancelled;\n }\n get onCancellationRequested() {\n throw new Error(`Cancellation over SharedArrayBuffer doesn't support cancellation events`);\n }\n}\nclass SharedArrayBufferCancellationTokenSource {\n constructor(buffer) {\n this.token = new SharedArrayBufferCancellationToken(buffer);\n }\n cancel() {\n }\n dispose() {\n }\n}\nclass SharedArrayReceiverStrategy {\n constructor() {\n this.kind = 'request';\n }\n createCancellationTokenSource(request) {\n const buffer = request.$cancellationData;\n if (buffer === undefined) {\n return new cancellation_1.CancellationTokenSource();\n }\n return new SharedArrayBufferCancellationTokenSource(buffer);\n }\n}\nexports.SharedArrayReceiverStrategy = SharedArrayReceiverStrategy;\n","\"use strict\";\n/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Semaphore = void 0;\nconst ral_1 = require(\"./ral\");\nclass Semaphore {\n constructor(capacity = 1) {\n if (capacity <= 0) {\n throw new Error('Capacity must be greater than 0');\n }\n this._capacity = capacity;\n this._active = 0;\n this._waiting = [];\n }\n lock(thunk) {\n return new Promise((resolve, reject) => {\n this._waiting.push({ thunk, resolve, reject });\n this.runNext();\n });\n }\n get active() {\n return this._active;\n }\n runNext() {\n if (this._waiting.length === 0 || this._active === this._capacity) {\n return;\n }\n (0, ral_1.default)().timer.setImmediate(() => this.doRunNext());\n }\n doRunNext() {\n if (this._waiting.length === 0 || this._active === this._capacity) {\n return;\n }\n const next = this._waiting.shift();\n this._active++;\n if (this._active > this._capacity) {\n throw new Error(`To many thunks active`);\n }\n try {\n const result = next.thunk();\n if (result instanceof Promise) {\n result.then((value) => {\n this._active--;\n next.resolve(value);\n this.runNext();\n }, (err) => {\n this._active--;\n next.reject(err);\n this.runNext();\n });\n }\n else {\n this._active--;\n next.resolve(result);\n this.runNext();\n }\n }\n catch (err) {\n this._active--;\n next.reject(err);\n this.runNext();\n }\n }\n}\nexports.Semaphore = Semaphore;\n","\"use strict\";\n/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ReadableStreamMessageReader = exports.AbstractMessageReader = exports.MessageReader = void 0;\nconst ral_1 = require(\"./ral\");\nconst Is = require(\"./is\");\nconst events_1 = require(\"./events\");\nconst semaphore_1 = require(\"./semaphore\");\nvar MessageReader;\n(function (MessageReader) {\n function is(value) {\n let candidate = value;\n return candidate && Is.func(candidate.listen) && Is.func(candidate.dispose) &&\n Is.func(candidate.onError) && Is.func(candidate.onClose) && Is.func(candidate.onPartialMessage);\n }\n MessageReader.is = is;\n})(MessageReader || (exports.MessageReader = MessageReader = {}));\nclass AbstractMessageReader {\n constructor() {\n this.errorEmitter = new events_1.Emitter();\n this.closeEmitter = new events_1.Emitter();\n this.partialMessageEmitter = new events_1.Emitter();\n }\n dispose() {\n this.errorEmitter.dispose();\n this.closeEmitter.dispose();\n }\n get onError() {\n return this.errorEmitter.event;\n }\n fireError(error) {\n this.errorEmitter.fire(this.asError(error));\n }\n get onClose() {\n return this.closeEmitter.event;\n }\n fireClose() {\n this.closeEmitter.fire(undefined);\n }\n get onPartialMessage() {\n return this.partialMessageEmitter.event;\n }\n firePartialMessage(info) {\n this.partialMessageEmitter.fire(info);\n }\n asError(error) {\n if (error instanceof Error) {\n return error;\n }\n else {\n return new Error(`Reader received error. Reason: ${Is.string(error.message) ? error.message : 'unknown'}`);\n }\n }\n}\nexports.AbstractMessageReader = AbstractMessageReader;\nvar ResolvedMessageReaderOptions;\n(function (ResolvedMessageReaderOptions) {\n function fromOptions(options) {\n let charset;\n let result;\n let contentDecoder;\n const contentDecoders = new Map();\n let contentTypeDecoder;\n const contentTypeDecoders = new Map();\n if (options === undefined || typeof options === 'string') {\n charset = options ?? 'utf-8';\n }\n else {\n charset = options.charset ?? 'utf-8';\n if (options.contentDecoder !== undefined) {\n contentDecoder = options.contentDecoder;\n contentDecoders.set(contentDecoder.name, contentDecoder);\n }\n if (options.contentDecoders !== undefined) {\n for (const decoder of options.contentDecoders) {\n contentDecoders.set(decoder.name, decoder);\n }\n }\n if (options.contentTypeDecoder !== undefined) {\n contentTypeDecoder = options.contentTypeDecoder;\n contentTypeDecoders.set(contentTypeDecoder.name, contentTypeDecoder);\n }\n if (options.contentTypeDecoders !== undefined) {\n for (const decoder of options.contentTypeDecoders) {\n contentTypeDecoders.set(decoder.name, decoder);\n }\n }\n }\n if (contentTypeDecoder === undefined) {\n contentTypeDecoder = (0, ral_1.default)().applicationJson.decoder;\n contentTypeDecoders.set(contentTypeDecoder.name, contentTypeDecoder);\n }\n return { charset, contentDecoder, contentDecoders, contentTypeDecoder, contentTypeDecoders };\n }\n ResolvedMessageReaderOptions.fromOptions = fromOptions;\n})(ResolvedMessageReaderOptions || (ResolvedMessageReaderOptions = {}));\nclass ReadableStreamMessageReader extends AbstractMessageReader {\n constructor(readable, options) {\n super();\n this.readable = readable;\n this.options = ResolvedMessageReaderOptions.fromOptions(options);\n this.buffer = (0, ral_1.default)().messageBuffer.create(this.options.charset);\n this._partialMessageTimeout = 10000;\n this.nextMessageLength = -1;\n this.messageToken = 0;\n this.readSemaphore = new semaphore_1.Semaphore(1);\n }\n set partialMessageTimeout(timeout) {\n this._partialMessageTimeout = timeout;\n }\n get partialMessageTimeout() {\n return this._partialMessageTimeout;\n }\n listen(callback) {\n this.nextMessageLength = -1;\n this.messageToken = 0;\n this.partialMessageTimer = undefined;\n this.callback = callback;\n const result = this.readable.onData((data) => {\n this.onData(data);\n });\n this.readable.onError((error) => this.fireError(error));\n this.readable.onClose(() => this.fireClose());\n return result;\n }\n onData(data) {\n try {\n this.buffer.append(data);\n while (true) {\n if (this.nextMessageLength === -1) {\n const headers = this.buffer.tryReadHeaders(true);\n if (!headers) {\n return;\n }\n const contentLength = headers.get('content-length');\n if (!contentLength) {\n this.fireError(new Error(`Header must provide a Content-Length property.\\n${JSON.stringify(Object.fromEntries(headers))}`));\n return;\n }\n const length = parseInt(contentLength);\n if (isNaN(length)) {\n this.fireError(new Error(`Content-Length value must be a number. Got ${contentLength}`));\n return;\n }\n this.nextMessageLength = length;\n }\n const body = this.buffer.tryReadBody(this.nextMessageLength);\n if (body === undefined) {\n /** We haven't received the full message yet. */\n this.setPartialMessageTimer();\n return;\n }\n this.clearPartialMessageTimer();\n this.nextMessageLength = -1;\n // Make sure that we convert one received message after the\n // other. Otherwise it could happen that a decoding of a second\n // smaller message finished before the decoding of a first larger\n // message and then we would deliver the second message first.\n this.readSemaphore.lock(async () => {\n const bytes = this.options.contentDecoder !== undefined\n ? await this.options.contentDecoder.decode(body)\n : body;\n const message = await this.options.contentTypeDecoder.decode(bytes, this.options);\n this.callback(message);\n }).catch((error) => {\n this.fireError(error);\n });\n }\n }\n catch (error) {\n this.fireError(error);\n }\n }\n clearPartialMessageTimer() {\n if (this.partialMessageTimer) {\n this.partialMessageTimer.dispose();\n this.partialMessageTimer = undefined;\n }\n }\n setPartialMessageTimer() {\n this.clearPartialMessageTimer();\n if (this._partialMessageTimeout <= 0) {\n return;\n }\n this.partialMessageTimer = (0, ral_1.default)().timer.setTimeout((token, timeout) => {\n this.partialMessageTimer = undefined;\n if (token === this.messageToken) {\n this.firePartialMessage({ messageToken: token, waitingTime: timeout });\n this.setPartialMessageTimer();\n }\n }, this._partialMessageTimeout, this.messageToken, this._partialMessageTimeout);\n }\n}\nexports.ReadableStreamMessageReader = ReadableStreamMessageReader;\n","\"use strict\";\n/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.WriteableStreamMessageWriter = exports.AbstractMessageWriter = exports.MessageWriter = void 0;\nconst ral_1 = require(\"./ral\");\nconst Is = require(\"./is\");\nconst semaphore_1 = require(\"./semaphore\");\nconst events_1 = require(\"./events\");\nconst ContentLength = 'Content-Length: ';\nconst CRLF = '\\r\\n';\nvar MessageWriter;\n(function (MessageWriter) {\n function is(value) {\n let candidate = value;\n return candidate && Is.func(candidate.dispose) && Is.func(candidate.onClose) &&\n Is.func(candidate.onError) && Is.func(candidate.write);\n }\n MessageWriter.is = is;\n})(MessageWriter || (exports.MessageWriter = MessageWriter = {}));\nclass AbstractMessageWriter {\n constructor() {\n this.errorEmitter = new events_1.Emitter();\n this.closeEmitter = new events_1.Emitter();\n }\n dispose() {\n this.errorEmitter.dispose();\n this.closeEmitter.dispose();\n }\n get onError() {\n return this.errorEmitter.event;\n }\n fireError(error, message, count) {\n this.errorEmitter.fire([this.asError(error), message, count]);\n }\n get onClose() {\n return this.closeEmitter.event;\n }\n fireClose() {\n this.closeEmitter.fire(undefined);\n }\n asError(error) {\n if (error instanceof Error) {\n return error;\n }\n else {\n return new Error(`Writer received error. Reason: ${Is.string(error.message) ? error.message : 'unknown'}`);\n }\n }\n}\nexports.AbstractMessageWriter = AbstractMessageWriter;\nvar ResolvedMessageWriterOptions;\n(function (ResolvedMessageWriterOptions) {\n function fromOptions(options) {\n if (options === undefined || typeof options === 'string') {\n return { charset: options ?? 'utf-8', contentTypeEncoder: (0, ral_1.default)().applicationJson.encoder };\n }\n else {\n return { charset: options.charset ?? 'utf-8', contentEncoder: options.contentEncoder, contentTypeEncoder: options.contentTypeEncoder ?? (0, ral_1.default)().applicationJson.encoder };\n }\n }\n ResolvedMessageWriterOptions.fromOptions = fromOptions;\n})(ResolvedMessageWriterOptions || (ResolvedMessageWriterOptions = {}));\nclass WriteableStreamMessageWriter extends AbstractMessageWriter {\n constructor(writable, options) {\n super();\n this.writable = writable;\n this.options = ResolvedMessageWriterOptions.fromOptions(options);\n this.errorCount = 0;\n this.writeSemaphore = new semaphore_1.Semaphore(1);\n this.writable.onError((error) => this.fireError(error));\n this.writable.onClose(() => this.fireClose());\n }\n async write(msg) {\n return this.writeSemaphore.lock(async () => {\n const payload = this.options.contentTypeEncoder.encode(msg, this.options).then((buffer) => {\n if (this.options.contentEncoder !== undefined) {\n return this.options.contentEncoder.encode(buffer);\n }\n else {\n return buffer;\n }\n });\n return payload.then((buffer) => {\n const headers = [];\n headers.push(ContentLength, buffer.byteLength.toString(), CRLF);\n headers.push(CRLF);\n return this.doWrite(msg, headers, buffer);\n }, (error) => {\n this.fireError(error);\n throw error;\n });\n });\n }\n async doWrite(msg, headers, data) {\n try {\n await this.writable.write(headers.join(''), 'ascii');\n return this.writable.write(data);\n }\n catch (error) {\n this.handleError(error, msg);\n return Promise.reject(error);\n }\n }\n handleError(error, msg) {\n this.errorCount++;\n this.fireError(error, msg, this.errorCount);\n }\n end() {\n this.writable.end();\n }\n}\nexports.WriteableStreamMessageWriter = WriteableStreamMessageWriter;\n","\"use strict\";\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.AbstractMessageBuffer = void 0;\nconst CR = 13;\nconst LF = 10;\nconst CRLF = '\\r\\n';\nclass AbstractMessageBuffer {\n constructor(encoding = 'utf-8') {\n this._encoding = encoding;\n this._chunks = [];\n this._totalLength = 0;\n }\n get encoding() {\n return this._encoding;\n }\n append(chunk) {\n const toAppend = typeof chunk === 'string' ? this.fromString(chunk, this._encoding) : chunk;\n this._chunks.push(toAppend);\n this._totalLength += toAppend.byteLength;\n }\n tryReadHeaders(lowerCaseKeys = false) {\n if (this._chunks.length === 0) {\n return undefined;\n }\n let state = 0;\n let chunkIndex = 0;\n let offset = 0;\n let chunkBytesRead = 0;\n row: while (chunkIndex < this._chunks.length) {\n const chunk = this._chunks[chunkIndex];\n offset = 0;\n column: while (offset < chunk.length) {\n const value = chunk[offset];\n switch (value) {\n case CR:\n switch (state) {\n case 0:\n state = 1;\n break;\n case 2:\n state = 3;\n break;\n default:\n state = 0;\n }\n break;\n case LF:\n switch (state) {\n case 1:\n state = 2;\n break;\n case 3:\n state = 4;\n offset++;\n break row;\n default:\n state = 0;\n }\n break;\n default:\n state = 0;\n }\n offset++;\n }\n chunkBytesRead += chunk.byteLength;\n chunkIndex++;\n }\n if (state !== 4) {\n return undefined;\n }\n // The buffer contains the two CRLF at the end. So we will\n // have two empty lines after the split at the end as well.\n const buffer = this._read(chunkBytesRead + offset);\n const result = new Map();\n const headers = this.toString(buffer, 'ascii').split(CRLF);\n if (headers.length < 2) {\n return result;\n }\n for (let i = 0; i < headers.length - 2; i++) {\n const header = headers[i];\n const index = header.indexOf(':');\n if (index === -1) {\n throw new Error(`Message header must separate key and value using ':'\\n${header}`);\n }\n const key = header.substr(0, index);\n const value = header.substr(index + 1).trim();\n result.set(lowerCaseKeys ? key.toLowerCase() : key, value);\n }\n return result;\n }\n tryReadBody(length) {\n if (this._totalLength < length) {\n return undefined;\n }\n return this._read(length);\n }\n get numberOfBytes() {\n return this._totalLength;\n }\n _read(byteCount) {\n if (byteCount === 0) {\n return this.emptyBuffer();\n }\n if (byteCount > this._totalLength) {\n throw new Error(`Cannot read so many bytes!`);\n }\n if (this._chunks[0].byteLength === byteCount) {\n // super fast path, precisely first chunk must be returned\n const chunk = this._chunks[0];\n this._chunks.shift();\n this._totalLength -= byteCount;\n return this.asNative(chunk);\n }\n if (this._chunks[0].byteLength > byteCount) {\n // fast path, the reading is entirely within the first chunk\n const chunk = this._chunks[0];\n const result = this.asNative(chunk, byteCount);\n this._chunks[0] = chunk.slice(byteCount);\n this._totalLength -= byteCount;\n return result;\n }\n const result = this.allocNative(byteCount);\n let resultOffset = 0;\n let chunkIndex = 0;\n while (byteCount > 0) {\n const chunk = this._chunks[chunkIndex];\n if (chunk.byteLength > byteCount) {\n // this chunk will survive\n const chunkPart = chunk.slice(0, byteCount);\n result.set(chunkPart, resultOffset);\n resultOffset += byteCount;\n this._chunks[chunkIndex] = chunk.slice(byteCount);\n this._totalLength -= byteCount;\n byteCount -= byteCount;\n }\n else {\n // this chunk will be entirely read\n result.set(chunk, resultOffset);\n resultOffset += chunk.byteLength;\n this._chunks.shift();\n this._totalLength -= chunk.byteLength;\n byteCount -= chunk.byteLength;\n }\n }\n return result;\n }\n}\nexports.AbstractMessageBuffer = AbstractMessageBuffer;\n","\"use strict\";\n/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.createMessageConnection = exports.ConnectionOptions = exports.MessageStrategy = exports.CancellationStrategy = exports.CancellationSenderStrategy = exports.CancellationReceiverStrategy = exports.RequestCancellationReceiverStrategy = exports.IdCancellationReceiverStrategy = exports.ConnectionStrategy = exports.ConnectionError = exports.ConnectionErrors = exports.LogTraceNotification = exports.SetTraceNotification = exports.TraceFormat = exports.TraceValues = exports.Trace = exports.NullLogger = exports.ProgressType = exports.ProgressToken = void 0;\nconst ral_1 = require(\"./ral\");\nconst Is = require(\"./is\");\nconst messages_1 = require(\"./messages\");\nconst linkedMap_1 = require(\"./linkedMap\");\nconst events_1 = require(\"./events\");\nconst cancellation_1 = require(\"./cancellation\");\nvar CancelNotification;\n(function (CancelNotification) {\n CancelNotification.type = new messages_1.NotificationType('$/cancelRequest');\n})(CancelNotification || (CancelNotification = {}));\nvar ProgressToken;\n(function (ProgressToken) {\n function is(value) {\n return typeof value === 'string' || typeof value === 'number';\n }\n ProgressToken.is = is;\n})(ProgressToken || (exports.ProgressToken = ProgressToken = {}));\nvar ProgressNotification;\n(function (ProgressNotification) {\n ProgressNotification.type = new messages_1.NotificationType('$/progress');\n})(ProgressNotification || (ProgressNotification = {}));\nclass ProgressType {\n constructor() {\n }\n}\nexports.ProgressType = ProgressType;\nvar StarRequestHandler;\n(function (StarRequestHandler) {\n function is(value) {\n return Is.func(value);\n }\n StarRequestHandler.is = is;\n})(StarRequestHandler || (StarRequestHandler = {}));\nexports.NullLogger = Object.freeze({\n error: () => { },\n warn: () => { },\n info: () => { },\n log: () => { }\n});\nvar Trace;\n(function (Trace) {\n Trace[Trace[\"Off\"] = 0] = \"Off\";\n Trace[Trace[\"Messages\"] = 1] = \"Messages\";\n Trace[Trace[\"Compact\"] = 2] = \"Compact\";\n Trace[Trace[\"Verbose\"] = 3] = \"Verbose\";\n})(Trace || (exports.Trace = Trace = {}));\nvar TraceValues;\n(function (TraceValues) {\n /**\n * Turn tracing off.\n */\n TraceValues.Off = 'off';\n /**\n * Trace messages only.\n */\n TraceValues.Messages = 'messages';\n /**\n * Compact message tracing.\n */\n TraceValues.Compact = 'compact';\n /**\n * Verbose message tracing.\n */\n TraceValues.Verbose = 'verbose';\n})(TraceValues || (exports.TraceValues = TraceValues = {}));\n(function (Trace) {\n function fromString(value) {\n if (!Is.string(value)) {\n return Trace.Off;\n }\n value = value.toLowerCase();\n switch (value) {\n case 'off':\n return Trace.Off;\n case 'messages':\n return Trace.Messages;\n case 'compact':\n return Trace.Compact;\n case 'verbose':\n return Trace.Verbose;\n default:\n return Trace.Off;\n }\n }\n Trace.fromString = fromString;\n function toString(value) {\n switch (value) {\n case Trace.Off:\n return 'off';\n case Trace.Messages:\n return 'messages';\n case Trace.Compact:\n return 'compact';\n case Trace.Verbose:\n return 'verbose';\n default:\n return 'off';\n }\n }\n Trace.toString = toString;\n})(Trace || (exports.Trace = Trace = {}));\nvar TraceFormat;\n(function (TraceFormat) {\n TraceFormat[\"Text\"] = \"text\";\n TraceFormat[\"JSON\"] = \"json\";\n})(TraceFormat || (exports.TraceFormat = TraceFormat = {}));\n(function (TraceFormat) {\n function fromString(value) {\n if (!Is.string(value)) {\n return TraceFormat.Text;\n }\n value = value.toLowerCase();\n if (value === 'json') {\n return TraceFormat.JSON;\n }\n else {\n return TraceFormat.Text;\n }\n }\n TraceFormat.fromString = fromString;\n})(TraceFormat || (exports.TraceFormat = TraceFormat = {}));\nvar SetTraceNotification;\n(function (SetTraceNotification) {\n SetTraceNotification.type = new messages_1.NotificationType('$/setTrace');\n})(SetTraceNotification || (exports.SetTraceNotification = SetTraceNotification = {}));\nvar LogTraceNotification;\n(function (LogTraceNotification) {\n LogTraceNotification.type = new messages_1.NotificationType('$/logTrace');\n})(LogTraceNotification || (exports.LogTraceNotification = LogTraceNotification = {}));\nvar ConnectionErrors;\n(function (ConnectionErrors) {\n /**\n * The connection is closed.\n */\n ConnectionErrors[ConnectionErrors[\"Closed\"] = 1] = \"Closed\";\n /**\n * The connection got disposed.\n */\n ConnectionErrors[ConnectionErrors[\"Disposed\"] = 2] = \"Disposed\";\n /**\n * The connection is already in listening mode.\n */\n ConnectionErrors[ConnectionErrors[\"AlreadyListening\"] = 3] = \"AlreadyListening\";\n})(ConnectionErrors || (exports.ConnectionErrors = ConnectionErrors = {}));\nclass ConnectionError extends Error {\n constructor(code, message) {\n super(message);\n this.code = code;\n Object.setPrototypeOf(this, ConnectionError.prototype);\n }\n}\nexports.ConnectionError = ConnectionError;\nvar ConnectionStrategy;\n(function (ConnectionStrategy) {\n function is(value) {\n const candidate = value;\n return candidate && Is.func(candidate.cancelUndispatched);\n }\n ConnectionStrategy.is = is;\n})(ConnectionStrategy || (exports.ConnectionStrategy = ConnectionStrategy = {}));\nvar IdCancellationReceiverStrategy;\n(function (IdCancellationReceiverStrategy) {\n function is(value) {\n const candidate = value;\n return candidate && (candidate.kind === undefined || candidate.kind === 'id') && Is.func(candidate.createCancellationTokenSource) && (candidate.dispose === undefined || Is.func(candidate.dispose));\n }\n IdCancellationReceiverStrategy.is = is;\n})(IdCancellationReceiverStrategy || (exports.IdCancellationReceiverStrategy = IdCancellationReceiverStrategy = {}));\nvar RequestCancellationReceiverStrategy;\n(function (RequestCancellationReceiverStrategy) {\n function is(value) {\n const candidate = value;\n return candidate && candidate.kind === 'request' && Is.func(candidate.createCancellationTokenSource) && (candidate.dispose === undefined || Is.func(candidate.dispose));\n }\n RequestCancellationReceiverStrategy.is = is;\n})(RequestCancellationReceiverStrategy || (exports.RequestCancellationReceiverStrategy = RequestCancellationReceiverStrategy = {}));\nvar CancellationReceiverStrategy;\n(function (CancellationReceiverStrategy) {\n CancellationReceiverStrategy.Message = Object.freeze({\n createCancellationTokenSource(_) {\n return new cancellation_1.CancellationTokenSource();\n }\n });\n function is(value) {\n return IdCancellationReceiverStrategy.is(value) || RequestCancellationReceiverStrategy.is(value);\n }\n CancellationReceiverStrategy.is = is;\n})(CancellationReceiverStrategy || (exports.CancellationReceiverStrategy = CancellationReceiverStrategy = {}));\nvar CancellationSenderStrategy;\n(function (CancellationSenderStrategy) {\n CancellationSenderStrategy.Message = Object.freeze({\n sendCancellation(conn, id) {\n return conn.sendNotification(CancelNotification.type, { id });\n },\n cleanup(_) { }\n });\n function is(value) {\n const candidate = value;\n return candidate && Is.func(candidate.sendCancellation) && Is.func(candidate.cleanup);\n }\n CancellationSenderStrategy.is = is;\n})(CancellationSenderStrategy || (exports.CancellationSenderStrategy = CancellationSenderStrategy = {}));\nvar CancellationStrategy;\n(function (CancellationStrategy) {\n CancellationStrategy.Message = Object.freeze({\n receiver: CancellationReceiverStrategy.Message,\n sender: CancellationSenderStrategy.Message\n });\n function is(value) {\n const candidate = value;\n return candidate && CancellationReceiverStrategy.is(candidate.receiver) && CancellationSenderStrategy.is(candidate.sender);\n }\n CancellationStrategy.is = is;\n})(CancellationStrategy || (exports.CancellationStrategy = CancellationStrategy = {}));\nvar MessageStrategy;\n(function (MessageStrategy) {\n function is(value) {\n const candidate = value;\n return candidate && Is.func(candidate.handleMessage);\n }\n MessageStrategy.is = is;\n})(MessageStrategy || (exports.MessageStrategy = MessageStrategy = {}));\nvar ConnectionOptions;\n(function (ConnectionOptions) {\n function is(value) {\n const candidate = value;\n return candidate && (CancellationStrategy.is(candidate.cancellationStrategy) || ConnectionStrategy.is(candidate.connectionStrategy) || MessageStrategy.is(candidate.messageStrategy));\n }\n ConnectionOptions.is = is;\n})(ConnectionOptions || (exports.ConnectionOptions = ConnectionOptions = {}));\nvar ConnectionState;\n(function (ConnectionState) {\n ConnectionState[ConnectionState[\"New\"] = 1] = \"New\";\n ConnectionState[ConnectionState[\"Listening\"] = 2] = \"Listening\";\n ConnectionState[ConnectionState[\"Closed\"] = 3] = \"Closed\";\n ConnectionState[ConnectionState[\"Disposed\"] = 4] = \"Disposed\";\n})(ConnectionState || (ConnectionState = {}));\nfunction createMessageConnection(messageReader, messageWriter, _logger, options) {\n const logger = _logger !== undefined ? _logger : exports.NullLogger;\n let sequenceNumber = 0;\n let notificationSequenceNumber = 0;\n let unknownResponseSequenceNumber = 0;\n const version = '2.0';\n let starRequestHandler = undefined;\n const requestHandlers = new Map();\n let starNotificationHandler = undefined;\n const notificationHandlers = new Map();\n const progressHandlers = new Map();\n let timer;\n let messageQueue = new linkedMap_1.LinkedMap();\n let responsePromises = new Map();\n let knownCanceledRequests = new Set();\n let requestTokens = new Map();\n let trace = Trace.Off;\n let traceFormat = TraceFormat.Text;\n let tracer;\n let state = ConnectionState.New;\n const errorEmitter = new events_1.Emitter();\n const closeEmitter = new events_1.Emitter();\n const unhandledNotificationEmitter = new events_1.Emitter();\n const unhandledProgressEmitter = new events_1.Emitter();\n const disposeEmitter = new events_1.Emitter();\n const cancellationStrategy = (options && options.cancellationStrategy) ? options.cancellationStrategy : CancellationStrategy.Message;\n function createRequestQueueKey(id) {\n if (id === null) {\n throw new Error(`Can't send requests with id null since the response can't be correlated.`);\n }\n return 'req-' + id.toString();\n }\n function createResponseQueueKey(id) {\n if (id === null) {\n return 'res-unknown-' + (++unknownResponseSequenceNumber).toString();\n }\n else {\n return 'res-' + id.toString();\n }\n }\n function createNotificationQueueKey() {\n return 'not-' + (++notificationSequenceNumber).toString();\n }\n function addMessageToQueue(queue, message) {\n if (messages_1.Message.isRequest(message)) {\n queue.set(createRequestQueueKey(message.id), message);\n }\n else if (messages_1.Message.isResponse(message)) {\n queue.set(createResponseQueueKey(message.id), message);\n }\n else {\n queue.set(createNotificationQueueKey(), message);\n }\n }\n function cancelUndispatched(_message) {\n return undefined;\n }\n function isListening() {\n return state === ConnectionState.Listening;\n }\n function isClosed() {\n return state === ConnectionState.Closed;\n }\n function isDisposed() {\n return state === ConnectionState.Disposed;\n }\n function closeHandler() {\n if (state === ConnectionState.New || state === ConnectionState.Listening) {\n state = ConnectionState.Closed;\n closeEmitter.fire(undefined);\n }\n // If the connection is disposed don't sent close events.\n }\n function readErrorHandler(error) {\n errorEmitter.fire([error, undefined, undefined]);\n }\n function writeErrorHandler(data) {\n errorEmitter.fire(data);\n }\n messageReader.onClose(closeHandler);\n messageReader.onError(readErrorHandler);\n messageWriter.onClose(closeHandler);\n messageWriter.onError(writeErrorHandler);\n function triggerMessageQueue() {\n if (timer || messageQueue.size === 0) {\n return;\n }\n timer = (0, ral_1.default)().timer.setImmediate(() => {\n timer = undefined;\n processMessageQueue();\n });\n }\n function handleMessage(message) {\n if (messages_1.Message.isRequest(message)) {\n handleRequest(message);\n }\n else if (messages_1.Message.isNotification(message)) {\n handleNotification(message);\n }\n else if (messages_1.Message.isResponse(message)) {\n handleResponse(message);\n }\n else {\n handleInvalidMessage(message);\n }\n }\n function processMessageQueue() {\n if (messageQueue.size === 0) {\n return;\n }\n const message = messageQueue.shift();\n try {\n const messageStrategy = options?.messageStrategy;\n if (MessageStrategy.is(messageStrategy)) {\n messageStrategy.handleMessage(message, handleMessage);\n }\n else {\n handleMessage(message);\n }\n }\n finally {\n triggerMessageQueue();\n }\n }\n const callback = (message) => {\n try {\n // We have received a cancellation message. Check if the message is still in the queue\n // and cancel it if allowed to do so.\n if (messages_1.Message.isNotification(message) && message.method === CancelNotification.type.method) {\n const cancelId = message.params.id;\n const key = createRequestQueueKey(cancelId);\n const toCancel = messageQueue.get(key);\n if (messages_1.Message.isRequest(toCancel)) {\n const strategy = options?.connectionStrategy;\n const response = (strategy && strategy.cancelUndispatched) ? strategy.cancelUndispatched(toCancel, cancelUndispatched) : cancelUndispatched(toCancel);\n if (response && (response.error !== undefined || response.result !== undefined)) {\n messageQueue.delete(key);\n requestTokens.delete(cancelId);\n response.id = toCancel.id;\n traceSendingResponse(response, message.method, Date.now());\n messageWriter.write(response).catch(() => logger.error(`Sending response for canceled message failed.`));\n return;\n }\n }\n const cancellationToken = requestTokens.get(cancelId);\n // The request is already running. Cancel the token\n if (cancellationToken !== undefined) {\n cancellationToken.cancel();\n traceReceivedNotification(message);\n return;\n }\n else {\n // Remember the cancel but still queue the message to\n // clean up state in process message.\n knownCanceledRequests.add(cancelId);\n }\n }\n addMessageToQueue(messageQueue, message);\n }\n finally {\n triggerMessageQueue();\n }\n };\n function handleRequest(requestMessage) {\n if (isDisposed()) {\n // we return here silently since we fired an event when the\n // connection got disposed.\n return;\n }\n function reply(resultOrError, method, startTime) {\n const message = {\n jsonrpc: version,\n id: requestMessage.id\n };\n if (resultOrError instanceof messages_1.ResponseError) {\n message.error = resultOrError.toJson();\n }\n else {\n message.result = resultOrError === undefined ? null : resultOrError;\n }\n traceSendingResponse(message, method, startTime);\n messageWriter.write(message).catch(() => logger.error(`Sending response failed.`));\n }\n function replyError(error, method, startTime) {\n const message = {\n jsonrpc: version,\n id: requestMessage.id,\n error: error.toJson()\n };\n traceSendingResponse(message, method, startTime);\n messageWriter.write(message).catch(() => logger.error(`Sending response failed.`));\n }\n function replySuccess(result, method, startTime) {\n // The JSON RPC defines that a response must either have a result or an error\n // So we can't treat undefined as a valid response result.\n if (result === undefined) {\n result = null;\n }\n const message = {\n jsonrpc: version,\n id: requestMessage.id,\n result: result\n };\n traceSendingResponse(message, method, startTime);\n messageWriter.write(message).catch(() => logger.error(`Sending response failed.`));\n }\n traceReceivedRequest(requestMessage);\n const element = requestHandlers.get(requestMessage.method);\n let type;\n let requestHandler;\n if (element) {\n type = element.type;\n requestHandler = element.handler;\n }\n const startTime = Date.now();\n if (requestHandler || starRequestHandler) {\n const tokenKey = requestMessage.id ?? String(Date.now()); //\n const cancellationSource = IdCancellationReceiverStrategy.is(cancellationStrategy.receiver)\n ? cancellationStrategy.receiver.createCancellationTokenSource(tokenKey)\n : cancellationStrategy.receiver.createCancellationTokenSource(requestMessage);\n if (requestMessage.id !== null && knownCanceledRequests.has(requestMessage.id)) {\n cancellationSource.cancel();\n }\n if (requestMessage.id !== null) {\n requestTokens.set(tokenKey, cancellationSource);\n }\n try {\n let handlerResult;\n if (requestHandler) {\n if (requestMessage.params === undefined) {\n if (type !== undefined && type.numberOfParams !== 0) {\n replyError(new messages_1.ResponseError(messages_1.ErrorCodes.InvalidParams, `Request ${requestMessage.method} defines ${type.numberOfParams} params but received none.`), requestMessage.method, startTime);\n return;\n }\n handlerResult = requestHandler(cancellationSource.token);\n }\n else if (Array.isArray(requestMessage.params)) {\n if (type !== undefined && type.parameterStructures === messages_1.ParameterStructures.byName) {\n replyError(new messages_1.ResponseError(messages_1.ErrorCodes.InvalidParams, `Request ${requestMessage.method} defines parameters by name but received parameters by position`), requestMessage.method, startTime);\n return;\n }\n handlerResult = requestHandler(...requestMessage.params, cancellationSource.token);\n }\n else {\n if (type !== undefined && type.parameterStructures === messages_1.ParameterStructures.byPosition) {\n replyError(new messages_1.ResponseError(messages_1.ErrorCodes.InvalidParams, `Request ${requestMessage.method} defines parameters by position but received parameters by name`), requestMessage.method, startTime);\n return;\n }\n handlerResult = requestHandler(requestMessage.params, cancellationSource.token);\n }\n }\n else if (starRequestHandler) {\n handlerResult = starRequestHandler(requestMessage.method, requestMessage.params, cancellationSource.token);\n }\n const promise = handlerResult;\n if (!handlerResult) {\n requestTokens.delete(tokenKey);\n replySuccess(handlerResult, requestMessage.method, startTime);\n }\n else if (promise.then) {\n promise.then((resultOrError) => {\n requestTokens.delete(tokenKey);\n reply(resultOrError, requestMessage.method, startTime);\n }, error => {\n requestTokens.delete(tokenKey);\n if (error instanceof messages_1.ResponseError) {\n replyError(error, requestMessage.method, startTime);\n }\n else if (error && Is.string(error.message)) {\n replyError(new messages_1.ResponseError(messages_1.ErrorCodes.InternalError, `Request ${requestMessage.method} failed with message: ${error.message}`), requestMessage.method, startTime);\n }\n else {\n replyError(new messages_1.ResponseError(messages_1.ErrorCodes.InternalError, `Request ${requestMessage.method} failed unexpectedly without providing any details.`), requestMessage.method, startTime);\n }\n });\n }\n else {\n requestTokens.delete(tokenKey);\n reply(handlerResult, requestMessage.method, startTime);\n }\n }\n catch (error) {\n requestTokens.delete(tokenKey);\n if (error instanceof messages_1.ResponseError) {\n reply(error, requestMessage.method, startTime);\n }\n else if (error && Is.string(error.message)) {\n replyError(new messages_1.ResponseError(messages_1.ErrorCodes.InternalError, `Request ${requestMessage.method} failed with message: ${error.message}`), requestMessage.method, startTime);\n }\n else {\n replyError(new messages_1.ResponseError(messages_1.ErrorCodes.InternalError, `Request ${requestMessage.method} failed unexpectedly without providing any details.`), requestMessage.method, startTime);\n }\n }\n }\n else {\n replyError(new messages_1.ResponseError(messages_1.ErrorCodes.MethodNotFound, `Unhandled method ${requestMessage.method}`), requestMessage.method, startTime);\n }\n }\n function handleResponse(responseMessage) {\n if (isDisposed()) {\n // See handle request.\n return;\n }\n if (responseMessage.id === null) {\n if (responseMessage.error) {\n logger.error(`Received response message without id: Error is: \\n${JSON.stringify(responseMessage.error, undefined, 4)}`);\n }\n else {\n logger.error(`Received response message without id. No further error information provided.`);\n }\n }\n else {\n const key = responseMessage.id;\n const responsePromise = responsePromises.get(key);\n traceReceivedResponse(responseMessage, responsePromise);\n if (responsePromise !== undefined) {\n responsePromises.delete(key);\n try {\n if (responseMessage.error) {\n const error = responseMessage.error;\n responsePromise.reject(new messages_1.ResponseError(error.code, error.message, error.data));\n }\n else if (responseMessage.result !== undefined) {\n responsePromise.resolve(responseMessage.result);\n }\n else {\n throw new Error('Should never happen.');\n }\n }\n catch (error) {\n if (error.message) {\n logger.error(`Response handler '${responsePromise.method}' failed with message: ${error.message}`);\n }\n else {\n logger.error(`Response handler '${responsePromise.method}' failed unexpectedly.`);\n }\n }\n }\n }\n }\n function handleNotification(message) {\n if (isDisposed()) {\n // See handle request.\n return;\n }\n let type = undefined;\n let notificationHandler;\n if (message.method === CancelNotification.type.method) {\n const cancelId = message.params.id;\n knownCanceledRequests.delete(cancelId);\n traceReceivedNotification(message);\n return;\n }\n else {\n const element = notificationHandlers.get(message.method);\n if (element) {\n notificationHandler = element.handler;\n type = element.type;\n }\n }\n if (notificationHandler || starNotificationHandler) {\n try {\n traceReceivedNotification(message);\n if (notificationHandler) {\n if (message.params === undefined) {\n if (type !== undefined) {\n if (type.numberOfParams !== 0 && type.parameterStructures !== messages_1.ParameterStructures.byName) {\n logger.error(`Notification ${message.method} defines ${type.numberOfParams} params but received none.`);\n }\n }\n notificationHandler();\n }\n else if (Array.isArray(message.params)) {\n // There are JSON-RPC libraries that send progress message as positional params although\n // specified as named. So convert them if this is the case.\n const params = message.params;\n if (message.method === ProgressNotification.type.method && params.length === 2 && ProgressToken.is(params[0])) {\n notificationHandler({ token: params[0], value: params[1] });\n }\n else {\n if (type !== undefined) {\n if (type.parameterStructures === messages_1.ParameterStructures.byName) {\n logger.error(`Notification ${message.method} defines parameters by name but received parameters by position`);\n }\n if (type.numberOfParams !== message.params.length) {\n logger.error(`Notification ${message.method} defines ${type.numberOfParams} params but received ${params.length} arguments`);\n }\n }\n notificationHandler(...params);\n }\n }\n else {\n if (type !== undefined && type.parameterStructures === messages_1.ParameterStructures.byPosition) {\n logger.error(`Notification ${message.method} defines parameters by position but received parameters by name`);\n }\n notificationHandler(message.params);\n }\n }\n else if (starNotificationHandler) {\n starNotificationHandler(message.method, message.params);\n }\n }\n catch (error) {\n if (error.message) {\n logger.error(`Notification handler '${message.method}' failed with message: ${error.message}`);\n }\n else {\n logger.error(`Notification handler '${message.method}' failed unexpectedly.`);\n }\n }\n }\n else {\n unhandledNotificationEmitter.fire(message);\n }\n }\n function handleInvalidMessage(message) {\n if (!message) {\n logger.error('Received empty message.');\n return;\n }\n logger.error(`Received message which is neither a response nor a notification message:\\n${JSON.stringify(message, null, 4)}`);\n // Test whether we find an id to reject the promise\n const responseMessage = message;\n if (Is.string(responseMessage.id) || Is.number(responseMessage.id)) {\n const key = responseMessage.id;\n const responseHandler = responsePromises.get(key);\n if (responseHandler) {\n responseHandler.reject(new Error('The received response has neither a result nor an error property.'));\n }\n }\n }\n function stringifyTrace(params) {\n if (params === undefined || params === null) {\n return undefined;\n }\n switch (trace) {\n case Trace.Verbose:\n return JSON.stringify(params, null, 4);\n case Trace.Compact:\n return JSON.stringify(params);\n default:\n return undefined;\n }\n }\n function traceSendingRequest(message) {\n if (trace === Trace.Off || !tracer) {\n return;\n }\n if (traceFormat === TraceFormat.Text) {\n let data = undefined;\n if ((trace === Trace.Verbose || trace === Trace.Compact) && message.params) {\n data = `Params: ${stringifyTrace(message.params)}\\n\\n`;\n }\n tracer.log(`Sending request '${message.method} - (${message.id})'.`, data);\n }\n else {\n logLSPMessage('send-request', message);\n }\n }\n function traceSendingNotification(message) {\n if (trace === Trace.Off || !tracer) {\n return;\n }\n if (traceFormat === TraceFormat.Text) {\n let data = undefined;\n if (trace === Trace.Verbose || trace === Trace.Compact) {\n if (message.params) {\n data = `Params: ${stringifyTrace(message.params)}\\n\\n`;\n }\n else {\n data = 'No parameters provided.\\n\\n';\n }\n }\n tracer.log(`Sending notification '${message.method}'.`, data);\n }\n else {\n logLSPMessage('send-notification', message);\n }\n }\n function traceSendingResponse(message, method, startTime) {\n if (trace === Trace.Off || !tracer) {\n return;\n }\n if (traceFormat === TraceFormat.Text) {\n let data = undefined;\n if (trace === Trace.Verbose || trace === Trace.Compact) {\n if (message.error && message.error.data) {\n data = `Error data: ${stringifyTrace(message.error.data)}\\n\\n`;\n }\n else {\n if (message.result) {\n data = `Result: ${stringifyTrace(message.result)}\\n\\n`;\n }\n else if (message.error === undefined) {\n data = 'No result returned.\\n\\n';\n }\n }\n }\n tracer.log(`Sending response '${method} - (${message.id})'. Processing request took ${Date.now() - startTime}ms`, data);\n }\n else {\n logLSPMessage('send-response', message);\n }\n }\n function traceReceivedRequest(message) {\n if (trace === Trace.Off || !tracer) {\n return;\n }\n if (traceFormat === TraceFormat.Text) {\n let data = undefined;\n if ((trace === Trace.Verbose || trace === Trace.Compact) && message.params) {\n data = `Params: ${stringifyTrace(message.params)}\\n\\n`;\n }\n tracer.log(`Received request '${message.method} - (${message.id})'.`, data);\n }\n else {\n logLSPMessage('receive-request', message);\n }\n }\n function traceReceivedNotification(message) {\n if (trace === Trace.Off || !tracer || message.method === LogTraceNotification.type.method) {\n return;\n }\n if (traceFormat === TraceFormat.Text) {\n let data = undefined;\n if (trace === Trace.Verbose || trace === Trace.Compact) {\n if (message.params) {\n data = `Params: ${stringifyTrace(message.params)}\\n\\n`;\n }\n else {\n data = 'No parameters provided.\\n\\n';\n }\n }\n tracer.log(`Received notification '${message.method}'.`, data);\n }\n else {\n logLSPMessage('receive-notification', message);\n }\n }\n function traceReceivedResponse(message, responsePromise) {\n if (trace === Trace.Off || !tracer) {\n return;\n }\n if (traceFormat === TraceFormat.Text) {\n let data = undefined;\n if (trace === Trace.Verbose || trace === Trace.Compact) {\n if (message.error && message.error.data) {\n data = `Error data: ${stringifyTrace(message.error.data)}\\n\\n`;\n }\n else {\n if (message.result) {\n data = `Result: ${stringifyTrace(message.result)}\\n\\n`;\n }\n else if (message.error === undefined) {\n data = 'No result returned.\\n\\n';\n }\n }\n }\n if (responsePromise) {\n const error = message.error ? ` Request failed: ${message.error.message} (${message.error.code}).` : '';\n tracer.log(`Received response '${responsePromise.method} - (${message.id})' in ${Date.now() - responsePromise.timerStart}ms.${error}`, data);\n }\n else {\n tracer.log(`Received response ${message.id} without active response promise.`, data);\n }\n }\n else {\n logLSPMessage('receive-response', message);\n }\n }\n function logLSPMessage(type, message) {\n if (!tracer || trace === Trace.Off) {\n return;\n }\n const lspMessage = {\n isLSPMessage: true,\n type,\n message,\n timestamp: Date.now()\n };\n tracer.log(lspMessage);\n }\n function throwIfClosedOrDisposed() {\n if (isClosed()) {\n throw new ConnectionError(ConnectionErrors.Closed, 'Connection is closed.');\n }\n if (isDisposed()) {\n throw new ConnectionError(ConnectionErrors.Disposed, 'Connection is disposed.');\n }\n }\n function throwIfListening() {\n if (isListening()) {\n throw new ConnectionError(ConnectionErrors.AlreadyListening, 'Connection is already listening');\n }\n }\n function throwIfNotListening() {\n if (!isListening()) {\n throw new Error('Call listen() first.');\n }\n }\n function undefinedToNull(param) {\n if (param === undefined) {\n return null;\n }\n else {\n return param;\n }\n }\n function nullToUndefined(param) {\n if (param === null) {\n return undefined;\n }\n else {\n return param;\n }\n }\n function isNamedParam(param) {\n return param !== undefined && param !== null && !Array.isArray(param) && typeof param === 'object';\n }\n function computeSingleParam(parameterStructures, param) {\n switch (parameterStructures) {\n case messages_1.ParameterStructures.auto:\n if (isNamedParam(param)) {\n return nullToUndefined(param);\n }\n else {\n return [undefinedToNull(param)];\n }\n case messages_1.ParameterStructures.byName:\n if (!isNamedParam(param)) {\n throw new Error(`Received parameters by name but param is not an object literal.`);\n }\n return nullToUndefined(param);\n case messages_1.ParameterStructures.byPosition:\n return [undefinedToNull(param)];\n default:\n throw new Error(`Unknown parameter structure ${parameterStructures.toString()}`);\n }\n }\n function computeMessageParams(type, params) {\n let result;\n const numberOfParams = type.numberOfParams;\n switch (numberOfParams) {\n case 0:\n result = undefined;\n break;\n case 1:\n result = computeSingleParam(type.parameterStructures, params[0]);\n break;\n default:\n result = [];\n for (let i = 0; i < params.length && i < numberOfParams; i++) {\n result.push(undefinedToNull(params[i]));\n }\n if (params.length < numberOfParams) {\n for (let i = params.length; i < numberOfParams; i++) {\n result.push(null);\n }\n }\n break;\n }\n return result;\n }\n const connection = {\n sendNotification: (type, ...args) => {\n throwIfClosedOrDisposed();\n let method;\n let messageParams;\n if (Is.string(type)) {\n method = type;\n const first = args[0];\n let paramStart = 0;\n let parameterStructures = messages_1.ParameterStructures.auto;\n if (messages_1.ParameterStructures.is(first)) {\n paramStart = 1;\n parameterStructures = first;\n }\n let paramEnd = args.length;\n const numberOfParams = paramEnd - paramStart;\n switch (numberOfParams) {\n case 0:\n messageParams = undefined;\n break;\n case 1:\n messageParams = computeSingleParam(parameterStructures, args[paramStart]);\n break;\n default:\n if (parameterStructures === messages_1.ParameterStructures.byName) {\n throw new Error(`Received ${numberOfParams} parameters for 'by Name' notification parameter structure.`);\n }\n messageParams = args.slice(paramStart, paramEnd).map(value => undefinedToNull(value));\n break;\n }\n }\n else {\n const params = args;\n method = type.method;\n messageParams = computeMessageParams(type, params);\n }\n const notificationMessage = {\n jsonrpc: version,\n method: method,\n params: messageParams\n };\n traceSendingNotification(notificationMessage);\n return messageWriter.write(notificationMessage).catch((error) => {\n logger.error(`Sending notification failed.`);\n throw error;\n });\n },\n onNotification: (type, handler) => {\n throwIfClosedOrDisposed();\n let method;\n if (Is.func(type)) {\n starNotificationHandler = type;\n }\n else if (handler) {\n if (Is.string(type)) {\n method = type;\n notificationHandlers.set(type, { type: undefined, handler });\n }\n else {\n method = type.method;\n notificationHandlers.set(type.method, { type, handler });\n }\n }\n return {\n dispose: () => {\n if (method !== undefined) {\n notificationHandlers.delete(method);\n }\n else {\n starNotificationHandler = undefined;\n }\n }\n };\n },\n onProgress: (_type, token, handler) => {\n if (progressHandlers.has(token)) {\n throw new Error(`Progress handler for token ${token} already registered`);\n }\n progressHandlers.set(token, handler);\n return {\n dispose: () => {\n progressHandlers.delete(token);\n }\n };\n },\n sendProgress: (_type, token, value) => {\n // This should not await but simple return to ensure that we don't have another\n // async scheduling. Otherwise one send could overtake another send.\n return connection.sendNotification(ProgressNotification.type, { token, value });\n },\n onUnhandledProgress: unhandledProgressEmitter.event,\n sendRequest: (type, ...args) => {\n throwIfClosedOrDisposed();\n throwIfNotListening();\n let method;\n let messageParams;\n let token = undefined;\n if (Is.string(type)) {\n method = type;\n const first = args[0];\n const last = args[args.length - 1];\n let paramStart = 0;\n let parameterStructures = messages_1.ParameterStructures.auto;\n if (messages_1.ParameterStructures.is(first)) {\n paramStart = 1;\n parameterStructures = first;\n }\n let paramEnd = args.length;\n if (cancellation_1.CancellationToken.is(last)) {\n paramEnd = paramEnd - 1;\n token = last;\n }\n const numberOfParams = paramEnd - paramStart;\n switch (numberOfParams) {\n case 0:\n messageParams = undefined;\n break;\n case 1:\n messageParams = computeSingleParam(parameterStructures, args[paramStart]);\n break;\n default:\n if (parameterStructures === messages_1.ParameterStructures.byName) {\n throw new Error(`Received ${numberOfParams} parameters for 'by Name' request parameter structure.`);\n }\n messageParams = args.slice(paramStart, paramEnd).map(value => undefinedToNull(value));\n break;\n }\n }\n else {\n const params = args;\n method = type.method;\n messageParams = computeMessageParams(type, params);\n const numberOfParams = type.numberOfParams;\n token = cancellation_1.CancellationToken.is(params[numberOfParams]) ? params[numberOfParams] : undefined;\n }\n const id = sequenceNumber++;\n let disposable;\n if (token) {\n disposable = token.onCancellationRequested(() => {\n const p = cancellationStrategy.sender.sendCancellation(connection, id);\n if (p === undefined) {\n logger.log(`Received no promise from cancellation strategy when cancelling id ${id}`);\n return Promise.resolve();\n }\n else {\n return p.catch(() => {\n logger.log(`Sending cancellation messages for id ${id} failed`);\n });\n }\n });\n }\n const requestMessage = {\n jsonrpc: version,\n id: id,\n method: method,\n params: messageParams\n };\n traceSendingRequest(requestMessage);\n if (typeof cancellationStrategy.sender.enableCancellation === 'function') {\n cancellationStrategy.sender.enableCancellation(requestMessage);\n }\n return new Promise(async (resolve, reject) => {\n const resolveWithCleanup = (r) => {\n resolve(r);\n cancellationStrategy.sender.cleanup(id);\n disposable?.dispose();\n };\n const rejectWithCleanup = (r) => {\n reject(r);\n cancellationStrategy.sender.cleanup(id);\n disposable?.dispose();\n };\n const responsePromise = { method: method, timerStart: Date.now(), resolve: resolveWithCleanup, reject: rejectWithCleanup };\n try {\n responsePromises.set(id, responsePromise);\n await messageWriter.write(requestMessage);\n }\n catch (error) {\n // Writing the message failed. So we need to delete it from the response promises and\n // reject it.\n responsePromises.delete(id);\n responsePromise.reject(new messages_1.ResponseError(messages_1.ErrorCodes.MessageWriteError, error.message ? error.message : 'Unknown reason'));\n logger.error(`Sending request failed.`);\n throw error;\n }\n });\n },\n onRequest: (type, handler) => {\n throwIfClosedOrDisposed();\n let method = null;\n if (StarRequestHandler.is(type)) {\n method = undefined;\n starRequestHandler = type;\n }\n else if (Is.string(type)) {\n method = null;\n if (handler !== undefined) {\n method = type;\n requestHandlers.set(type, { handler: handler, type: undefined });\n }\n }\n else {\n if (handler !== undefined) {\n method = type.method;\n requestHandlers.set(type.method, { type, handler });\n }\n }\n return {\n dispose: () => {\n if (method === null) {\n return;\n }\n if (method !== undefined) {\n requestHandlers.delete(method);\n }\n else {\n starRequestHandler = undefined;\n }\n }\n };\n },\n hasPendingResponse: () => {\n return responsePromises.size > 0;\n },\n trace: async (_value, _tracer, sendNotificationOrTraceOptions) => {\n let _sendNotification = false;\n let _traceFormat = TraceFormat.Text;\n if (sendNotificationOrTraceOptions !== undefined) {\n if (Is.boolean(sendNotificationOrTraceOptions)) {\n _sendNotification = sendNotificationOrTraceOptions;\n }\n else {\n _sendNotification = sendNotificationOrTraceOptions.sendNotification || false;\n _traceFormat = sendNotificationOrTraceOptions.traceFormat || TraceFormat.Text;\n }\n }\n trace = _value;\n traceFormat = _traceFormat;\n if (trace === Trace.Off) {\n tracer = undefined;\n }\n else {\n tracer = _tracer;\n }\n if (_sendNotification && !isClosed() && !isDisposed()) {\n await connection.sendNotification(SetTraceNotification.type, { value: Trace.toString(_value) });\n }\n },\n onError: errorEmitter.event,\n onClose: closeEmitter.event,\n onUnhandledNotification: unhandledNotificationEmitter.event,\n onDispose: disposeEmitter.event,\n end: () => {\n messageWriter.end();\n },\n dispose: () => {\n if (isDisposed()) {\n return;\n }\n state = ConnectionState.Disposed;\n disposeEmitter.fire(undefined);\n const error = new messages_1.ResponseError(messages_1.ErrorCodes.PendingResponseRejected, 'Pending response rejected since connection got disposed');\n for (const promise of responsePromises.values()) {\n promise.reject(error);\n }\n responsePromises = new Map();\n requestTokens = new Map();\n knownCanceledRequests = new Set();\n messageQueue = new linkedMap_1.LinkedMap();\n // Test for backwards compatibility\n if (Is.func(messageWriter.dispose)) {\n messageWriter.dispose();\n }\n if (Is.func(messageReader.dispose)) {\n messageReader.dispose();\n }\n },\n listen: () => {\n throwIfClosedOrDisposed();\n throwIfListening();\n state = ConnectionState.Listening;\n messageReader.listen(callback);\n },\n inspect: () => {\n // eslint-disable-next-line no-console\n (0, ral_1.default)().console.log('inspect');\n }\n };\n connection.onNotification(LogTraceNotification.type, (params) => {\n if (trace === Trace.Off || !tracer) {\n return;\n }\n const verbose = trace === Trace.Verbose || trace === Trace.Compact;\n tracer.log(params.message, verbose ? params.verbose : undefined);\n });\n connection.onNotification(ProgressNotification.type, (params) => {\n const handler = progressHandlers.get(params.token);\n if (handler) {\n handler(params.value);\n }\n else {\n unhandledProgressEmitter.fire(params);\n }\n });\n return connection;\n}\nexports.createMessageConnection = createMessageConnection;\n","\"use strict\";\n/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\n/// <reference path=\"../../typings/thenable.d.ts\" />\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ProgressType = exports.ProgressToken = exports.createMessageConnection = exports.NullLogger = exports.ConnectionOptions = exports.ConnectionStrategy = exports.AbstractMessageBuffer = exports.WriteableStreamMessageWriter = exports.AbstractMessageWriter = exports.MessageWriter = exports.ReadableStreamMessageReader = exports.AbstractMessageReader = exports.MessageReader = exports.SharedArrayReceiverStrategy = exports.SharedArraySenderStrategy = exports.CancellationToken = exports.CancellationTokenSource = exports.Emitter = exports.Event = exports.Disposable = exports.LRUCache = exports.Touch = exports.LinkedMap = exports.ParameterStructures = exports.NotificationType9 = exports.NotificationType8 = exports.NotificationType7 = exports.NotificationType6 = exports.NotificationType5 = exports.NotificationType4 = exports.NotificationType3 = exports.NotificationType2 = exports.NotificationType1 = exports.NotificationType0 = exports.NotificationType = exports.ErrorCodes = exports.ResponseError = exports.RequestType9 = exports.RequestType8 = exports.RequestType7 = exports.RequestType6 = exports.RequestType5 = exports.RequestType4 = exports.RequestType3 = exports.RequestType2 = exports.RequestType1 = exports.RequestType0 = exports.RequestType = exports.Message = exports.RAL = void 0;\nexports.MessageStrategy = exports.CancellationStrategy = exports.CancellationSenderStrategy = exports.CancellationReceiverStrategy = exports.ConnectionError = exports.ConnectionErrors = exports.LogTraceNotification = exports.SetTraceNotification = exports.TraceFormat = exports.TraceValues = exports.Trace = void 0;\nconst messages_1 = require(\"./messages\");\nObject.defineProperty(exports, \"Message\", { enumerable: true, get: function () { return messages_1.Message; } });\nObject.defineProperty(exports, \"RequestType\", { enumerable: true, get: function () { return messages_1.RequestType; } });\nObject.defineProperty(exports, \"RequestType0\", { enumerable: true, get: function () { return messages_1.RequestType0; } });\nObject.defineProperty(exports, \"RequestType1\", { enumerable: true, get: function () { return messages_1.RequestType1; } });\nObject.defineProperty(exports, \"RequestType2\", { enumerable: true, get: function () { return messages_1.RequestType2; } });\nObject.defineProperty(exports, \"RequestType3\", { enumerable: true, get: function () { return messages_1.RequestType3; } });\nObject.defineProperty(exports, \"RequestType4\", { enumerable: true, get: function () { return messages_1.RequestType4; } });\nObject.defineProperty(exports, \"RequestType5\", { enumerable: true, get: function () { return messages_1.RequestType5; } });\nObject.defineProperty(exports, \"RequestType6\", { enumerable: true, get: function () { return messages_1.RequestType6; } });\nObject.defineProperty(exports, \"RequestType7\", { enumerable: true, get: function () { return messages_1.RequestType7; } });\nObject.defineProperty(exports, \"RequestType8\", { enumerable: true, get: function () { return messages_1.RequestType8; } });\nObject.defineProperty(exports, \"RequestType9\", { enumerable: true, get: function () { return messages_1.RequestType9; } });\nObject.defineProperty(exports, \"ResponseError\", { enumerable: true, get: function () { return messages_1.ResponseError; } });\nObject.defineProperty(exports, \"ErrorCodes\", { enumerable: true, get: function () { return messages_1.ErrorCodes; } });\nObject.defineProperty(exports, \"NotificationType\", { enumerable: true, get: function () { return messages_1.NotificationType; } });\nObject.defineProperty(exports, \"NotificationType0\", { enumerable: true, get: function () { return messages_1.NotificationType0; } });\nObject.defineProperty(exports, \"NotificationType1\", { enumerable: true, get: function () { return messages_1.NotificationType1; } });\nObject.defineProperty(exports, \"NotificationType2\", { enumerable: true, get: function () { return messages_1.NotificationType2; } });\nObject.defineProperty(exports, \"NotificationType3\", { enumerable: true, get: function () { return messages_1.NotificationType3; } });\nObject.defineProperty(exports, \"NotificationType4\", { enumerable: true, get: function () { return messages_1.NotificationType4; } });\nObject.defineProperty(exports, \"NotificationType5\", { enumerable: true, get: function () { return messages_1.NotificationType5; } });\nObject.defineProperty(exports, \"NotificationType6\", { enumerable: true, get: function () { return messages_1.NotificationType6; } });\nObject.defineProperty(exports, \"NotificationType7\", { enumerable: true, get: function () { return messages_1.NotificationType7; } });\nObject.defineProperty(exports, \"NotificationType8\", { enumerable: true, get: function () { return messages_1.NotificationType8; } });\nObject.defineProperty(exports, \"NotificationType9\", { enumerable: true, get: function () { return messages_1.NotificationType9; } });\nObject.defineProperty(exports, \"ParameterStructures\", { enumerable: true, get: function () { return messages_1.ParameterStructures; } });\nconst linkedMap_1 = require(\"./linkedMap\");\nObject.defineProperty(exports, \"LinkedMap\", { enumerable: true, get: function () { return linkedMap_1.LinkedMap; } });\nObject.defineProperty(exports, \"LRUCache\", { enumerable: true, get: function () { return linkedMap_1.LRUCache; } });\nObject.defineProperty(exports, \"Touch\", { enumerable: true, get: function () { return linkedMap_1.Touch; } });\nconst disposable_1 = require(\"./disposable\");\nObject.defineProperty(exports, \"Disposable\", { enumerable: true, get: function () { return disposable_1.Disposable; } });\nconst events_1 = require(\"./events\");\nObject.defineProperty(exports, \"Event\", { enumerable: true, get: function () { return events_1.Event; } });\nObject.defineProperty(exports, \"Emitter\", { enumerable: true, get: function () { return events_1.Emitter; } });\nconst cancellation_1 = require(\"./cancellation\");\nObject.defineProperty(exports, \"CancellationTokenSource\", { enumerable: true, get: function () { return cancellation_1.CancellationTokenSource; } });\nObject.defineProperty(exports, \"CancellationToken\", { enumerable: true, get: function () { return cancellation_1.CancellationToken; } });\nconst sharedArrayCancellation_1 = require(\"./sharedArrayCancellation\");\nObject.defineProperty(exports, \"SharedArraySenderStrategy\", { enumerable: true, get: function () { return sharedArrayCancellation_1.SharedArraySenderStrategy; } });\nObject.defineProperty(exports, \"SharedArrayReceiverStrategy\", { enumerable: true, get: function () { return sharedArrayCancellation_1.SharedArrayReceiverStrategy; } });\nconst messageReader_1 = require(\"./messageReader\");\nObject.defineProperty(exports, \"MessageReader\", { enumerable: true, get: function () { return messageReader_1.MessageReader; } });\nObject.defineProperty(exports, \"AbstractMessageReader\", { enumerable: true, get: function () { return messageReader_1.AbstractMessageReader; } });\nObject.defineProperty(exports, \"ReadableStreamMessageReader\", { enumerable: true, get: function () { return messageReader_1.ReadableStreamMessageReader; } });\nconst messageWriter_1 = require(\"./messageWriter\");\nObject.defineProperty(exports, \"MessageWriter\", { enumerable: true, get: function () { return messageWriter_1.MessageWriter; } });\nObject.defineProperty(exports, \"AbstractMessageWriter\", { enumerable: true, get: function () { return messageWriter_1.AbstractMessageWriter; } });\nObject.defineProperty(exports, \"WriteableStreamMessageWriter\", { enumerable: true, get: function () { return messageWriter_1.WriteableStreamMessageWriter; } });\nconst messageBuffer_1 = require(\"./messageBuffer\");\nObject.defineProperty(exports, \"AbstractMessageBuffer\", { enumerable: true, get: function () { return messageBuffer_1.AbstractMessageBuffer; } });\nconst connection_1 = require(\"./connection\");\nObject.defineProperty(exports, \"ConnectionStrategy\", { enumerable: true, get: function () { return connection_1.ConnectionStrategy; } });\nObject.defineProperty(exports, \"ConnectionOptions\", { enumerable: true, get: function () { return connection_1.ConnectionOptions; } });\nObject.defineProperty(exports, \"NullLogger\", { enumerable: true, get: function () { return connection_1.NullLogger; } });\nObject.defineProperty(exports, \"createMessageConnection\", { enumerable: true, get: function () { return connection_1.createMessageConnection; } });\nObject.defineProperty(exports, \"ProgressToken\", { enumerable: true, get: function () { return connection_1.ProgressToken; } });\nObject.defineProperty(exports, \"ProgressType\", { enumerable: true, get: function () { return connection_1.ProgressType; } });\nObject.defineProperty(exports, \"Trace\", { enumerable: true, get: function () { return connection_1.Trace; } });\nObject.defineProperty(exports, \"TraceValues\", { enumerable: true, get: function () { return connection_1.TraceValues; } });\nObject.defineProperty(exports, \"TraceFormat\", { enumerable: true, get: function () { return connection_1.TraceFormat; } });\nObject.defineProperty(exports, \"SetTraceNotification\", { enumerable: true, get: function () { return connection_1.SetTraceNotification; } });\nObject.defineProperty(exports, \"LogTraceNotification\", { enumerable: true, get: function () { return connection_1.LogTraceNotification; } });\nObject.defineProperty(exports, \"ConnectionErrors\", { enumerable: true, get: function () { return connection_1.ConnectionErrors; } });\nObject.defineProperty(exports, \"ConnectionError\", { enumerable: true, get: function () { return connection_1.ConnectionError; } });\nObject.defineProperty(exports, \"CancellationReceiverStrategy\", { enumerable: true, get: function () { return connection_1.CancellationReceiverStrategy; } });\nObject.defineProperty(exports, \"CancellationSenderStrategy\", { enumerable: true, get: function () { return connection_1.CancellationSenderStrategy; } });\nObject.defineProperty(exports, \"CancellationStrategy\", { enumerable: true, get: function () { return connection_1.CancellationStrategy; } });\nObject.defineProperty(exports, \"MessageStrategy\", { enumerable: true, get: function () { return connection_1.MessageStrategy; } });\nconst ral_1 = require(\"./ral\");\nexports.RAL = ral_1.default;\n","\"use strict\";\n/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst api_1 = require(\"../common/api\");\nclass MessageBuffer extends api_1.AbstractMessageBuffer {\n constructor(encoding = 'utf-8') {\n super(encoding);\n this.asciiDecoder = new TextDecoder('ascii');\n }\n emptyBuffer() {\n return MessageBuffer.emptyBuffer;\n }\n fromString(value, _encoding) {\n return (new TextEncoder()).encode(value);\n }\n toString(value, encoding) {\n if (encoding === 'ascii') {\n return this.asciiDecoder.decode(value);\n }\n else {\n return (new TextDecoder(encoding)).decode(value);\n }\n }\n asNative(buffer, length) {\n if (length === undefined) {\n return buffer;\n }\n else {\n return buffer.slice(0, length);\n }\n }\n allocNative(length) {\n return new Uint8Array(length);\n }\n}\nMessageBuffer.emptyBuffer = new Uint8Array(0);\nclass ReadableStreamWrapper {\n constructor(socket) {\n this.socket = socket;\n this._onData = new api_1.Emitter();\n this._messageListener = (event) => {\n const blob = event.data;\n blob.arrayBuffer().then((buffer) => {\n this._onData.fire(new Uint8Array(buffer));\n }, () => {\n (0, api_1.RAL)().console.error(`Converting blob to array buffer failed.`);\n });\n };\n this.socket.addEventListener('message', this._messageListener);\n }\n onClose(listener) {\n this.socket.addEventListener('close', listener);\n return api_1.Disposable.create(() => this.socket.removeEventListener('close', listener));\n }\n onError(listener) {\n this.socket.addEventListener('error', listener);\n return api_1.Disposable.create(() => this.socket.removeEventListener('error', listener));\n }\n onEnd(listener) {\n this.socket.addEventListener('end', listener);\n return api_1.Disposable.create(() => this.socket.removeEventListener('end', listener));\n }\n onData(listener) {\n return this._onData.event(listener);\n }\n}\nclass WritableStreamWrapper {\n constructor(socket) {\n this.socket = socket;\n }\n onClose(listener) {\n this.socket.addEventListener('close', listener);\n return api_1.Disposable.create(() => this.socket.removeEventListener('close', listener));\n }\n onError(listener) {\n this.socket.addEventListener('error', listener);\n return api_1.Disposable.create(() => this.socket.removeEventListener('error', listener));\n }\n onEnd(listener) {\n this.socket.addEventListener('end', listener);\n return api_1.Disposable.create(() => this.socket.removeEventListener('end', listener));\n }\n write(data, encoding) {\n if (typeof data === 'string') {\n if (encoding !== undefined && encoding !== 'utf-8') {\n throw new Error(`In a Browser environments only utf-8 text encoding is supported. But got encoding: ${encoding}`);\n }\n this.socket.send(data);\n }\n else {\n this.socket.send(data);\n }\n return Promise.resolve();\n }\n end() {\n this.socket.close();\n }\n}\nconst _textEncoder = new TextEncoder();\nconst _ril = Object.freeze({\n messageBuffer: Object.freeze({\n create: (encoding) => new MessageBuffer(encoding)\n }),\n applicationJson: Object.freeze({\n encoder: Object.freeze({\n name: 'application/json',\n encode: (msg, options) => {\n if (options.charset !== 'utf-8') {\n throw new Error(`In a Browser environments only utf-8 text encoding is supported. But got encoding: ${options.charset}`);\n }\n return Promise.resolve(_textEncoder.encode(JSON.stringify(msg, undefined, 0)));\n }\n }),\n decoder: Object.freeze({\n name: 'application/json',\n decode: (buffer, options) => {\n if (!(buffer instanceof Uint8Array)) {\n throw new Error(`In a Browser environments only Uint8Arrays are supported.`);\n }\n return Promise.resolve(JSON.parse(new TextDecoder(options.charset).decode(buffer)));\n }\n })\n }),\n stream: Object.freeze({\n asReadableStream: (socket) => new ReadableStreamWrapper(socket),\n asWritableStream: (socket) => new WritableStreamWrapper(socket)\n }),\n console: console,\n timer: Object.freeze({\n setTimeout(callback, ms, ...args) {\n const handle = setTimeout(callback, ms, ...args);\n return { dispose: () => clearTimeout(handle) };\n },\n setImmediate(callback, ...args) {\n const handle = setTimeout(callback, 0, ...args);\n return { dispose: () => clearTimeout(handle) };\n },\n setInterval(callback, ms, ...args) {\n const handle = setInterval(callback, ms, ...args);\n return { dispose: () => clearInterval(handle) };\n },\n })\n});\nfunction RIL() {\n return _ril;\n}\n(function (RIL) {\n function install() {\n api_1.RAL.install(_ril);\n }\n RIL.install = install;\n})(RIL || (RIL = {}));\nexports.default = RIL;\n","\"use strict\";\n/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.createMessageConnection = exports.BrowserMessageWriter = exports.BrowserMessageReader = void 0;\nconst ril_1 = require(\"./ril\");\n// Install the browser runtime abstract.\nril_1.default.install();\nconst api_1 = require(\"../common/api\");\n__exportStar(require(\"../common/api\"), exports);\nclass BrowserMessageReader extends api_1.AbstractMessageReader {\n constructor(port) {\n super();\n this._onData = new api_1.Emitter();\n this._messageListener = (event) => {\n this._onData.fire(event.data);\n };\n port.addEventListener('error', (event) => this.fireError(event));\n port.onmessage = this._messageListener;\n }\n listen(callback) {\n return this._onData.event(callback);\n }\n}\nexports.BrowserMessageReader = BrowserMessageReader;\nclass BrowserMessageWriter extends api_1.AbstractMessageWriter {\n constructor(port) {\n super();\n this.port = port;\n this.errorCount = 0;\n port.addEventListener('error', (event) => this.fireError(event));\n }\n write(msg) {\n try {\n this.port.postMessage(msg);\n return Promise.resolve();\n }\n catch (error) {\n this.handleError(error, msg);\n return Promise.reject(error);\n }\n }\n handleError(error, msg) {\n this.errorCount++;\n this.fireError(error, msg, this.errorCount);\n }\n end() {\n }\n}\nexports.BrowserMessageWriter = BrowserMessageWriter;\nfunction createMessageConnection(reader, writer, logger, options) {\n if (logger === undefined) {\n logger = api_1.NullLogger;\n }\n if (api_1.ConnectionStrategy.is(options)) {\n options = { connectionStrategy: options };\n }\n return (0, api_1.createMessageConnection)(reader, writer, logger, options);\n}\nexports.createMessageConnection = createMessageConnection;\n","import { Emitter } from \"vscode-jsonrpc\";\nfunction generateBrokerId() {\n return `broker-${Date.now()}-${Math.random().toString(36).substring(2, 15)}`;\n}\nexport class MultiTabWorkerBrokerError extends Error {\n details;\n constructor(message, details) {\n super(message);\n this.details = details;\n this.name = \"MultiTabWorkerBrokerError\";\n }\n}\n/**\n * A worker broker that allows multiple tabs open on the same origin to all talk to one active tab's worker\n * Supports tabs coming and going and re-electing the active tab as leader\n */\nexport class MultiTabWorkerBroker {\n lockName;\n makeWorker;\n isLeader = false;\n started = false;\n brokerId;\n broadcastChannel = null;\n worker = null;\n lockAbortController = new AbortController();\n pendingRequests = new Map();\n nextRequestId = 0;\n timeout;\n onStateChange;\n // Queue of worker requests received while leader is booting the worker\n leaderRequestQueue = [];\n workerReadyPromise = null;\n workerReadyResolver = null;\n // Map rewritten JSONRPC IDs back to original IDs\n rewrittenIdMap = new Map();\n // Track all active connections (reader/writer pairs)\n connections = new Map();\n nextConnectionId = 0;\n shouldDebug = false;\n // Track the active lock request promise to ensure proper cleanup\n activeLockPromise = null;\n // Track an in-flight stop operation so subsequent starts wait for cleanup\n stopPromise = null;\n constructor(lockName, makeWorker, options) {\n this.lockName = lockName;\n this.makeWorker = makeWorker;\n this.brokerId = generateBrokerId();\n this.timeout = options?.timeout ?? 20_000;\n this.onStateChange = options?.onStateChange;\n this.shouldDebug = options?.debug ?? false;\n }\n /** Central debug logging function */\n debug(message, ...args) {\n if (this.shouldDebug) {\n const role = this.isLeader ? \"LEADER\" : \"FOLLOWER\";\n const prefix = `[MTB:${this.brokerId.slice(0, 20)}:${role}]`;\n console.debug(prefix, message, ...args);\n }\n }\n /** Central error logging function */\n error(message, ...args) {\n const role = this.isLeader ? \"LEADER\" : \"FOLLOWER\";\n const prefix = `[MTB:${this.brokerId.slice(0, 20)}:${role}]`;\n console.error(prefix, message, ...args);\n }\n /** Create a new connection with independent reader and writer */\n createConnection() {\n const connectionId = String(this.nextConnectionId++);\n const reader = new MultiTabMessageReader();\n const writer = new MultiTabMessageWriter();\n // Set up the write handler for this connection\n writer._setWriteHandler(async (message) => {\n await this.sendMessage(message);\n });\n // Track this connection\n this.connections.set(connectionId, { reader, writer });\n this.debug(`createConnection: Created connection ${connectionId}`);\n // Return disposal function\n const dispose = () => {\n this.debug(`Connection ${connectionId} disposed`);\n const conn = this.connections.get(connectionId);\n if (conn) {\n conn.reader.dispose();\n conn.writer.dispose();\n this.connections.delete(connectionId);\n }\n };\n return { reader, writer, dispose };\n }\n /** Start the broker and attempt to acquire leadership */\n async start() {\n if (this.stopPromise) {\n await this.stopPromise;\n }\n if (this.started) {\n return;\n }\n this.started = true;\n // Create a new AbortController for this start cycle\n this.lockAbortController = new AbortController();\n // Set up broadcast channel for inter-tab communication\n this.broadcastChannel = new BroadcastChannel(this.lockName);\n this.broadcastChannel.addEventListener(\"message\", this.handleBroadcastMessage);\n // Try to acquire the lock and become leader - wait until we know our role\n await this.tryAcquireLock();\n this.debug(`Broker started, isLeader=${this.isLeader}`);\n }\n async tryAcquireLock() {\n let outcomeKnown;\n let outcomeKnownError;\n const outcome = new Promise((resolve, reject) => {\n outcomeKnown = resolve;\n outcomeKnownError = reject;\n });\n // First, try to acquire the lock immediately with ifAvailable\n // This allows us to quickly determine if we can be leader or if another tab already has the lock\n // If we can acquire the lock, we are the leader, and we return promptly from start\n // Store the lock promise so we can wait for it to complete during stop()\n this.activeLockPromise = navigator.locks\n .request(this.lockName, { ifAvailable: true }, async (lock) => {\n if (lock === null) {\n // Lock is not available - another tab is the leader\n // We are a follower, so return quickly\n outcomeKnown(false);\n return false;\n }\n // Become the leader and start the worker\n await this.becomeLeader();\n // Notify the outer world that we are the leader\n outcomeKnown(true);\n // Now hold the lock indefinitely as we are the leader\n return new Promise((resolve) => {\n // If the abort controller is signaled, resolve to release the lock\n this.lockAbortController.signal.addEventListener(\"abort\", () => {\n resolve();\n });\n });\n })\n .catch(outcomeKnownError);\n const acquiredLock = await outcome;\n if (!acquiredLock) {\n // We're a follower - the leader exists elsewhere\n this.isLeader = false;\n // Set up abort controller for the follower's lock request\n this.lockAbortController = new AbortController();\n // Try to acquire the lock in the background for failover\n this.waitForLockAndBecomeLeader();\n // Notify state change\n this.onStateChange?.({ isLeader: this.isLeader });\n }\n }\n waitForLockAndBecomeLeader() {\n // Wait indefinitely to acquire the lock for failover\n // This will block until the current leader releases the lock\n // Store the lock promise so we can wait for it to complete during stop()\n this.activeLockPromise = navigator.locks\n .request(this.lockName, { signal: this.lockAbortController.signal }, async () => {\n // We got the lock! Become the leader and start the worker\n await this.becomeLeader();\n // Hold the lock indefinitely by waiting on a promise that never resolves\n return new Promise((resolve) => {\n // If the abort controller is signaled, resolve to release the lock\n this.lockAbortController.signal.addEventListener(\"abort\", () => {\n resolve();\n });\n });\n })\n .catch((error) => {\n // Lock request was aborted or failed\n if (error.name !== \"AbortError\") {\n this.error(`Lock acquisition failed:`, error);\n this.emitErrorToAllConnections(error instanceof Error ? error : new Error(String(error)));\n }\n });\n }\n async becomeLeader() {\n this.debug(`Becoming leader...`);\n this.isLeader = true;\n // Create and start the worker\n // Set up a promise to signal when the worker is fully ready\n this.workerReadyPromise = new Promise((resolve) => {\n this.workerReadyResolver = resolve;\n });\n this.worker = await this.makeWorker();\n // Set up event listeners\n const messageHandler = (event) => {\n this.handleWorkerMessage(event);\n };\n const errorHandler = (event) => {\n this.handleWorkerError(event);\n };\n this.worker.addEventListener(\"message\", messageHandler);\n this.worker.addEventListener(\"error\", errorHandler);\n this.debug(`Leader ready with worker`);\n // Notify state change\n this.onStateChange?.({ isLeader: this.isLeader });\n // Drain any queued follower requests that arrived while booting\n if (this.leaderRequestQueue.length > 0 && this.worker && this.broadcastChannel) {\n const queued = this.leaderRequestQueue.splice(0, this.leaderRequestQueue.length);\n for (const { id, message } of queued) {\n this.worker.postMessage(message);\n const response = { type: \"worker-response\", id, message };\n this.broadcastChannel.postMessage(response);\n }\n }\n // Signal readiness to any pending local sends\n if (this.workerReadyResolver) {\n this.workerReadyResolver();\n this.workerReadyResolver = null;\n }\n }\n /** Rewrite a JSONRPC ID to make it globally unique */\n rewriteId(originalId) {\n // Include a sequence number to handle ID reuse\n const rewrittenId = `${this.brokerId}:${originalId}`;\n this.rewrittenIdMap.set(rewrittenId, originalId);\n return rewrittenId;\n }\n unrewriteId(rewrittenId) {\n // Check if this ID is one of ours\n if (typeof rewrittenId === \"string\" && rewrittenId.startsWith(`${this.brokerId}:`)) {\n const originalId = this.rewrittenIdMap.get(rewrittenId);\n if (originalId !== undefined) {\n this.rewrittenIdMap.delete(rewrittenId);\n return { originalId, isOurs: true };\n }\n }\n return { originalId: rewrittenId, isOurs: false };\n }\n rewriteMessage(message) {\n // Only rewrite IDs for client->worker requests (messages with a method)\n // Responses (no method) must keep the original ID so the worker can match them\n if (message &&\n typeof message === \"object\" &&\n \"method\" in message &&\n message.method &&\n \"id\" in message &&\n message.id !== undefined) {\n return { ...message, id: this.rewriteId(message.id) };\n }\n return message;\n }\n unrewriteMessage(message) {\n if (message && typeof message === \"object\" && \"id\" in message && message.id !== undefined) {\n const { originalId, isOurs } = this.unrewriteId(message.id);\n return { message: { ...message, id: originalId }, isOurs };\n }\n // Messages without IDs (notifications) are broadcast to everyone\n return { message, isOurs: true };\n }\n handleWorkerMessage(event) {\n const message = event.data;\n // If the worker is initiating a request/notification (method present), always deliver locally.\n if (message && typeof message === \"object\" && \"method\" in message && message.method) {\n const isNotification = message.id === undefined;\n this.emitToAllConnections(message);\n // Broadcast only notifications to followers so they can observe logs/telemetry, etc.\n if (isNotification && this.broadcastChannel && this.isLeader) {\n const brokerMessage = { type: \"worker-message\", message };\n this.broadcastChannel.postMessage(brokerMessage);\n }\n return;\n }\n // Else it's a response to a prior request; route to the correct tab based on rewritten ID\n const { message: unrewrittenMessage, isOurs } = this.unrewriteMessage(message);\n if (isOurs) {\n this.emitToAllConnections(unrewrittenMessage);\n }\n else {\n // If the response ID is not a rewritten broker ID (e.g., numeric or plain string),\n // it's most likely intended for the leader (e.g., handshake done outside broker).\n const rawId = message?.id;\n const isRewrittenId = typeof rawId === \"string\" && rawId.startsWith(\"broker-\");\n if (!isRewrittenId) {\n this.emitToAllConnections(message);\n }\n }\n // Always broadcast responses so followers can pick up their own replies\n if (this.broadcastChannel && this.isLeader) {\n const brokerMessage = { type: \"worker-message\", message };\n this.broadcastChannel.postMessage(brokerMessage);\n }\n }\n emitToAllConnections(message) {\n for (const { reader } of this.connections.values()) {\n reader._emitMessage(message);\n }\n }\n emitErrorToAllConnections(error) {\n for (const { reader, writer } of this.connections.values()) {\n reader._emitError(error);\n writer._emitError(error);\n }\n }\n emitCloseToAllConnections() {\n for (const { reader, writer } of this.connections.values()) {\n reader._emitClose();\n writer._emitClose();\n }\n }\n handleWorkerError(event) {\n const error = new Error(event.message || \"Worker error\");\n this.error(`Worker error:`, error, event);\n this.emitErrorToAllConnections(error);\n }\n handleBroadcastMessage = (event) => {\n // Ignore messages if we've been stopped\n if (!this.started) {\n return;\n }\n const brokerMessage = event.data;\n if (brokerMessage.type === \"worker-message\") {\n // Message from the leader's worker\n if (!this.isLeader) {\n // Un-rewrite the message and only emit if it's for us\n const { message: unrewrittenMessage, isOurs } = this.unrewriteMessage(brokerMessage.message);\n if (isOurs) {\n this.emitToAllConnections(unrewrittenMessage);\n }\n }\n }\n else if (brokerMessage.type === \"worker-request\") {\n // A follower is requesting us to send a message to the worker\n if (this.isLeader) {\n if (this.worker) {\n this.worker.postMessage(brokerMessage.message);\n // Send acknowledgment back\n const response = {\n type: \"worker-response\",\n id: brokerMessage.id,\n message: brokerMessage.message,\n };\n this.broadcastChannel.postMessage(response);\n }\n else {\n // Worker not ready yet; queue the request until worker is available\n this.leaderRequestQueue.push({ id: brokerMessage.id, message: brokerMessage.message });\n }\n }\n }\n else if (brokerMessage.type === \"worker-response\") {\n // Response to our request\n const pending = this.pendingRequests.get(brokerMessage.id);\n if (pending) {\n pending.resolve(brokerMessage.message);\n this.pendingRequests.delete(brokerMessage.id);\n }\n }\n };\n async sendMessage(message) {\n const originalId = message?.id;\n this.debug(`sendMessage: originalId=${originalId}`, message);\n // Rewrite the message ID to make it globally unique\n const rewrittenMessage = this.rewriteMessage(message);\n const rewrittenId = rewrittenMessage?.id;\n if (this.isLeader) {\n // If leader but worker not ready yet, wait until ready\n if (!this.worker) {\n this.debug(`Leader not ready; waiting for worker to initialize`);\n if (this.workerReadyPromise) {\n await this.workerReadyPromise;\n }\n }\n if (this.worker) {\n this.debug(`Sending to worker with rewrittenId=${rewrittenId}`, message);\n this.worker.postMessage(rewrittenMessage);\n return;\n }\n // Fallback if still no worker (should not happen): broadcast as follower\n this.debug(`Worker still not available after wait; falling back to broadcast`);\n }\n else {\n // We're a follower, send via broadcast channel to leader\n if (!this.broadcastChannel) {\n throw new Error(\"Broker not started\");\n }\n const requestId = String(this.nextRequestId++);\n this.debug(`Sending worker-request: brokerRequestId=${requestId}, rewrittenId=${rewrittenId}`, message);\n const request = {\n type: \"worker-request\",\n id: requestId,\n message: rewrittenMessage,\n };\n // Wait for response from leader\n await new Promise((resolve, reject) => {\n // Set a timeout\n const timeout = setTimeout(() => {\n this.pendingRequests.delete(requestId);\n reject(new MultiTabWorkerBrokerError(`MultiTabWorkerBroker request timeout - no leader responded within ${this.timeout}ms`, {\n rpcMessage: message,\n }));\n }, this.timeout);\n this.pendingRequests.set(requestId, {\n resolve: () => {\n clearTimeout(timeout);\n resolve();\n },\n reject: (error) => {\n clearTimeout(timeout);\n reject(error);\n },\n });\n this.broadcastChannel.postMessage(request);\n });\n }\n }\n /** Stop the broker and release all resources */\n async stop() {\n if (this.stopPromise) {\n await this.stopPromise;\n return;\n }\n if (!this.started) {\n return;\n }\n this.started = false;\n const performStop = async () => {\n if (this.lockAbortController) {\n this.lockAbortController.abort();\n }\n const lockPromiseToAwait = this.activeLockPromise;\n if (lockPromiseToAwait) {\n try {\n await lockPromiseToAwait;\n }\n catch (error) {\n if (error && error.name !== \"AbortError\") {\n this.error(\"Error while waiting for lock release:\", error);\n }\n }\n this.activeLockPromise = null;\n }\n if (this.worker) {\n this.worker.terminate();\n this.worker = null;\n }\n const channel = this.broadcastChannel;\n if (channel) {\n channel.removeEventListener(\"message\", this.handleBroadcastMessage);\n channel.close();\n this.broadcastChannel = null;\n }\n for (const [id, pending] of this.pendingRequests.entries()) {\n pending.reject(new Error(\"Broker stopped\"));\n }\n this.pendingRequests.clear();\n this.emitCloseToAllConnections();\n for (const { reader, writer } of this.connections.values()) {\n reader.dispose();\n writer.dispose();\n }\n this.connections.clear();\n this.workerReadyPromise = null;\n this.workerReadyResolver = null;\n this.leaderRequestQueue = [];\n this.rewrittenIdMap.clear();\n const wasLeader = this.isLeader;\n this.isLeader = false;\n if (wasLeader) {\n this.onStateChange?.({ isLeader: false });\n }\n };\n this.stopPromise = (async () => {\n try {\n await performStop();\n }\n finally {\n this.stopPromise = null;\n }\n })();\n await this.stopPromise;\n }\n}\nclass MultiTabMessageReader {\n errorEmitter = new Emitter();\n closeEmitter = new Emitter();\n partialMessageEmitter = new Emitter();\n messageEmitter = new Emitter();\n disposed = false;\n hasListener = false;\n queuedMessages = [];\n static MAX_QUEUE = 1000;\n onError = this.errorEmitter.event;\n onClose = this.closeEmitter.event;\n onPartialMessage = this.partialMessageEmitter.event;\n listen(callback) {\n const disposable = this.messageEmitter.event((message) => {\n callback(message);\n });\n if (!this.hasListener) {\n this.hasListener = true;\n // Flush any queued messages in order now that a listener is attached\n if (this.queuedMessages.length > 0) {\n const toFlush = this.queuedMessages.splice(0, this.queuedMessages.length);\n for (const msg of toFlush) {\n this.messageEmitter.fire(msg);\n }\n }\n }\n return disposable;\n }\n _emitMessage(message) {\n if (!this.disposed) {\n if (this.hasListener) {\n this.messageEmitter.fire(message);\n }\n else {\n // Queue until a listener is attached\n if (this.queuedMessages.length >= MultiTabMessageReader.MAX_QUEUE) {\n // Drop oldest to prevent unbounded growth\n this.queuedMessages.shift();\n }\n this.queuedMessages.push(message);\n }\n }\n }\n _emitError(error) {\n if (!this.disposed) {\n this.errorEmitter.fire(error);\n }\n }\n _emitClose() {\n if (!this.disposed) {\n this.closeEmitter.fire();\n }\n }\n dispose() {\n if (!this.disposed) {\n this.disposed = true;\n this.errorEmitter.dispose();\n this.closeEmitter.dispose();\n this.partialMessageEmitter.dispose();\n this.messageEmitter.dispose();\n this.queuedMessages = [];\n }\n }\n}\nclass MultiTabMessageWriter {\n errorEmitter = new Emitter();\n closeEmitter = new Emitter();\n disposed = false;\n writeHandler = null;\n onError = this.errorEmitter.event;\n onClose = this.closeEmitter.event;\n async write(message) {\n if (this.disposed) {\n throw new Error(\"Writer is disposed\");\n }\n if (!this.writeHandler) {\n throw new Error(\"Writer not initialized\");\n }\n try {\n await this.writeHandler(message);\n }\n catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.errorEmitter.fire([err, message, undefined]);\n throw err;\n }\n }\n end() {\n // Not needed for broker communication\n }\n _setWriteHandler(handler) {\n this.writeHandler = handler;\n }\n _emitError(error) {\n if (!this.disposed) {\n this.errorEmitter.fire([error, undefined, undefined]);\n }\n }\n _emitClose() {\n if (!this.disposed) {\n this.closeEmitter.fire();\n }\n }\n dispose() {\n if (!this.disposed) {\n this.disposed = true;\n this.writeHandler = null;\n this.errorEmitter.dispose();\n this.closeEmitter.dispose();\n }\n }\n}\n","/**\n * Substrate Logging Utility\n *\n * A unified logging system with configurable levels and component filtering.\n *\n * Configuration via globals:\n * - __SUBSTRATE_LOG_LEVEL: \"off\" | \"error\" | \"warn\" | \"info\" | \"debug\" | \"trace\"\n * - __SUBSTRATE_LOG_COMPONENTS: string[] - filter to specific components (empty = all)\n *\n * Or via API:\n * - setLogLevel(\"debug\")\n * - setLogComponents([\"vfs\", \"proc\"])\n */\n\n// ============================================================================\n// Original Console Reference\n// ============================================================================\n\n/**\n * Capture the original browser console at module load time.\n *\n * CRITICAL: runWithGlobals() replaces globalThis.console with a child process\n * console that routes output to process stdout/stderr. If our internal logging\n * used globalThis.console, it would cause infinite recursion:\n *\n * 1. User code: console.log(\"hello\")\n * 2. Custom console → processContext.writeStdout()\n * 3. writeStdout() → procLog.trace() → console.debug() (OOPS! globalThis.console is replaced)\n * 4. Custom console → processContext.writeStdout()\n * 5. → infinite recursion → stack overflow\n *\n * By capturing the original console here, our internal logging always goes\n * to the real browser console, never to a child process's stdout.\n */\nconst _console = console;\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type LogLevel = \"off\" | \"error\" | \"warn\" | \"info\" | \"debug\" | \"trace\";\n\nexport interface LogConfig {\n level: LogLevel;\n components: string[];\n}\n\nexport interface Logger {\n error: (...args: unknown[]) => void;\n warn: (...args: unknown[]) => void;\n info: (...args: unknown[]) => void;\n debug: (...args: unknown[]) => void;\n trace: (...args: unknown[]) => void;\n /** Log at a specific level */\n log: (level: LogLevel, ...args: unknown[]) => void;\n}\n\n// ============================================================================\n// Configuration\n// ============================================================================\n\n/** Log level ordering (higher = more verbose) */\nconst LOG_LEVEL_ORDER: Record<LogLevel, number> = {\n off: 0,\n error: 1,\n warn: 2,\n info: 3,\n debug: 4,\n trace: 5,\n};\n\n/** Get current log level from global config */\nexport function getLogLevel(): LogLevel {\n const level = (globalThis as Record<string, unknown>).__SUBSTRATE_LOG_LEVEL;\n if (typeof level === \"string\" && level in LOG_LEVEL_ORDER) {\n return level as LogLevel;\n }\n return \"info\";\n}\n\n/** Set log level at runtime */\nexport function setLogLevel(level: LogLevel): void {\n (globalThis as Record<string, unknown>).__SUBSTRATE_LOG_LEVEL = level;\n}\n\n/** Get component filter */\nexport function getLogComponents(): string[] {\n const components = (globalThis as Record<string, unknown>).__SUBSTRATE_LOG_COMPONENTS;\n if (Array.isArray(components)) {\n return components as string[];\n }\n return [];\n}\n\nexport function withNoLogging(fn: () => void): void {\n const originalLogLevel = getLogLevel();\n try {\n setLogLevel(\"off\");\n return fn();\n } finally {\n setLogLevel(originalLogLevel);\n }\n}\n\n/** Set component filter at runtime */\nexport function setLogComponents(components: string[]): void {\n (globalThis as Record<string, unknown>).__SUBSTRATE_LOG_COMPONENTS = components;\n}\n\n/** Get full log config */\nexport function getLogConfig(): LogConfig {\n return {\n level: getLogLevel(),\n components: getLogComponents(),\n };\n}\n\n/** Set full log config at runtime */\nexport function setLogConfig(config: Partial<LogConfig>): void {\n if (config.level !== undefined) {\n setLogLevel(config.level);\n }\n if (config.components !== undefined) {\n setLogComponents(config.components);\n }\n}\n\n// ============================================================================\n// Filtering\n// ============================================================================\n\n/** Check if a log should be emitted based on current config */\nexport function shouldLog(level: LogLevel, component: string): boolean {\n const configLevel = getLogLevel();\n const configComponents = getLogComponents();\n\n // Check level threshold\n if (LOG_LEVEL_ORDER[level] > LOG_LEVEL_ORDER[configLevel]) {\n return false;\n }\n\n // Check component filter (empty = log all)\n if (configComponents.length > 0) {\n // Support wildcard matching\n const matches = configComponents.some((pattern) => {\n if (pattern.endsWith(\"*\")) {\n return component.startsWith(pattern.slice(0, -1));\n }\n return component === pattern;\n });\n if (!matches) {\n return false;\n }\n }\n\n return true;\n}\n\n// ============================================================================\n// Logger Factory\n// ============================================================================\n\n/** Color codes for different log levels (for browser/terminal) */\nconst LEVEL_COLORS: Record<LogLevel, string> = {\n off: \"\",\n error: \"color: #ff5555; font-weight: bold\",\n warn: \"color: #ffaa00; font-weight: bold\",\n info: \"color: #55aaff\",\n debug: \"color: #888888\",\n trace: \"color: #666666\",\n};\n\n/** Create a logger for a specific component */\nexport function createLogger(component: string): Logger {\n const emit = (level: LogLevel, ...args: unknown[]) => {\n if (level === \"off\") return;\n if (!shouldLog(level, component)) return;\n\n const prefix = `[${component}]`;\n const timestamp = new Date().toISOString().split(\"T\")[1]?.slice(0, -1) ?? \"\";\n\n // Use the captured _console to avoid recursion when globalThis.console\n // has been replaced by a child process console.\n switch (level) {\n case \"error\":\n _console.error(\n `%c${timestamp} ${level.toUpperCase()} ${prefix}`,\n LEVEL_COLORS[level],\n ...args,\n );\n break;\n case \"warn\":\n _console.warn(\n `%c${timestamp} ${level.toUpperCase()} ${prefix}`,\n LEVEL_COLORS[level],\n ...args,\n );\n break;\n case \"info\":\n _console.info(\n `%c${timestamp} ${level.toUpperCase()} ${prefix}`,\n LEVEL_COLORS[level],\n ...args,\n );\n break;\n case \"debug\":\n _console.debug(\n `%c${timestamp} ${level.toUpperCase()} ${prefix}`,\n LEVEL_COLORS[level],\n ...args,\n );\n break;\n case \"trace\":\n _console.debug(\n `%c${timestamp} ${level.toUpperCase()} ${prefix}`,\n LEVEL_COLORS[level],\n ...args,\n );\n break;\n }\n };\n\n return {\n error: (...args) => emit(\"error\", ...args),\n warn: (...args) => emit(\"warn\", ...args),\n info: (...args) => emit(\"info\", ...args),\n debug: (...args) => emit(\"debug\", ...args),\n trace: (...args) => emit(\"trace\", ...args),\n log: emit,\n };\n}\n\n// ============================================================================\n// Pre-configured Loggers\n// ============================================================================\n\n/** Kernel logger */\nexport const kernelLog = createLogger(\"kernel\");\n\n/** VFS logger */\nexport const vfsLog = createLogger(\"vfs\");\n\n/** Process logger */\nexport const procLog = createLogger(\"proc\");\n\n/** Network logger */\nexport const netLog = createLogger(\"net\");\n\n/** Event loop logger */\nexport const eventLog = createLogger(\"events\");\n\n/** Module loader logger */\nexport const moduleLog = createLogger(\"module\");\n\n/** ESM loader logger */\nexport const esmLog = createLogger(\"esm\");\n\n/** HTTP logger */\nexport const httpLog = createLogger(\"http\");\n\n/** WebSocket logger */\nexport const wsLog = createLogger(\"ws\");\n\n/** Child process logger */\nexport const childLog = createLogger(\"child_process\");\n\n/** Buffer logger */\nexport const bufferLog = createLogger(\"buffer\");\n\n/** Stream logger */\nexport const streamLog = createLogger(\"stream\");\n\n/** FS logger */\nexport const fsLog = createLogger(\"fs\");\n\n/** Worker logger (for worker/client communication) */\nexport const workerLog = createLogger(\"worker\");\n\n/** Runtime logger */\nexport const runtimeLog = createLogger(\"runtime\");\n","/**\n * Substrate CDN asset URLs.\n *\n * Assets (kernel WASM, runtime worker, network driver) are distributed via\n * the Gadget CDN at versioned paths. They also ship inside the npm package\n * under dist/assets/ for consumers who want to self-host.\n */\n\n/** CDN base URL for all Substrate assets. */\nexport const SUBSTRATE_CDN_BASE = \"https://assets.gadget.dev/substrate\";\n\n/** Package version — kept in sync by scripts/release.mjs. */\nexport const SUBSTRATE_VERSION = \"0.1.0-rc.1\";\n\n/** Get the CDN URL for the kernel WASM binary. */\nexport function getKernelUrl(version = SUBSTRATE_VERSION): string {\n return `${SUBSTRATE_CDN_BASE}/v${version}/kernel.wasm`;\n}\n\n/** Get the CDN URL for the Substrate runtime bundle. */\nexport function getRuntimeUrl(version = SUBSTRATE_VERSION): string {\n return `${SUBSTRATE_CDN_BASE}/v${version}/runtime.js`;\n}\n\n/** Get the CDN URL for the Substrate network driver bundle. */\nexport function getNetworkDriverUrl(version = SUBSTRATE_VERSION): string {\n return `${SUBSTRATE_CDN_BASE}/v${version}/network-driver.js`;\n}\n\n/** Get the CDN URL for a binary tarball (e.g., npm, yarn, pnpm). */\nexport function getBinaryTarballUrl(\n binary: string,\n binaryVersion: string,\n version = SUBSTRATE_VERSION,\n): string {\n return `${SUBSTRATE_CDN_BASE}/v${version}/${binary}-${binaryVersion}-bundle.tgz`;\n}\n","export function dirname(path: string): string {\n if (path.length === 0) return \".\";\n\n const hasRoot = path.charCodeAt(0) === 47;\n let end = -1;\n let matchedSlash = true;\n\n for (let i = path.length - 1; i >= 1; i--) {\n if (path.charCodeAt(i) === 47) {\n if (!matchedSlash) {\n end = i;\n break;\n }\n } else {\n matchedSlash = false;\n }\n }\n\n if (end === -1) {\n return hasRoot ? \"/\" : \".\";\n }\n\n if (hasRoot && end === 1) {\n return \"/\";\n }\n\n return path.slice(0, end);\n}\n\nexport function basename(path: string, ext?: string): string {\n let start = 0;\n let end = path.length;\n let matchedSlash = true;\n\n for (let i = path.length - 1; i >= 0; i--) {\n if (path.charCodeAt(i) === 47) {\n if (!matchedSlash) {\n start = i + 1;\n break;\n }\n } else if (matchedSlash) {\n matchedSlash = false;\n end = i + 1;\n }\n }\n\n const base = path.slice(start, end);\n\n if (ext && base.endsWith(ext)) {\n return base.slice(0, base.length - ext.length);\n }\n\n return base;\n}\n\nexport function extname(path: string): string {\n let startDot = -1;\n let startPart = 0;\n let end = path.length;\n let matchedSlash = true;\n let preDotState = 0;\n\n for (let i = path.length - 1; i >= 0; i--) {\n const code = path.charCodeAt(i);\n if (code === 47) {\n if (!matchedSlash) {\n startPart = i + 1;\n break;\n }\n continue;\n }\n\n if (matchedSlash) {\n matchedSlash = false;\n end = i + 1;\n }\n\n if (code === 46) {\n if (startDot === -1) {\n startDot = i;\n } else if (preDotState !== 1) {\n preDotState = 1;\n }\n } else if (startDot !== -1) {\n preDotState = -1;\n }\n }\n\n if (\n startDot === -1 ||\n preDotState === 0 ||\n (preDotState === 1 && startDot === end - 1 && startDot === startPart + 1)\n ) {\n return \"\";\n }\n\n return path.slice(startDot, end);\n}\n\n/**\n * Normalize a path, resolving '..' and '.' segments\n */\nexport function normalize(path: string): string {\n if (path.length === 0) return \".\";\n\n const isAbsolute = path.charCodeAt(0) === 47; // '/'\n const trailingSlash = path.charCodeAt(path.length - 1) === 47;\n\n const segments = path.split(\"/\");\n const result: string[] = [];\n\n for (const segment of segments) {\n if (segment === \"\" || segment === \".\") {\n continue;\n }\n if (segment === \"..\") {\n if (result.length > 0 && result[result.length - 1] !== \"..\") {\n result.pop();\n } else if (!isAbsolute) {\n result.push(\"..\");\n }\n } else {\n result.push(segment);\n }\n }\n\n let normalized = result.join(\"/\");\n\n if (isAbsolute) {\n normalized = \"/\" + normalized;\n }\n\n if (trailingSlash && normalized.length > 1) {\n normalized += \"/\";\n }\n\n return normalized || (isAbsolute ? \"/\" : \".\");\n}\n\n/**\n * Join path segments\n */\nexport function join(...paths: string[]): string {\n if (paths.length === 0) return \".\";\n\n let joined = \"\";\n for (const path of paths) {\n if (path.length > 0) {\n if (joined.length === 0) {\n joined = path;\n } else {\n joined += \"/\" + path;\n }\n }\n }\n\n return normalize(joined);\n}\n\n/**\n * Resolve a sequence of paths to an absolute path\n */\nexport function resolve(...paths: string[]): string {\n let resolved = \"\";\n\n for (let i = paths.length - 1; i >= 0; i--) {\n const p = paths[i]!;\n if (p.length === 0) continue;\n\n resolved = p + (resolved.length > 0 ? \"/\" + resolved : \"\");\n\n if (p.charCodeAt(0) === 47) {\n // Absolute path found\n break;\n }\n }\n\n // If still relative, prepend cwd\n if (resolved.length === 0 || resolved.charCodeAt(0) !== 47) {\n resolved = \"/\" + resolved;\n }\n return normalize(resolved);\n}\n\n/**\n * Check if path is absolute\n */\nexport function isAbsolute(path: string): boolean {\n return path.length > 0 && path.charCodeAt(0) === 47;\n}\n","/**\n * Binary Configuration\n *\n * Central configuration for all binaries that Substrate can install and run.\n * This module is the source of truth for:\n * - Binary versions\n * - Binary handlers\n * - Tarball URL generation\n * - Binary specs for initialization\n */\n\nimport { getBinaryTarballUrl } from \"./kernel/wasm.js\";\nimport { join } from \"./utils/path.js\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * Specification for installing a binary\n */\nexport interface BinarySpec {\n /** URL to the tarball containing the binary */\n tarUrl: string;\n}\n\n/**\n * Available binary names\n *\n */\nexport type BinaryName = \"npm\" | \"pnpm\" | \"yarn\";\n\n// =============================================================================\n// Version Configuration\n// =============================================================================\n\n/**\n * Default versions for each binary.\n * Update these when upgrading binary versions.\n */\nexport const BINARY_VERSIONS: Record<BinaryName, string> = {\n /** npm CLI version */\n npm: \"11.8.0\",\n /** pnpm CLI version */\n pnpm: \"10.6.4\",\n /** yarn Classic CLI version */\n yarn: \"1.22.22\",\n};\n\n// =============================================================================\n// URL Helpers\n// =============================================================================\n\n/**\n * Get the default tarball URL for a binary.\n *\n * When no baseUrl is provided, returns the CDN URL for the binary tarball.\n * When a baseUrl is provided, returns a relative path under that base.\n *\n * @param binary - The binary name\n * @param baseUrl - Base URL prefix. If omitted, uses the Gadget CDN.\n * @returns The full tarball URL\n */\nexport function getDefaultTarballUrl(binary: BinaryName, baseUrl?: string): string {\n const version = BINARY_VERSIONS[binary];\n if (baseUrl !== undefined) {\n return join(baseUrl, `${binary}-${version}-bundle.tgz`);\n }\n return getBinaryTarballUrl(binary, version);\n}\n\n/**\n * Get default BinarySpec objects for all binaries\n *\n * @param baseUrl - Base URL prefix for tarball URLs\n * @returns Record of binary names to their specs\n */\nexport function getDefaultBinarySpecs(baseUrl?: string): Record<BinaryName, BinarySpec> {\n return {\n npm: { tarUrl: getDefaultTarballUrl(\"npm\", baseUrl) },\n pnpm: { tarUrl: getDefaultTarballUrl(\"pnpm\", baseUrl) },\n yarn: { tarUrl: getDefaultTarballUrl(\"yarn\", baseUrl) },\n };\n}\n\n// =============================================================================\n// Utility Functions\n// =============================================================================\n\n/**\n * Get all binary names\n */\nexport function getBinaryNames(): BinaryName[] {\n return Object.keys(BINARY_VERSIONS) as BinaryName[];\n}\n\n/**\n * Get all binary versions as a record\n */\nexport function getBinaryVersions(): Record<BinaryName, string> {\n return { ...BINARY_VERSIONS };\n}\n\n/**\n * Check if a string is a valid binary name\n */\nexport function isBinaryName(name: string): name is BinaryName {\n return name in BINARY_VERSIONS;\n}\n","/**\n * Substrate Bootloader\n *\n * Consolidates all Substrate initialization:\n * - Service Worker registration and activation\n * - Multi-tab coordination (via thumbdrive's MultiTabWorkerBroker)\n * - Kernel WASM loading\n * - OPFS filesystem initialization (future)\n *\n * @example\n * ```ts\n * import { bootSubstrate } from '@gadgetinc/substrate/boot';\n *\n * const substrate = await bootSubstrate({\n * name: 'my-project',\n * });\n *\n * // fetch() and WebSocket just work - SW intercepts transparently\n * const response = await fetch('/api/hello');\n * ```\n */\n\nimport { MultiTabWorkerBroker } from \"thumbdrive\";\nimport type { RoutingConfig } from \"../sw/index.js\";\nimport { createLogger } from \"../utils/debug.js\";\n\n// Create a logger for the boot module\nconst bootLog = createLogger(\"boot\");\n\n// Type definition for worker messages\ninterface WorkerMessage {\n type: string;\n id?: number;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [key: string]: any;\n}\nimport type { BinarySpec, BinaryName } from \"../binaries.js\";\nimport { getDefaultTarballUrl, getBinaryNames } from \"../binaries.js\";\nimport { getKernelUrl, getRuntimeUrl, getNetworkDriverUrl } from \"../kernel/wasm.js\";\nimport type { ConsoleLogLevel } from \"../worker/types.js\";\nimport type { ProcessInfo } from \"../kernel/types.js\";\nimport type { WasmPackageMapping } from \"../runtime/wasm-package-interceptor.js\";\nexport type { WasmPackageMapping };\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface SubstrateBootConfig {\n /**\n * Unique name for this Substrate instance.\n * Used for multi-tab coordination - all tabs with the same name share a kernel.\n */\n name?: string;\n\n /**\n * URL to the Substrate kernel WASM\n * @default CDN URL based on package version\n */\n kernelUrl?: string;\n\n /**\n * URL to the Substrate runtime entrypoint.\n * @default CDN URL based on package version\n */\n runtimeUrl?: string | URL;\n\n /**\n * URL to the Substrate network driver entrypoint.\n * @default CDN URL based on package version\n */\n networkDriverUrl?: string;\n\n /**\n * Base URL for binary tarball URLs.\n * If not specified, uses the Gadget CDN.\n */\n binaryTarballBaseUrl?: string;\n\n /**\n * Base path for routing. All requests below this path will be routed to the kernel.\n * If not specified, derived from the current URL pathname.\n *\n * @example\n * // If page is at /playground/project-123/index.html\n * // basePath will be /playground/project-123/\n * // Pass null to explicitly disable basePath routing (use port-based only)\n */\n basePath?: string | null;\n\n /**\n * Port to route basePath requests to. When set along with basePath, the SW\n * strips the basePath prefix and rewrites the URL to localhost:{basePathPort}\n * so the kernel's substrateFetch routes by port to the correct virtual server.\n * The target server does NOT need to know about the basePath — it serves\n * from \"/\".\n *\n * The SW also tracks which clients (iframes) were served via basePath, so\n * subsequent same-origin requests from those clients (root-relative URLs\n * without the prefix) are automatically routed to the same port.\n *\n * @example\n * // basePath: \"/__preview__\", basePathPort: 5173\n * // Navigation to /__preview__/ → http://localhost:5173/\n * // Sub-resource /src/main.js from that iframe → http://localhost:5173/src/main.js\n */\n basePathPort?: number | null;\n\n /**\n * CORS proxy URL for external requests.\n * If not specified, external requests will be attempted directly (may fail with CORS errors).\n */\n proxyUrl?: string;\n\n /**\n * Domains that don't need proxying (known to be CORS-friendly).\n */\n neverProxy?: string[];\n\n /**\n * Initial working directory.\n * @default '/'\n */\n cwd?: string;\n\n /**\n * Environment variables.\n */\n env?: Record<string, string>;\n\n /**\n * Binaries to install into the runtime.\n *\n */\n binaries?: {\n npm?: boolean | BinarySpec;\n pnpm?: boolean | BinarySpec;\n yarn?: boolean | BinarySpec;\n };\n\n /**\n * Logging configuration for the runtime.\n */\n logging?: {\n level?: \"off\" | \"error\" | \"warn\" | \"info\" | \"debug\" | \"trace\";\n components?: string[];\n };\n\n /**\n * Debug options.\n */\n debug?: {\n trackVfs?: boolean;\n };\n\n /**\n * Custom WASM package mappings. When a native binding matching one of the\n * patterns is detected during mount(), the corresponding WASM package is\n * fetched from npm and used instead.\n *\n * Default mappings for rollup, esbuild, and rolldown are always registered.\n * Custom mappings with the same `packageName` as a default will override it.\n *\n * @example\n * ```ts\n * await bootSubstrate({\n * wasmPackages: [{\n * packageName: \"my-tool\",\n * wasmPackage: \"my-tool-wasm\",\n * nativeBindingPatterns: [\"^@my-tool/native-\"],\n * wasmExportPath: \"dist/index.js\",\n * }],\n * });\n * ```\n */\n wasmPackages?: WasmPackageMapping[];\n\n /**\n * Persistence configuration. When set, the runtime opens an OPFS store\n * and wires host imports for the kernel's persistence bridge.\n */\n persistence?: {\n /** Name of the OPFS store. Each name gets its own isolated storage. */\n storeName: string;\n };\n\n /**\n * Callback for console output from worker/runtime logs.\n * Args are forwarded to preserve console formatting (e.g. %c).\n */\n onConsole?: (logLevel: ConsoleLogLevel, args: unknown[]) => void;\n\n /**\n * Callback when a port starts listening.\n */\n onPortListen?: (port: number) => void;\n\n /**\n * Callback when a port stops listening.\n */\n onPortClose?: (port: number) => void;\n}\n\nexport interface SubstrateClient {\n /**\n * Whether this tab is the leader (owns the kernel).\n */\n readonly isLeader: boolean;\n\n /**\n * Mount files to the virtual filesystem.\n */\n mount(tree: FileSystemTree, mountPoint?: string): Promise<void>;\n\n /**\n * Read a file from the virtual filesystem.\n */\n readFile(path: string): Promise<string>;\n\n /**\n * Write a file to the virtual filesystem.\n */\n writeFile(path: string, content: string): Promise<void>;\n\n /**\n * Spawn a process.\n */\n spawn(command: string, args?: string[], options?: SpawnOptions): SubstrateProcess;\n\n /**\n * Wait for a port to start listening.\n */\n waitForPort(port: number, timeout?: number): Promise<void>;\n\n /**\n * Check if a port is listening.\n */\n isListening(port: number): boolean;\n\n /**\n * Get all listening ports.\n */\n getListeningPorts(): number[];\n\n /**\n * Persist the current VFS state to the OPFS store.\n * Requires a store to be open (either via boot config or mountStore).\n * Flushes all dirty inodes and saves VFS metadata.\n */\n persist(): Promise<void>;\n\n /**\n * Open an OPFS store and mount its VFS (lazy, metadata-only).\n * Can be called after boot to load a previously persisted filesystem.\n * File data is loaded on demand when accessed.\n */\n mountStore(storeName: string): Promise<void>;\n\n /**\n * List available OPFS store names.\n */\n listStores(): Promise<string[]>;\n\n /**\n * Delete an OPFS store and all its data.\n */\n deleteStore(storeName: string): Promise<void>;\n\n /**\n * Terminate the runtime. Awaits worker shutdown to release OPFS handles.\n */\n terminate(): Promise<void>;\n\n /**\n * List all processes in the kernel process table.\n * @param options.includeExited - Include recently reaped processes (default: false)\n * Useful for debugging and verifying process cleanup.\n */\n listProcesses(options?: { includeExited?: boolean }): Promise<ProcessInfo[]>;\n\n /**\n * Add a listener for leadership changes.\n */\n on(event: \"leadership\", callback: (isLeader: boolean) => void): void;\n\n /**\n * WebSocket constructor that routes connections through the virtual network.\n *\n * Use this instead of the native WebSocket to connect to servers running in Substrate.\n *\n * @example\n * ```ts\n * const ws = new substrate.WebSocket('ws://localhost:8080');\n * ws.onopen = () => ws.send('Hello!');\n * ws.onmessage = (e) => console.log(e.data);\n * ```\n */\n WebSocket: {\n new (url: string | URL, protocols?: string | string[]): SubstrateWebSocketProxy;\n readonly CONNECTING: 0;\n readonly OPEN: 1;\n readonly CLOSING: 2;\n readonly CLOSED: 3;\n };\n}\n\n/**\n * WebSocket proxy that communicates with virtual servers through the worker.\n * Implements the standard WebSocket API.\n */\nexport interface SubstrateWebSocketProxy extends EventTarget {\n readonly url: string;\n readonly readyState: number;\n readonly protocol: string;\n readonly extensions: string;\n readonly bufferedAmount: number;\n binaryType: \"blob\" | \"arraybuffer\";\n\n onopen: ((this: SubstrateWebSocketProxy, ev: Event) => void) | null;\n onmessage: ((this: SubstrateWebSocketProxy, ev: MessageEvent) => void) | null;\n onerror: ((this: SubstrateWebSocketProxy, ev: Event) => void) | null;\n onclose: ((this: SubstrateWebSocketProxy, ev: CloseEvent) => void) | null;\n\n send(data: string | ArrayBufferLike | Blob | ArrayBufferView): void;\n close(code?: number, reason?: string): void;\n}\n\nexport interface FileNode {\n file: {\n contents: string | Uint8Array;\n };\n}\n\nexport interface DirectoryNode {\n directory: FileSystemTree;\n}\n\nexport type FileSystemTree = {\n [name: string]: FileNode | DirectoryNode;\n};\n\nexport interface SpawnOptions {\n cwd?: string;\n env?: Record<string, string>;\n}\n\nexport interface SubstrateProcess {\n readonly pid: Promise<number>;\n stdout: ReadableStream<string>;\n stderr: ReadableStream<string>;\n exit: Promise<number>;\n kill(): void;\n}\n\n// =============================================================================\n// ProxyWebSocket Implementation\n// =============================================================================\n\n/** WebSocket ready states */\nconst WS_CONNECTING = 0;\nconst WS_OPEN = 1;\nconst WS_CLOSING = 2;\nconst WS_CLOSED = 3;\n\n/**\n * Internal class that implements the WebSocket API and proxies through the worker.\n *\n * This is NOT exported directly - users access it via `substrate.WebSocket`.\n */\nclass ProxyWebSocket extends EventTarget implements SubstrateWebSocketProxy {\n // Static constants (matching native WebSocket)\n static readonly CONNECTING = WS_CONNECTING;\n static readonly OPEN = WS_OPEN;\n static readonly CLOSING = WS_CLOSING;\n static readonly CLOSED = WS_CLOSED;\n\n // Instance properties\n readonly url: string;\n private _readyState: number = WS_CONNECTING;\n private _protocol = \"\";\n private _extensions = \"\";\n private _bufferedAmount = 0;\n binaryType: \"blob\" | \"arraybuffer\" = \"blob\";\n\n // Event handlers\n onopen: ((this: SubstrateWebSocketProxy, ev: Event) => void) | null = null;\n onmessage: ((this: SubstrateWebSocketProxy, ev: MessageEvent) => void) | null = null;\n onerror: ((this: SubstrateWebSocketProxy, ev: Event) => void) | null = null;\n onclose: ((this: SubstrateWebSocketProxy, ev: CloseEvent) => void) | null = null;\n\n // Internal\n private _wsId: number;\n private _send: (msg: { type: string; id: number; [key: string]: unknown }) => Promise<unknown>;\n private _getNextId: () => number;\n\n constructor(\n url: string | URL,\n protocols: string | string[] | undefined,\n wsId: number,\n send: (msg: { type: string; id: number; [key: string]: unknown }) => Promise<unknown>,\n getNextId: () => number,\n ) {\n super();\n this.url = typeof url === \"string\" ? url : url.toString();\n this._wsId = wsId;\n this._send = send;\n this._getNextId = getNextId;\n\n const protocolArray = Array.isArray(protocols) ? protocols : protocols ? [protocols] : [];\n\n // Initiate connection via worker\n queueMicrotask(() => {\n this._send({\n type: \"ws_connect\",\n id: this._getNextId(),\n wsId: this._wsId,\n url: this.url,\n protocols: protocolArray,\n }).catch((err) => {\n this._handleError(err instanceof Error ? err.message : String(err));\n });\n });\n }\n\n get readyState(): number {\n return this._readyState;\n }\n\n get protocol(): string {\n return this._protocol;\n }\n\n get extensions(): string {\n return this._extensions;\n }\n\n get bufferedAmount(): number {\n return this._bufferedAmount;\n }\n\n send(data: string | ArrayBufferLike | Blob | ArrayBufferView): void {\n if (this._readyState !== WS_OPEN) {\n throw new DOMException(\n \"Failed to execute 'send' on 'WebSocket': Still in CONNECTING state.\",\n \"InvalidStateError\",\n );\n }\n\n let payload: string | Uint8Array;\n if (typeof data === \"string\") {\n payload = data;\n } else if (data instanceof ArrayBuffer) {\n payload = new Uint8Array(data);\n } else if (ArrayBuffer.isView(data)) {\n payload = new Uint8Array(data.buffer, data.byteOffset, data.byteLength);\n } else if (data instanceof Blob) {\n // Blob needs async handling - queue the send\n data\n .arrayBuffer()\n .then((buffer) => {\n if (this._readyState === WS_OPEN) {\n this._send({\n type: \"ws_send\",\n id: this._getNextId(),\n wsId: this._wsId,\n data: new Uint8Array(buffer),\n }).catch((err) => {\n bootLog.error(\n `Failed to send WebSocket data: ${err instanceof Error ? err.message : String(err)}`,\n );\n });\n }\n })\n .catch((err) => {\n bootLog.error(\n `Failed to send WebSocket data: ${err instanceof Error ? err.message : String(err)}`,\n );\n });\n return;\n } else {\n throw new TypeError(\"Invalid data type\");\n }\n\n this._send({\n type: \"ws_send\",\n id: this._getNextId(),\n wsId: this._wsId,\n data: payload,\n }).catch(() => {});\n }\n\n close(code?: number, reason?: string): void {\n if (this._readyState === WS_CLOSING || this._readyState === WS_CLOSED) {\n return;\n }\n this._readyState = WS_CLOSING;\n\n this._send({\n type: \"ws_close\",\n id: this._getNextId(),\n wsId: this._wsId,\n code,\n reason,\n }).catch(() => {});\n }\n\n // Internal methods called by the message handler\n _handleOpen(protocol: string): void {\n if (this._readyState !== WS_CONNECTING) return;\n this._readyState = WS_OPEN;\n this._protocol = protocol;\n\n const event = new Event(\"open\");\n this.onopen?.call(this, event);\n this.dispatchEvent(event);\n }\n\n _handleMessage(data: string | Uint8Array): void {\n if (this._readyState !== WS_OPEN) return;\n\n let messageData: string | ArrayBuffer;\n if (typeof data === \"string\") {\n messageData = data;\n } else {\n messageData = data.buffer as ArrayBuffer;\n }\n\n const event = new MessageEvent(\"message\", { data: messageData });\n this.onmessage?.call(this, event);\n this.dispatchEvent(event);\n }\n\n _handleClose(code: number, reason: string, wasClean: boolean): void {\n if (this._readyState === WS_CLOSED) return;\n this._readyState = WS_CLOSED;\n\n const event = new CloseEvent(\"close\", { code, reason, wasClean });\n this.onclose?.call(this, event);\n this.dispatchEvent(event);\n }\n\n _handleError(message: string): void {\n const event = new Event(\"error\");\n // Add message for debugging (non-standard but useful)\n (event as Event & { message?: string }).message = message;\n this.onerror?.call(this, event);\n this.dispatchEvent(event);\n\n // After error, close the connection\n if (this._readyState !== WS_CLOSED) {\n this._readyState = WS_CLOSED;\n const closeEvent = new CloseEvent(\"close\", {\n code: 1006,\n reason: message,\n wasClean: false,\n });\n this.onclose?.call(this, closeEvent);\n this.dispatchEvent(closeEvent);\n }\n }\n}\n\n// =============================================================================\n// Service Worker Registration\n// =============================================================================\n\n/**\n * Register the Service Worker and wait for it to control this page.\n */\nasync function registerServiceWorker(swUrl: string): Promise<ServiceWorkerRegistration> {\n if (!(\"serviceWorker\" in navigator)) {\n throw new Error(\"Service Workers not supported in this browser\");\n }\n\n bootLog.debug(\"Registering Service Worker:\", swUrl);\n\n const registration = await navigator.serviceWorker.register(swUrl, {\n scope: \"/\",\n type: \"module\",\n });\n\n // If there's a waiting worker, tell it to skip waiting\n if (registration.waiting) {\n registration.waiting.postMessage({ type: \"skipWaiting\" });\n }\n\n // If there's an installing worker, wait for it to become active\n if (registration.installing) {\n await new Promise<void>((resolve) => {\n const worker = registration.installing!;\n worker.addEventListener(\"statechange\", () => {\n if (worker.state === \"activated\") {\n resolve();\n }\n });\n });\n }\n\n // Watch for late updates: if the browser starts installing a new SW after\n // the register() call returned (e.g., update check was still in-flight),\n // tell it to skip waiting so it activates immediately.\n registration.addEventListener(\"updatefound\", () => {\n const newWorker = registration.installing;\n if (newWorker) {\n bootLog.debug(\"SW update found, telling new worker to skip waiting\");\n newWorker.postMessage({ type: \"skipWaiting\" });\n }\n });\n\n return registration;\n}\n\n/**\n * Wait for the Service Worker to control this page.\n */\nasync function waitForServiceWorkerControl(): Promise<void> {\n if (navigator.serviceWorker.controller) {\n bootLog.debug(\"Already controlled by Service Worker\");\n return;\n }\n\n bootLog.debug(\"Waiting for Service Worker control...\");\n\n return new Promise((resolve) => {\n navigator.serviceWorker.addEventListener(\n \"controllerchange\",\n () => {\n bootLog.debug(\"Service Worker now controlling page\");\n resolve();\n },\n { once: true },\n );\n\n // Also try to claim immediately\n void navigator.serviceWorker.ready.then((registration) => {\n registration.active?.postMessage({ type: \"claim\" });\n });\n });\n}\n\n/**\n * Send routing configuration to the Service Worker.\n *\n * Also watches for controller changes (e.g., when a new SW activates via\n * skipWaiting during development) and re-sends the config so the new SW\n * has the basePath and other routing state.\n */\nfunction configureServiceWorker(\n registration: ServiceWorkerRegistration,\n config: RoutingConfig,\n): void {\n const sendConfig = () => {\n const worker = registration.active ?? navigator.serviceWorker.controller;\n if (worker) {\n bootLog.debug(\"Sending routing config to SW\");\n worker.postMessage({ type: \"config\", config });\n }\n };\n\n sendConfig();\n\n // Re-send config if a new SW takes control (happens in dev when SW code changes).\n // Without this, the new SW starts with empty config and basePath routing breaks.\n navigator.serviceWorker.addEventListener(\"controllerchange\", () => {\n bootLog.debug(\"SW controller changed, re-sending config\");\n sendConfig();\n });\n}\n\n// =============================================================================\n// Runtime URL Detection\n// =============================================================================\n\n/**\n * Get the URL to the Substrate runtime entrypoint.\n * Returns the CDN URL by default.\n */\nfunction getRuntimeURL(): URL {\n return new URL(getRuntimeUrl());\n}\n\n// =============================================================================\n// Main Boot Function\n// =============================================================================\n\n/**\n * Boot Substrate with Service Worker network interception and multi-tab coordination.\n *\n * This must be called early in your application, before any requests that should\n * be intercepted by the Service Worker.\n *\n * @example\n * ```ts\n * const substrate = await bootSubstrate({\n * name: 'my-project',\n * });\n *\n * await substrate.mount({\n * 'server.js': { file: { contents: '...' } }\n * });\n *\n * substrate.spawn('node', ['server.js']);\n *\n * // fetch() just works - SW intercepts automatically\n * await substrate.waitForPort(3000);\n * const res = await fetch('http://localhost:3000/');\n * ```\n */\nexport async function bootSubstrate(config: SubstrateBootConfig = {}): Promise<SubstrateClient> {\n const networkDriverUrl = config.networkDriverUrl ?? getNetworkDriverUrl();\n // Base path routing is disabled by default (port-based routing only).\n const basePath = config.basePath ?? null;\n const basePathPort = config.basePathPort ?? null;\n\n // 1. Register and activate Service Worker\n const registration = await registerServiceWorker(networkDriverUrl);\n await waitForServiceWorkerControl();\n\n // 2. Build routing config (SW configuration is deferred until after leader\n // election — only the leader should configure the SW, otherwise a follower\n // would overwrite the leader's listeningPorts with an empty list)\n const routingConfig: RoutingConfig = {\n basePath,\n basePathPort,\n listeningPorts: [],\n proxyUrl: config.proxyUrl,\n neverProxy: config.neverProxy ?? [],\n logging: config.logging,\n };\n\n // 3. Create coordinated Substrate instance\n const client = await createSubstrateClient(config, routingConfig, registration);\n\n // 4. Patch globalThis.WebSocket in the boot tab so that localhost connections\n // to virtual servers route through Substrate automatically\n patchGlobalWebSocket(client, routingConfig);\n\n // 5. Register beforeunload flush if persistence is enabled\n if (config.persistence?.storeName) {\n window.addEventListener(\"beforeunload\", () => {\n // Best-effort flush — worker may not complete before page dies\n client.persist().catch(() => {});\n });\n }\n\n return client;\n}\n\n/**\n * Patch globalThis.WebSocket to route localhost connections through Substrate.\n *\n * This allows code in the boot tab to use `new WebSocket('ws://localhost:PORT')`\n * and have it automatically connect to virtual servers running in Substrate.\n */\nfunction patchGlobalWebSocket(client: SubstrateClient, routingConfig: RoutingConfig): void {\n const NativeWebSocket = globalThis.WebSocket;\n\n // Create a WebSocket constructor that routes localhost connections through Substrate\n const PatchedWebSocket = function (\n this: WebSocket | void,\n url: string | URL,\n protocols?: string | string[],\n ): WebSocket {\n const urlString = typeof url === \"string\" ? url : url.toString();\n const parsedUrl = new URL(urlString, globalThis.location?.href);\n const isLocalhost = parsedUrl.hostname === \"localhost\" || parsedUrl.hostname === \"127.0.0.1\";\n\n // Check if this is a localhost connection to a listening port\n if (isLocalhost) {\n const port = parseInt(parsedUrl.port) || (parsedUrl.protocol === \"wss:\" ? 443 : 80);\n\n // If the port is in our listening ports, route through Substrate\n if (routingConfig.listeningPorts.includes(port)) {\n bootLog.debug(`Routing WebSocket to Substrate: ${urlString}`);\n // Return a ProxyWebSocket that routes through the worker\n return new client.WebSocket(url, protocols) as unknown as WebSocket;\n }\n }\n\n // For non-localhost or non-listening ports, use native WebSocket\n return new NativeWebSocket(url, protocols);\n } as unknown as typeof WebSocket;\n\n // Copy static properties using defineProperty to avoid readonly errors\n Object.defineProperties(PatchedWebSocket, {\n CONNECTING: { value: NativeWebSocket.CONNECTING, writable: false },\n OPEN: { value: NativeWebSocket.OPEN, writable: false },\n CLOSING: { value: NativeWebSocket.CLOSING, writable: false },\n CLOSED: { value: NativeWebSocket.CLOSED, writable: false },\n });\n\n // Set prototype to match native WebSocket\n Object.setPrototypeOf(PatchedWebSocket.prototype, NativeWebSocket.prototype);\n\n // Replace global WebSocket\n globalThis.WebSocket = PatchedWebSocket;\n\n bootLog.debug(\"Patched globalThis.WebSocket for Substrate routing\");\n}\n\n// =============================================================================\n// Substrate Client Implementation\n// =============================================================================\n\n/**\n * Create a Substrate client that communicates with the worker.\n *\n * Uses MultiTabWorkerBroker for leader election - only one tab runs the kernel,\n * other tabs communicate through BroadcastChannel.\n */\nasync function createSubstrateClient(\n config: SubstrateBootConfig,\n routingConfig: RoutingConfig,\n registration: ServiceWorkerRegistration,\n): Promise<SubstrateClient> {\n const runtimeUrl = config.runtimeUrl\n ? new URL(config.runtimeUrl.toString(), location.href)\n : getRuntimeURL();\n\n const lockName = `substrate:${config.name ?? \"default\"}`;\n const networkChannel = new BroadcastChannel(\"substrate:network\");\n\n // State\n let nextId = 1;\n const pending = new Map<\n number,\n { resolve: (value: unknown) => void; reject: (error: Error) => void }\n >();\n const listeningPorts = new Set<number>();\n const portListeners = new Map<number, Array<() => void>>();\n const processExitResolvers = new Map<number, (exitCode: number) => void>();\n const pendingExits = new Map<number, number>();\n const processOutputControllers = new Map<\n number,\n {\n stdout: ReadableStreamDefaultController<string>;\n stderr: ReadableStreamDefaultController<string>;\n }\n >();\n const pendingOutput = new Map<number, { stdout: string[]; stderr: string[] }>();\n const leadershipListeners: Array<(isLeader: boolean) => void> = [];\n\n // WebSocket proxy state (for main page connections via substrate.WebSocket)\n let nextWsId = 1;\n const activeWebSockets = new Map<number, ProxyWebSocket>();\n\n // WebSocket state for served pages (via Service Worker)\n // Maps wsId to clientId for routing responses back through SW\n const servedPageWsClients = new Map<number, string>();\n\n // Track leadership state - resolved when Web Lock is acquired (or times out for followers)\n let currentIsLeader = false;\n const { promise: leadershipKnown, resolve: resolveLeadership } = Promise.withResolvers<boolean>();\n\n // Create MultiTabWorkerBroker for leader election\n const broker = new MultiTabWorkerBroker(lockName, () => {\n bootLog.debug(\"Creating worker (this tab is becoming leader)\");\n currentIsLeader = true;\n resolveLeadership(true);\n return new Worker(runtimeUrl, { type: \"module\" });\n });\n\n // Start the broker - this handles leader election.\n // NOTE: start() resolves immediately; the Web Lock is acquired asynchronously.\n // broker.getIsLeader() is unreliable right after start(). Instead, we use a\n // Promise that resolves when the factory fires (leader) or after a short\n // timeout (follower — the factory never fires because the lock is held).\n await broker.start();\n setTimeout(() => resolveLeadership(false), 100);\n currentIsLeader = await leadershipKnown;\n bootLog.debug(`Broker started, isLeader=${currentIsLeader}`);\n\n // Create a connection for reading/writing messages through the broker\n const connection = broker.createConnection();\n\n // Promise that resolves when worker sends \"ready\" message\n // We need to handle this in the main listener to avoid multiple listeners\n let readyResolve: (() => void) | null = null;\n const readyPromise = new Promise<void>((resolve, reject) => {\n readyResolve = resolve;\n setTimeout(() => reject(new Error(\"Worker timeout\")), 10000);\n });\n\n // Listen for messages from the broker (comes from worker via leader)\n // NOTE: Only ONE listener is supported - don't call connection.reader.listen() again!\n connection.reader.listen((raw) => {\n const msg = raw as unknown as WorkerMessage;\n switch (msg.type) {\n case \"success\": {\n if (msg.id === undefined) break;\n const p = pending.get(msg.id);\n if (p) {\n pending.delete(msg.id);\n p.resolve(msg.result);\n }\n break;\n }\n\n case \"error\": {\n if (msg.id === undefined) break;\n const p = pending.get(msg.id);\n if (p) {\n pending.delete(msg.id);\n const err = new Error(msg.error.message) as Error & { code?: string };\n if (msg.error.code) err.code = msg.error.code;\n if (msg.error.stack) err.stack = msg.error.stack;\n p.reject(err);\n }\n break;\n }\n\n case \"log\":\n config.onConsole?.(msg.level, msg.args);\n break;\n\n case \"port_listen\": {\n const port = msg.port as number;\n listeningPorts.add(port);\n if (!routingConfig.listeningPorts.includes(port)) {\n routingConfig.listeningPorts.push(port);\n }\n\n registration.active?.postMessage({ type: \"port_listen\", port });\n // Also broadcast on channel for SW\n networkChannel.postMessage({ type: \"port_listen\", port });\n config.onPortListen?.(port);\n // Resolve waiters\n const listeners = portListeners.get(port);\n if (listeners) {\n for (const resolve of listeners) resolve();\n portListeners.delete(port);\n }\n break;\n }\n\n case \"port_close\": {\n const port = msg.port as number;\n listeningPorts.delete(port);\n const idx = routingConfig.listeningPorts.indexOf(port);\n if (idx !== -1) routingConfig.listeningPorts.splice(idx, 1);\n registration.active?.postMessage({ type: \"port_close\", port });\n networkChannel.postMessage({ type: \"port_close\", port });\n config.onPortClose?.(port);\n break;\n }\n\n case \"proc_exit\": {\n const resolver = processExitResolvers.get(msg.pid);\n processOutputControllers.delete(msg.pid);\n pendingOutput.delete(msg.pid);\n if (resolver) {\n processExitResolvers.delete(msg.pid);\n resolver(msg.exitCode);\n } else {\n pendingExits.set(msg.pid, msg.exitCode);\n }\n break;\n }\n\n case \"proc_stdout\": {\n const controllers = processOutputControllers.get(msg.pid);\n if (controllers?.stdout) {\n controllers.stdout.enqueue(msg.data);\n } else {\n let p = pendingOutput.get(msg.pid);\n if (!p) {\n p = { stdout: [], stderr: [] };\n pendingOutput.set(msg.pid, p);\n }\n p.stdout.push(msg.data);\n }\n break;\n }\n\n case \"proc_stderr\": {\n const controllers = processOutputControllers.get(msg.pid);\n if (controllers?.stderr) {\n controllers.stderr.enqueue(msg.data);\n } else {\n let p = pendingOutput.get(msg.pid);\n if (!p) {\n p = { stdout: [], stderr: [] };\n pendingOutput.set(msg.pid, p);\n }\n p.stderr.push(msg.data);\n }\n break;\n }\n\n // WebSocket proxy events (handles both main page ProxyWebSocket and served page WebSockets)\n case \"ws_open\": {\n // Check if this is for a main page ProxyWebSocket\n const openWs = activeWebSockets.get(msg.wsId);\n if (openWs) {\n openWs._handleOpen(msg.protocol ?? \"\");\n }\n // Check if this is for a served page WebSocket\n const openClientId = servedPageWsClients.get(msg.wsId);\n if (openClientId) {\n networkChannel.postMessage({\n type: \"sw_ws_open\",\n wsId: msg.wsId,\n protocol: msg.protocol,\n });\n }\n break;\n }\n\n case \"ws_message\": {\n // Check if this is for a main page ProxyWebSocket\n const msgWs = activeWebSockets.get(msg.wsId);\n if (msgWs) {\n msgWs._handleMessage(msg.data);\n }\n // Check if this is for a served page WebSocket\n const msgClientId = servedPageWsClients.get(msg.wsId);\n if (msgClientId) {\n networkChannel.postMessage({\n type: \"sw_ws_message\",\n wsId: msg.wsId,\n data: msg.data,\n });\n }\n break;\n }\n\n case \"ws_close\": {\n // Check if this is for a main page ProxyWebSocket\n const closeWs = activeWebSockets.get(msg.wsId);\n if (closeWs) {\n closeWs._handleClose(msg.code ?? 1000, msg.reason ?? \"\", msg.wasClean ?? true);\n activeWebSockets.delete(msg.wsId);\n }\n // Check if this is for a served page WebSocket\n const closeClientId = servedPageWsClients.get(msg.wsId);\n if (closeClientId) {\n networkChannel.postMessage({\n type: \"sw_ws_close\",\n wsId: msg.wsId,\n code: msg.code,\n reason: msg.reason,\n wasClean: msg.wasClean,\n });\n servedPageWsClients.delete(msg.wsId);\n }\n break;\n }\n\n case \"ws_error\": {\n // Check if this is for a main page ProxyWebSocket\n const errorWs = activeWebSockets.get(msg.wsId);\n if (errorWs) {\n errorWs._handleError(msg.message ?? \"WebSocket error\");\n activeWebSockets.delete(msg.wsId);\n }\n // Check if this is for a served page WebSocket\n const errorClientId = servedPageWsClients.get(msg.wsId);\n if (errorClientId) {\n networkChannel.postMessage({\n type: \"sw_ws_error\",\n wsId: msg.wsId,\n message: msg.message,\n });\n servedPageWsClients.delete(msg.wsId);\n }\n break;\n }\n\n case \"ready\":\n // Resolve the ready promise\n if (readyResolve) {\n readyResolve();\n readyResolve = null;\n }\n break;\n }\n });\n\n // Handle network requests from Service Worker\n // Only the leader should respond, but we always listen since leadership can change\n networkChannel.onmessage = async (event) => {\n const msg = event.data;\n\n // Only handle if we're the current leader\n if (!currentIsLeader) return;\n\n if (msg.type === \"fetch\") {\n // Check if the target port is still listening before forwarding to the worker.\n // After a process is killed, the server is cleaned up and the port is removed\n // from listeningPorts. Forwarding would return a 500 (which resolves the fetch\n // instead of rejecting it), so we send an error response that the SW rejects.\n try {\n const fetchUrl = new URL(msg.url);\n const fetchPort = parseInt(fetchUrl.port) || (fetchUrl.protocol === \"https:\" ? 443 : 80);\n const isLocal = fetchUrl.hostname === \"localhost\" || fetchUrl.hostname === \"127.0.0.1\";\n if (isLocal && !listeningPorts.has(fetchPort)) {\n networkChannel.postMessage({\n type: \"fetch_response\",\n requestId: msg.requestId,\n status: 0,\n statusText: \"\",\n headers: [],\n body: null,\n error: `connect ECONNREFUSED 127.0.0.1:${fetchPort}`,\n });\n return;\n }\n } catch {\n // URL parsing failed - continue with normal forwarding\n }\n\n try {\n const response = await handleFetchFromSWViaBroker(\n msg,\n connection.writer,\n pending,\n nextId++,\n );\n networkChannel.postMessage(response);\n } catch (err) {\n networkChannel.postMessage({\n type: \"fetch_response\",\n requestId: msg.requestId,\n status: 500,\n statusText: \"Internal Server Error\",\n headers: [],\n body: new TextEncoder().encode(String(err)),\n });\n }\n } else if (msg.type === \"sw_ws_connect\") {\n // WebSocket connect from a served page (via SW)\n bootLog.debug(\"sw_ws_connect:\", msg.wsId, msg.url);\n servedPageWsClients.set(msg.wsId, msg.clientId);\n\n // Forward to worker to create the actual WebSocket connection\n send({\n type: \"ws_connect\",\n id: nextId++,\n wsId: msg.wsId,\n url: msg.url,\n protocols: msg.protocols,\n }).catch((err) => {\n bootLog.error(\"Error connecting WebSocket:\", err);\n networkChannel.postMessage({\n type: \"sw_ws_error\",\n wsId: msg.wsId,\n message: err instanceof Error ? err.message : String(err),\n });\n servedPageWsClients.delete(msg.wsId);\n });\n } else if (msg.type === \"sw_ws_send\") {\n // WebSocket send from a served page (via SW)\n bootLog.trace(\"sw_ws_send:\", msg.wsId);\n send({\n type: \"ws_send\",\n id: nextId++,\n wsId: msg.wsId,\n data: msg.data,\n }).catch((err) => {\n bootLog.error(\"Error sending WebSocket data:\", err);\n });\n } else if (msg.type === \"sw_ws_close\") {\n // WebSocket close from a served page (via SW)\n bootLog.debug(\"sw_ws_close:\", msg.wsId);\n send({\n type: \"ws_close\",\n id: nextId++,\n wsId: msg.wsId,\n code: msg.code,\n reason: msg.reason,\n }).catch((err) => {\n bootLog.error(\"Error closing WebSocket:\", err);\n });\n }\n };\n\n const send = (req: { type: string; id: number; [key: string]: unknown }): Promise<unknown> => {\n return new Promise((resolve, reject) => {\n pending.set(req.id, { resolve, reject });\n // Send via broker - it handles routing to leader's worker.\n // The `method` field is required by thumbdrive's MultiTabWorkerBroker\n // to trigger ID rewriting for cross-tab message routing. Without it,\n // follower responses are silently dropped because the broker can't\n // match them back to the originating tab.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n connection.writer.write({ ...req, method: req.type } as any).catch(reject);\n });\n };\n\n if (currentIsLeader) {\n // Leader path: configure the SW and initialize the runtime.\n // Only the leader sends config to avoid overwriting listeningPorts.\n configureServiceWorker(registration, routingConfig);\n\n // Wait for the worker to be ready\n await readyPromise;\n\n const binaries: Partial<Record<BinaryName, BinarySpec>> = {};\n for (const binaryName of getBinaryNames()) {\n const spec = config.binaries?.[binaryName];\n if (spec === true || spec === undefined) {\n binaries[binaryName] = {\n tarUrl: getDefaultTarballUrl(binaryName, config.binaryTarballBaseUrl),\n };\n } else if (spec) {\n binaries[binaryName] = spec;\n }\n }\n\n await send({\n type: \"init\",\n id: nextId++,\n kernel: config.kernelUrl ?? getKernelUrl(),\n cwd: config.cwd ?? \"/\",\n env: config.env ?? { NODE_ENV: \"development\" },\n config: {\n features: {\n net_listen: true,\n fs_watch: true,\n timers: true,\n proc_spawn: true,\n },\n storeName: config.persistence?.storeName,\n },\n logging: config.logging,\n debug: config.debug,\n binaries,\n wasmPackages: config.wasmPackages,\n });\n } else {\n // Follower path: worker is already running in the leader tab.\n // Cancel the readyPromise (the one-shot \"ready\" message was already sent\n // before this tab connected) and skip init (already done by leader).\n // Do NOT configure the SW — the leader already did, and a fresh config\n // would wipe out the listeningPorts set by port_listen events.\n readyPromise.catch(() => {});\n readyResolve = null;\n bootLog.debug(\"Follower tab connected to existing runtime\");\n\n // Sync listening ports from the worker. If the leader started servers\n // before this tab booted, we missed the port_listen broadcasts.\n // Query the worker for the current port list so that local state\n // (listeningPorts Set, routingConfig.listeningPorts, patched WebSocket)\n // reflects reality.\n try {\n const result = (await send({\n type: \"http_listen\",\n id: nextId++,\n })) as { ports: number[] } | undefined;\n\n if (result?.ports) {\n for (const port of result.ports) {\n listeningPorts.add(port);\n if (!routingConfig.listeningPorts.includes(port)) {\n routingConfig.listeningPorts.push(port);\n }\n }\n bootLog.debug(\"Synced listening ports from leader:\", result.ports);\n }\n } catch {\n // Non-fatal: ports will sync when future port_listen events arrive\n bootLog.debug(\"Could not sync listening ports from leader\");\n }\n }\n\n // Helper to serialize file tree\n const serializeTree = (tree: FileSystemTree): unknown => {\n const result: Record<string, unknown> = {};\n for (const [name, node] of Object.entries(tree)) {\n if (\"file\" in node) {\n const contents = node.file.contents;\n result[name] = {\n file: {\n contents: typeof contents === \"string\" ? contents : Array.from(contents),\n },\n };\n } else if (\"directory\" in node) {\n result[name] = {\n directory: serializeTree(node.directory),\n };\n }\n }\n return result;\n };\n\n // Create client interface\n const client: SubstrateClient = {\n get isLeader() {\n return broker.isLeader;\n },\n\n async mount(tree: FileSystemTree, mountPoint = \"/\"): Promise<void> {\n await send({\n type: \"syscall\",\n id: nextId++,\n op: \"mount\",\n args: { tree: serializeTree(tree), mountPoint },\n });\n },\n\n async readFile(path: string): Promise<string> {\n const response = (await send({\n type: \"syscall\",\n id: nextId++,\n op: \"fs_read_file\",\n args: { path },\n })) as { content: string };\n return response.content;\n },\n\n async writeFile(path: string, content: string): Promise<void> {\n await send({\n type: \"syscall\",\n id: nextId++,\n op: \"fs_write_file\",\n args: { path, content },\n });\n },\n\n spawn(command: string, args: string[] = [], options: SpawnOptions = {}): SubstrateProcess {\n let stdoutController: ReadableStreamDefaultController<string>;\n let stderrController: ReadableStreamDefaultController<string>;\n let stdoutClosed = false;\n let stderrClosed = false;\n\n const stdoutStream = new ReadableStream<string>({\n start(controller) {\n stdoutController = controller;\n },\n });\n const stderrStream = new ReadableStream<string>({\n start(controller) {\n stderrController = controller;\n },\n });\n\n const closeStdout = () => {\n if (!stdoutClosed) {\n stdoutClosed = true;\n try {\n stdoutController.close();\n } catch {\n /* ignore */\n }\n }\n };\n const closeStderr = () => {\n if (!stderrClosed) {\n stderrClosed = true;\n try {\n stderrController.close();\n } catch {\n /* ignore */\n }\n }\n };\n\n const { promise: exit, resolve: resolveExit } = Promise.withResolvers<number>();\n const { promise: pidPromise, resolve: resolvePid } = Promise.withResolvers<number>();\n let exitResolved = false;\n let pid: number | undefined;\n\n send({\n type: \"syscall\",\n id: nextId++,\n op: \"spawn\",\n args: { command, args, options: { cwd: options.cwd, env: options.env } },\n })\n .then((result) => {\n const r = result as { pid: number };\n pid = r.pid;\n resolvePid(pid);\n\n processOutputControllers.set(pid, {\n stdout: stdoutController!,\n stderr: stderrController!,\n });\n\n // Flush pending\n const p = pendingOutput.get(pid);\n if (p) {\n for (const d of p.stdout) stdoutController!.enqueue(d);\n for (const d of p.stderr) stderrController!.enqueue(d);\n pendingOutput.delete(pid);\n }\n\n // Register exit handler\n const pendingExit = pendingExits.get(pid);\n if (pendingExit !== undefined) {\n pendingExits.delete(pid);\n closeStdout();\n closeStderr();\n if (!exitResolved) {\n exitResolved = true;\n resolveExit(pendingExit);\n }\n } else {\n processExitResolvers.set(pid, (code) => {\n closeStdout();\n closeStderr();\n if (!exitResolved) {\n exitResolved = true;\n resolveExit(code);\n }\n });\n }\n })\n .catch((err) => {\n closeStdout();\n closeStderr();\n if (!exitResolved) {\n exitResolved = true;\n resolveExit(1);\n }\n resolvePid(-1);\n bootLog.error(\"Spawn failed:\", err);\n });\n\n return {\n pid: pidPromise,\n stdout: stdoutStream,\n stderr: stderrStream,\n exit,\n kill: () => {\n if (pid !== undefined) {\n void send({\n type: \"syscall\",\n id: nextId++,\n op: \"proc_kill\",\n args: { pid, signal: \"SIGTERM\" },\n });\n }\n },\n };\n },\n\n waitForPort(port: number, timeout = 30000): Promise<void> {\n if (listeningPorts.has(port)) {\n return Promise.resolve();\n }\n\n return new Promise((resolve, reject) => {\n const timer = setTimeout(\n () => reject(new Error(`Timeout waiting for port ${port}`)),\n timeout,\n );\n\n if (!portListeners.has(port)) {\n portListeners.set(port, []);\n }\n portListeners.get(port)!.push(() => {\n clearTimeout(timer);\n resolve();\n });\n });\n },\n\n isListening(port: number): boolean {\n return listeningPorts.has(port);\n },\n\n getListeningPorts(): number[] {\n return Array.from(listeningPorts);\n },\n\n async persist(): Promise<void> {\n await send({ type: \"flush\", id: nextId++ });\n },\n\n async mountStore(storeName: string): Promise<void> {\n await send({ type: \"mount_store\", id: nextId++, storeName });\n },\n\n async listStores(): Promise<string[]> {\n const result = (await send({ type: \"list_stores\", id: nextId++ })) as { stores: string[] };\n return result.stores;\n },\n\n async deleteStore(storeName: string): Promise<void> {\n await send({ type: \"delete_store\", id: nextId++, storeName });\n },\n\n async terminate(): Promise<void> {\n networkChannel.close();\n await send({ type: \"shutdown\", id: nextId++ }).catch(() => {});\n void broker.stop();\n },\n\n async listProcesses(options?: { includeExited?: boolean }): Promise<ProcessInfo[]> {\n const result = (await send({\n type: \"syscall\",\n id: nextId++,\n op: \"proc_list\",\n args: { include_exited: options?.includeExited ?? false },\n })) as { processes: ProcessInfo[] };\n return result.processes;\n },\n\n on(event: \"leadership\", callback: (isLeader: boolean) => void): void {\n if (event === \"leadership\") {\n leadershipListeners.push(callback);\n }\n },\n\n // WebSocket constructor that routes through the worker\n WebSocket: Object.assign(\n function (\n this: ProxyWebSocket | void,\n url: string | URL,\n protocols?: string | string[],\n ): ProxyWebSocket {\n const wsId = nextWsId++;\n const ws = new ProxyWebSocket(url, protocols, wsId, send, () => nextId++);\n activeWebSockets.set(wsId, ws);\n return ws;\n } as unknown as SubstrateClient[\"WebSocket\"],\n {\n CONNECTING: WS_CONNECTING as 0,\n OPEN: WS_OPEN as 1,\n CLOSING: WS_CLOSING as 2,\n CLOSED: WS_CLOSED as 3,\n },\n ),\n };\n\n return client;\n}\n\n// =============================================================================\n// SW Fetch Handler\n// =============================================================================\n\n/**\n * Handle a fetch request forwarded from the Service Worker.\n * Uses the broker to send the request to the worker (via leader tab if not leader).\n */\nasync function handleFetchFromSWViaBroker(\n msg: {\n requestId: string;\n url: string;\n method: string;\n headers: [string, string][];\n body: Uint8Array | null;\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n writer: { write: (msg: any) => Promise<void> },\n pending: Map<number, { resolve: (value: unknown) => void; reject: (error: Error) => void }>,\n id: number,\n): Promise<{\n type: \"fetch_response\";\n requestId: string;\n status: number;\n statusText: string;\n headers: [string, string][];\n body: Uint8Array | null;\n}> {\n // Forward to worker's http_fetch handler via broker\n const result = await new Promise<{\n status: number;\n headers: [string, string][];\n body: Uint8Array;\n }>((resolve, reject) => {\n pending.set(id, { resolve: resolve as (v: unknown) => void, reject });\n writer\n .write({\n type: \"http_fetch\",\n id,\n url: msg.url,\n method: msg.method,\n headers: msg.headers,\n body: msg.body,\n })\n .catch(reject);\n });\n\n return {\n type: \"fetch_response\",\n requestId: msg.requestId,\n status: result.status,\n statusText: result.status === 200 ? \"OK\" : \"Error\",\n headers: result.headers,\n body: result.body,\n };\n}\n\n// =============================================================================\n// Re-export types\n// =============================================================================\n\nexport type { RoutingConfig };\n"],"x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16],"mappings":"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"}