@openclaw/crabline 0.1.11 → 0.1.12

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 (197) hide show
  1. package/README.md +99 -12
  2. package/dist/src/bin/crabline.js +3 -1
  3. package/dist/src/bin/crabline.js.map +1 -1
  4. package/dist/src/cli/program.d.ts +5 -1
  5. package/dist/src/cli/program.js +264 -50
  6. package/dist/src/cli/program.js.map +1 -1
  7. package/dist/src/config/load.js +39 -3
  8. package/dist/src/config/load.js.map +1 -1
  9. package/dist/src/config/schema.d.ts +20 -0
  10. package/dist/src/config/schema.js +163 -35
  11. package/dist/src/config/schema.js.map +1 -1
  12. package/dist/src/core/errors.d.ts +1 -0
  13. package/dist/src/core/errors.js +6 -3
  14. package/dist/src/core/errors.js.map +1 -1
  15. package/dist/src/core/http-path.d.ts +1 -0
  16. package/dist/src/core/http-path.js +14 -0
  17. package/dist/src/core/http-path.js.map +1 -0
  18. package/dist/src/core/matcher.d.ts +3 -1
  19. package/dist/src/core/matcher.js +58 -2
  20. package/dist/src/core/matcher.js.map +1 -1
  21. package/dist/src/core/nonces.d.ts +2 -0
  22. package/dist/src/core/nonces.js +11 -1
  23. package/dist/src/core/nonces.js.map +1 -1
  24. package/dist/src/core/reporters.d.ts +5 -0
  25. package/dist/src/core/reporters.js +26 -2
  26. package/dist/src/core/reporters.js.map +1 -1
  27. package/dist/src/core/run.d.ts +3 -1
  28. package/dist/src/core/run.js +178 -66
  29. package/dist/src/core/run.js.map +1 -1
  30. package/dist/src/matrix-ids.d.ts +5 -0
  31. package/dist/src/matrix-ids.js +83 -0
  32. package/dist/src/matrix-ids.js.map +1 -0
  33. package/dist/src/openclaw/artifact-generation.d.ts +7 -2
  34. package/dist/src/openclaw/artifact-generation.js +399 -27
  35. package/dist/src/openclaw/artifact-generation.js.map +1 -1
  36. package/dist/src/openclaw/bridges/matrix.js +21 -4
  37. package/dist/src/openclaw/bridges/matrix.js.map +1 -1
  38. package/dist/src/openclaw/bridges/mattermost.js +13 -8
  39. package/dist/src/openclaw/bridges/mattermost.js.map +1 -1
  40. package/dist/src/openclaw/bridges/probe-response.d.ts +1 -0
  41. package/dist/src/openclaw/bridges/probe-response.js +5 -0
  42. package/dist/src/openclaw/bridges/probe-response.js.map +1 -0
  43. package/dist/src/openclaw/bridges/signal.js +15 -6
  44. package/dist/src/openclaw/bridges/signal.js.map +1 -1
  45. package/dist/src/openclaw/bridges/slack.js +116 -23
  46. package/dist/src/openclaw/bridges/slack.js.map +1 -1
  47. package/dist/src/openclaw/bridges/telegram.js +45 -19
  48. package/dist/src/openclaw/bridges/telegram.js.map +1 -1
  49. package/dist/src/openclaw/bridges/whatsapp.js +32 -16
  50. package/dist/src/openclaw/bridges/whatsapp.js.map +1 -1
  51. package/dist/src/openclaw/bridges/zalo.js +8 -3
  52. package/dist/src/openclaw/bridges/zalo.js.map +1 -1
  53. package/dist/src/openclaw/private-file.d.ts +38 -3
  54. package/dist/src/openclaw/private-file.js +2008 -87
  55. package/dist/src/openclaw/private-file.js.map +1 -1
  56. package/dist/src/openclaw/shared.d.ts +1 -0
  57. package/dist/src/openclaw/shared.js +48 -13
  58. package/dist/src/openclaw/shared.js.map +1 -1
  59. package/dist/src/openclaw/smoke-lock.d.ts +9 -0
  60. package/dist/src/openclaw/smoke-lock.js +626 -172
  61. package/dist/src/openclaw/smoke-lock.js.map +1 -1
  62. package/dist/src/openclaw.js +225 -42
  63. package/dist/src/openclaw.js.map +1 -1
  64. package/dist/src/platform/process-owned-lock.d.ts +11 -0
  65. package/dist/src/platform/process-owned-lock.js +1698 -0
  66. package/dist/src/platform/process-owned-lock.js.map +1 -0
  67. package/dist/src/platform/recorder-directory.d.ts +1 -0
  68. package/dist/src/platform/recorder-directory.js +14 -0
  69. package/dist/src/platform/recorder-directory.js.map +1 -0
  70. package/dist/src/platform/windows-acl.d.ts +18 -0
  71. package/dist/src/platform/windows-acl.js +1367 -0
  72. package/dist/src/platform/windows-acl.js.map +1 -0
  73. package/dist/src/platform/windows-lock-root.d.ts +13 -0
  74. package/dist/src/platform/windows-lock-root.js +98 -0
  75. package/dist/src/platform/windows-lock-root.js.map +1 -0
  76. package/dist/src/providers/builtin/discord.d.ts +4 -0
  77. package/dist/src/providers/builtin/discord.js +52 -9
  78. package/dist/src/providers/builtin/discord.js.map +1 -1
  79. package/dist/src/providers/builtin/external-webhook-auth.d.ts +1 -0
  80. package/dist/src/providers/builtin/external-webhook-auth.js +38 -1
  81. package/dist/src/providers/builtin/external-webhook-auth.js.map +1 -1
  82. package/dist/src/providers/builtin/feishu.d.ts +1 -0
  83. package/dist/src/providers/builtin/feishu.js +96 -26
  84. package/dist/src/providers/builtin/feishu.js.map +1 -1
  85. package/dist/src/providers/builtin/googlechat.d.ts +1 -0
  86. package/dist/src/providers/builtin/googlechat.js +95 -26
  87. package/dist/src/providers/builtin/googlechat.js.map +1 -1
  88. package/dist/src/providers/builtin/imessage.js +60 -17
  89. package/dist/src/providers/builtin/imessage.js.map +1 -1
  90. package/dist/src/providers/builtin/loopback.js +88 -35
  91. package/dist/src/providers/builtin/loopback.js.map +1 -1
  92. package/dist/src/providers/builtin/matrix.d.ts +2 -2
  93. package/dist/src/providers/builtin/matrix.js +78 -21
  94. package/dist/src/providers/builtin/matrix.js.map +1 -1
  95. package/dist/src/providers/builtin/mattermost.d.ts +11 -7
  96. package/dist/src/providers/builtin/mattermost.js +138 -24
  97. package/dist/src/providers/builtin/mattermost.js.map +1 -1
  98. package/dist/src/providers/builtin/msteams.d.ts +1 -0
  99. package/dist/src/providers/builtin/msteams.js +118 -38
  100. package/dist/src/providers/builtin/msteams.js.map +1 -1
  101. package/dist/src/providers/builtin/native-local-mock.js +4 -4
  102. package/dist/src/providers/builtin/native-local-mock.js.map +1 -1
  103. package/dist/src/providers/builtin/script.js +1057 -146
  104. package/dist/src/providers/builtin/script.js.map +1 -1
  105. package/dist/src/providers/builtin/slack.d.ts +8 -1
  106. package/dist/src/providers/builtin/slack.js +327 -24
  107. package/dist/src/providers/builtin/slack.js.map +1 -1
  108. package/dist/src/providers/builtin/telegram.d.ts +1 -1
  109. package/dist/src/providers/builtin/telegram.js +55 -14
  110. package/dist/src/providers/builtin/telegram.js.map +1 -1
  111. package/dist/src/providers/builtin/whatsapp.d.ts +4 -3
  112. package/dist/src/providers/builtin/whatsapp.js +157 -29
  113. package/dist/src/providers/builtin/whatsapp.js.map +1 -1
  114. package/dist/src/providers/builtin/zalo.d.ts +5 -2
  115. package/dist/src/providers/builtin/zalo.js +31 -7
  116. package/dist/src/providers/builtin/zalo.js.map +1 -1
  117. package/dist/src/providers/catalog.d.ts +1 -1
  118. package/dist/src/providers/catalog.js +1 -1
  119. package/dist/src/providers/catalog.js.map +1 -1
  120. package/dist/src/providers/local-mock.d.ts +4 -0
  121. package/dist/src/providers/local-mock.js +162 -35
  122. package/dist/src/providers/local-mock.js.map +1 -1
  123. package/dist/src/providers/native-ids.d.ts +2 -0
  124. package/dist/src/providers/native-ids.js +3 -0
  125. package/dist/src/providers/native-ids.js.map +1 -1
  126. package/dist/src/providers/recorder.d.ts +14 -3
  127. package/dist/src/providers/recorder.js +521 -41
  128. package/dist/src/providers/recorder.js.map +1 -1
  129. package/dist/src/providers/registry.d.ts +1 -0
  130. package/dist/src/providers/registry.js +65 -20
  131. package/dist/src/providers/registry.js.map +1 -1
  132. package/dist/src/providers/signed-jwt.d.ts +6 -1
  133. package/dist/src/providers/signed-jwt.js +241 -50
  134. package/dist/src/providers/signed-jwt.js.map +1 -1
  135. package/dist/src/providers/slack-ids.d.ts +1 -0
  136. package/dist/src/providers/slack-ids.js +5 -0
  137. package/dist/src/providers/slack-ids.js.map +1 -1
  138. package/dist/src/providers/target-normalizers.d.ts +9 -1
  139. package/dist/src/providers/target-normalizers.js +177 -58
  140. package/dist/src/providers/target-normalizers.js.map +1 -1
  141. package/dist/src/providers/webhook-server.d.ts +3 -0
  142. package/dist/src/providers/webhook-server.js +268 -47
  143. package/dist/src/providers/webhook-server.js.map +1 -1
  144. package/dist/src/servers/http.d.ts +14 -2
  145. package/dist/src/servers/http.js +229 -58
  146. package/dist/src/servers/http.js.map +1 -1
  147. package/dist/src/servers/matrix.d.ts +3 -0
  148. package/dist/src/servers/matrix.js +268 -110
  149. package/dist/src/servers/matrix.js.map +1 -1
  150. package/dist/src/servers/mattermost.d.ts +5 -0
  151. package/dist/src/servers/mattermost.js +389 -91
  152. package/dist/src/servers/mattermost.js.map +1 -1
  153. package/dist/src/servers/recorder.d.ts +11 -0
  154. package/dist/src/servers/recorder.js +1072 -69
  155. package/dist/src/servers/recorder.js.map +1 -1
  156. package/dist/src/servers/signal.d.ts +1 -0
  157. package/dist/src/servers/signal.js +279 -44
  158. package/dist/src/servers/signal.js.map +1 -1
  159. package/dist/src/servers/slack.d.ts +15 -0
  160. package/dist/src/servers/slack.js +259 -51
  161. package/dist/src/servers/slack.js.map +1 -1
  162. package/dist/src/servers/telegram-identity.d.ts +6 -0
  163. package/dist/src/servers/telegram-identity.js +27 -0
  164. package/dist/src/servers/telegram-identity.js.map +1 -0
  165. package/dist/src/servers/telegram.d.ts +17 -6
  166. package/dist/src/servers/telegram.js +1169 -107
  167. package/dist/src/servers/telegram.js.map +1 -1
  168. package/dist/src/servers/webhook-target.d.ts +12 -4
  169. package/dist/src/servers/webhook-target.js +226 -28
  170. package/dist/src/servers/webhook-target.js.map +1 -1
  171. package/dist/src/servers/whatsapp-baileys-websocket.d.ts +60 -1
  172. package/dist/src/servers/whatsapp-baileys-websocket.js +782 -112
  173. package/dist/src/servers/whatsapp-baileys-websocket.js.map +1 -1
  174. package/dist/src/servers/whatsapp-jid.d.ts +1 -0
  175. package/dist/src/servers/whatsapp-jid.js +9 -5
  176. package/dist/src/servers/whatsapp-jid.js.map +1 -1
  177. package/dist/src/servers/whatsapp-wire/binary-node.d.ts +1 -0
  178. package/dist/src/servers/whatsapp-wire/binary-node.js +37 -13
  179. package/dist/src/servers/whatsapp-wire/binary-node.js.map +1 -1
  180. package/dist/src/servers/whatsapp-wire/crypto.d.ts +3 -0
  181. package/dist/src/servers/whatsapp-wire/crypto.js +23 -8
  182. package/dist/src/servers/whatsapp-wire/crypto.js.map +1 -1
  183. package/dist/src/servers/whatsapp-wire/handshake.d.ts +9 -3
  184. package/dist/src/servers/whatsapp-wire/handshake.js +173 -12
  185. package/dist/src/servers/whatsapp-wire/handshake.js.map +1 -1
  186. package/dist/src/servers/whatsapp-wire/signal.js +3 -3
  187. package/dist/src/servers/whatsapp-wire/signal.js.map +1 -1
  188. package/dist/src/servers/whatsapp.d.ts +7 -0
  189. package/dist/src/servers/whatsapp.js +149 -24
  190. package/dist/src/servers/whatsapp.js.map +1 -1
  191. package/dist/src/servers/zalo.d.ts +1 -0
  192. package/dist/src/servers/zalo.js +193 -82
  193. package/dist/src/servers/zalo.js.map +1 -1
  194. package/docs/channel-setup.md +185 -43
  195. package/fixtures/examples/crabline.example.yaml +3 -2
  196. package/package.json +18 -10
  197. package/fixtures/examples/openclaw-bridge.yaml +0 -125
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/providers/registry.ts"],"names":[],"mappings":"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","sourcesContent":["import { CrablineError } from \"../core/errors.js\";\nimport type { BuiltinAdapterId, ManifestDefinition, ProviderConfig } from \"../config/schema.js\";\nimport { ScriptProviderAdapter } from \"./builtin/script.js\";\nimport { OPENCLAW_SUPPORT_CATALOG } from \"./catalog.js\";\nimport type {\n InboundEnvelope,\n ProbeResult,\n ProviderAdapter,\n ProviderContext,\n ProviderSupportStatus,\n SendContext,\n SendResult,\n WaitContext,\n WatchContext,\n} from \"./types.js\";\nimport { getBuiltinTargetCodec, type BuiltinProviderAdapterId } from \"./target-normalizers.js\";\n\nexport type Registry = {\n catalog: typeof OPENCLAW_SUPPORT_CATALOG;\n resolve(providerId: string, fixtureId: string): ProviderAdapter;\n};\n\ntype LazyAdapterId = BuiltinProviderAdapterId;\ntype ProviderFactory = () => Promise<ProviderAdapter>;\ntype ActiveWatch = {\n abort(): void;\n close(): Promise<void>;\n dispatch: DispatchBarrier;\n};\ntype DispatchBarrier = {\n promise: Promise<void>;\n reach(): void;\n reached: boolean;\n};\ntype AdmittedOperation = {\n completion: Promise<unknown>;\n dispatch: DispatchBarrier;\n};\ntype LazyProviderFactory = (params: {\n config: ProviderConfig;\n providerId: string;\n userName: string;\n}) => Promise<ProviderAdapter>;\n\nconst LAZY_PROVIDER_FACTORIES = {\n async discord({ config, providerId, userName }) {\n const { DiscordProviderAdapter } = await import(\"./builtin/discord.js\");\n return new DiscordProviderAdapter(providerId, config, userName);\n },\n async feishu({ config, providerId, userName }) {\n const { FeishuProviderAdapter } = await import(\"./builtin/feishu.js\");\n return new FeishuProviderAdapter(providerId, config, userName);\n },\n async googlechat({ config, providerId, userName }) {\n const { GoogleChatProviderAdapter } = await import(\"./builtin/googlechat.js\");\n return new GoogleChatProviderAdapter(providerId, config, userName);\n },\n async imessage({ config, providerId, userName }) {\n const { IMessageProviderAdapter } = await import(\"./builtin/imessage.js\");\n return new IMessageProviderAdapter(providerId, config, userName);\n },\n async loopback({ config, providerId, userName }) {\n const { LoopbackProviderAdapter } = await import(\"./builtin/loopback.js\");\n return new LoopbackProviderAdapter(providerId, config, userName);\n },\n async matrix({ config, providerId, userName }) {\n const { MatrixProviderAdapter } = await import(\"./builtin/matrix.js\");\n return new MatrixProviderAdapter(providerId, config, userName);\n },\n async mattermost({ config, providerId, userName }) {\n const { MattermostProviderAdapter } = await import(\"./builtin/mattermost.js\");\n return new MattermostProviderAdapter(providerId, config, userName);\n },\n async msteams({ config, providerId, userName }) {\n const { MsTeamsProviderAdapter } = await import(\"./builtin/msteams.js\");\n return new MsTeamsProviderAdapter(providerId, config, userName);\n },\n async slack({ config, providerId, userName }) {\n const { SlackProviderAdapter } = await import(\"./builtin/slack.js\");\n return new SlackProviderAdapter(providerId, config, userName);\n },\n async telegram({ config, providerId, userName }) {\n const { TelegramProviderAdapter } = await import(\"./builtin/telegram.js\");\n return new TelegramProviderAdapter(providerId, config, userName);\n },\n async whatsapp({ config, providerId, userName }) {\n const { WhatsAppProviderAdapter } = await import(\"./builtin/whatsapp.js\");\n return new WhatsAppProviderAdapter(providerId, config, userName);\n },\n async zalo({ config, providerId, userName }) {\n const { ZaloProviderAdapter } = await import(\"./builtin/zalo.js\");\n return new ZaloProviderAdapter(providerId, config, userName);\n },\n} satisfies Record<LazyAdapterId, LazyProviderFactory>;\n\nfunction createDispatchBarrier(): DispatchBarrier {\n let resolveDispatch: (() => void) | undefined;\n const dispatch: DispatchBarrier = {\n promise: new Promise<void>((resolve) => {\n resolveDispatch = resolve;\n }),\n reach() {\n if (dispatch.reached) {\n return;\n }\n dispatch.reached = true;\n resolveDispatch?.();\n },\n reached: false,\n };\n return dispatch;\n}\n\nfunction isLazyAdapter(adapter: BuiltinAdapterId): adapter is LazyAdapterId {\n return adapter in LAZY_PROVIDER_FACTORIES;\n}\n\nfunction createLazyProvider(params: {\n adapter: LazyAdapterId;\n config: ProviderConfig;\n providerId: string;\n userName: string;\n}): ProviderAdapter {\n return new LazyProviderAdapter({\n adapterName: params.adapter,\n factory: () => LAZY_PROVIDER_FACTORIES[params.adapter](params),\n id: params.providerId,\n normalizeTarget: getBuiltinTargetCodec(params.adapter).normalize,\n platform: params.config.platform,\n status: \"ready\",\n supports: params.config.capabilities,\n });\n}\n\nexport class LazyProviderAdapter implements ProviderAdapter {\n readonly id;\n readonly platform;\n readonly status;\n readonly supports;\n\n readonly #factory: ProviderFactory;\n readonly #normalizeTarget: ProviderAdapter[\"normalizeTarget\"];\n readonly #activeWatches = new Set<ActiveWatch>();\n readonly #inFlightOperations = new Set<AdmittedOperation>();\n #cleanedUp = false;\n #cleanupPromise: Promise<void> | null = null;\n #providerInstance: ProviderAdapter | null = null;\n #providerPromise: Promise<ProviderAdapter> | null = null;\n\n constructor(params: {\n adapterName: string;\n factory: ProviderFactory;\n id: string;\n normalizeTarget: ProviderAdapter[\"normalizeTarget\"];\n platform: ProviderAdapter[\"platform\"];\n status: ProviderSupportStatus;\n supports: ProviderAdapter[\"supports\"];\n }) {\n this.#factory = params.factory;\n this.#normalizeTarget = params.normalizeTarget;\n this.id = params.id;\n this.platform = params.platform;\n this.status = params.status;\n this.supports = params.supports;\n }\n\n normalizeTarget(target: ProviderContext[\"fixture\"][\"target\"]) {\n this.#assertActive();\n return this.#normalizeTarget(target);\n }\n\n probe(context: ProviderContext): Promise<ProbeResult> {\n return this.#runOperation((provider) => provider.probe(context), context.signal);\n }\n\n send(context: SendContext): Promise<SendResult> {\n return this.#runOperation((provider) => provider.send(context), context.signal);\n }\n\n waitForInbound(context: WaitContext): Promise<InboundEnvelope | null> {\n return this.#runOperation((provider) => provider.waitForInbound(context), context.signal);\n }\n\n watch(context: WatchContext): AsyncIterable<InboundEnvelope> {\n if (this.#cleanedUp) {\n const error = this.#cleanedUpError();\n return {\n [Symbol.asyncIterator](): AsyncIterator<InboundEnvelope> {\n return {\n next: () => Promise.reject(error),\n };\n },\n };\n }\n const controller = new AbortController();\n const abortFromContext = () => controller.abort(context.signal?.reason);\n if (context.signal?.aborted) {\n abortFromContext();\n } else {\n context.signal?.addEventListener(\"abort\", abortFromContext, { once: true });\n }\n const dispatch = createDispatchBarrier();\n const source = this.#watch(context, controller.signal, dispatch)[Symbol.asyncIterator]();\n let activeWatch: ActiveWatch;\n let closed = false;\n let closePromise: Promise<IteratorResult<InboundEnvelope>> | null = null;\n const finish = () => {\n if (closed) {\n return;\n }\n closed = true;\n context.signal?.removeEventListener(\"abort\", abortFromContext);\n this.#activeWatches.delete(activeWatch);\n };\n const close = () => {\n if (closed) {\n return Promise.resolve({ done: true as const, value: undefined as never });\n }\n closePromise ??= (async () => {\n controller.abort();\n try {\n const result = source.return\n ? await source.return()\n : { done: true as const, value: undefined as never };\n if (result.done) {\n finish();\n }\n return result;\n } catch (error) {\n finish();\n throw error;\n } finally {\n dispatch.reach();\n }\n })();\n const closing = closePromise;\n void closing.then(\n () => {\n if (closePromise === closing) {\n closePromise = null;\n }\n },\n () => {\n if (closePromise === closing) {\n closePromise = null;\n }\n },\n );\n return closing;\n };\n const iterator: AsyncIterableIterator<InboundEnvelope> = {\n async next() {\n try {\n const result = await source.next();\n if (result.done) {\n finish();\n }\n return result;\n } catch (error) {\n finish();\n throw error;\n }\n },\n return: close,\n async throw(error?: unknown) {\n controller.abort();\n try {\n if (source.throw) {\n return await source.throw(error);\n }\n throw error;\n } finally {\n finish();\n }\n },\n [Symbol.asyncIterator]() {\n return this;\n },\n };\n activeWatch = {\n abort: () => controller.abort(),\n close: async () => {\n while (!(await close()).done) {\n // Async iterators may yield final values before acknowledging return.\n }\n },\n dispatch,\n };\n this.#activeWatches.add(activeWatch);\n return iterator;\n }\n\n async cleanup(): Promise<void> {\n this.#cleanedUp = true;\n for (const watch of this.#activeWatches) {\n watch.abort();\n }\n this.#cleanupPromise ??= (async () => {\n const operations = [...this.#inFlightOperations];\n const watches = [...this.#activeWatches];\n const closingWatches = watches.map(async (watch) => await watch.close());\n const providerCleanup = this.#cleanupProvider(\n operations\n .map((operation) => operation.dispatch)\n .concat(watches.map((watch) => watch.dispatch)),\n );\n const [cleanupResult, , watchResults] = await Promise.all([\n providerCleanup.then(\n () => ({ ok: true as const }),\n (error: unknown) => ({ error, ok: false as const }),\n ),\n Promise.allSettled(operations.map((operation) => operation.completion)),\n Promise.allSettled(closingWatches),\n ]);\n const teardownErrors = watchResults.flatMap((result) =>\n result.status === \"rejected\" ? [result.reason] : [],\n );\n if (!cleanupResult.ok) {\n teardownErrors.unshift(cleanupResult.error);\n }\n if (teardownErrors.length === 1) {\n throw teardownErrors[0];\n }\n if (teardownErrors.length > 1) {\n throw new AggregateError(teardownErrors, \"Provider cleanup failed.\");\n }\n })();\n await this.#cleanupPromise;\n }\n\n async #provider(): Promise<ProviderAdapter> {\n this.#assertActive();\n this.#providerPromise ??= this.#factory()\n .then((provider) => {\n this.#providerInstance = provider;\n return provider;\n })\n .catch((error: unknown) => {\n this.#providerPromise = null;\n throw error;\n });\n return await this.#providerPromise;\n }\n\n async *#watch(\n context: WatchContext,\n signal: AbortSignal,\n dispatch: DispatchBarrier,\n ): AsyncIterable<InboundEnvelope> {\n try {\n if (signal.aborted) {\n return;\n }\n const provider = await this.#provider();\n if (signal.aborted) {\n return;\n }\n if (!provider.watch) {\n throw new CrablineError(`Provider \"${this.id}\" does not implement watch.`, {\n kind: \"config\",\n });\n }\n dispatch.reach();\n yield* provider.watch({ ...context, signal });\n } finally {\n dispatch.reach();\n }\n }\n\n #assertActive(): void {\n if (this.#cleanedUp) {\n throw this.#cleanedUpError();\n }\n }\n\n async #cleanupProvider(dispatches: readonly DispatchBarrier[]): Promise<void> {\n const pendingDispatches = dispatches\n .filter((dispatch) => !dispatch.reached)\n .map((dispatch) => dispatch.promise);\n if (pendingDispatches.length > 0) {\n await Promise.allSettled(pendingDispatches);\n }\n let provider = this.#providerInstance;\n if (!provider) {\n const providerPromise = this.#providerPromise;\n if (!providerPromise) {\n return;\n }\n provider = await providerPromise;\n }\n if (!provider) {\n return;\n }\n const errors: unknown[] = [];\n try {\n provider.beginCleanup?.();\n } catch (error) {\n errors.push(error);\n }\n try {\n await provider.cleanup?.();\n } catch (error) {\n errors.push(error);\n }\n if (errors.length === 1) {\n throw errors[0];\n }\n if (errors.length > 1) {\n throw new AggregateError(errors, \"Provider teardown failed.\");\n }\n }\n\n #runOperation<T>(\n run: (provider: ProviderAdapter) => Promise<T>,\n signal?: AbortSignal,\n ): Promise<T> {\n if (this.#cleanedUp) {\n return Promise.reject(this.#cleanedUpError());\n }\n if (signal?.aborted) {\n return Promise.reject(signal.reason ?? new Error(\"Provider operation aborted.\"));\n }\n const dispatch = createDispatchBarrier();\n const underlying = (async () => {\n try {\n const provider = await this.#provider();\n if (signal?.aborted) {\n throw signal.reason ?? new Error(\"Provider operation aborted.\");\n }\n const result = run(provider);\n dispatch.reach();\n return await result;\n } catch (error) {\n dispatch.reach();\n throw error;\n }\n })();\n const operation = { completion: underlying, dispatch };\n this.#inFlightOperations.add(operation);\n void underlying.then(\n () => this.#inFlightOperations.delete(operation),\n () => this.#inFlightOperations.delete(operation),\n );\n return underlying;\n }\n\n #cleanedUpError(): CrablineError {\n return new CrablineError(`Provider \"${this.id}\" has been cleaned up.`, { kind: \"config\" });\n }\n}\n\nexport function createRegistry(manifest: ManifestDefinition, manifestPath: string): Registry {\n return {\n catalog: OPENCLAW_SUPPORT_CATALOG,\n resolve(providerId, fixtureId) {\n const fixture = manifest.fixtures.find((entry) => entry.id === fixtureId);\n if (!fixture) {\n throw new CrablineError(`Unknown fixture: ${fixtureId}`, { kind: \"config\" });\n }\n const config = manifest.providers[providerId];\n if (!config) {\n throw new CrablineError(`Unknown provider: ${providerId}`, { kind: \"config\" });\n }\n if (fixture.provider !== providerId) {\n throw new CrablineError(\n `Fixture \"${fixtureId}\" belongs to provider \"${fixture.provider}\", not \"${providerId}\".`,\n { kind: \"config\" },\n );\n }\n\n if (config.status === \"disabled\") {\n throw new CrablineError(`Provider \"${providerId}\" is disabled.`, { kind: \"config\" });\n }\n if (config.status === \"planned\") {\n throw new CrablineError(`Provider \"${providerId}\" is planned and cannot run.`, {\n kind: \"config\",\n });\n }\n\n const context: ProviderContext = {\n config,\n fixture,\n manifestPath,\n providerId,\n userName: manifest.userName,\n };\n\n if (isLazyAdapter(config.adapter)) {\n return createLazyProvider({\n adapter: config.adapter,\n config,\n providerId,\n userName: manifest.userName,\n });\n }\n\n return new ScriptProviderAdapter(context);\n },\n };\n}\n"]}
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/providers/registry.ts"],"names":[],"mappings":"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","sourcesContent":["import { CrablineError } from \"../core/errors.js\";\nimport type { BuiltinAdapterId, ManifestDefinition, ProviderConfig } from \"../config/schema.js\";\nimport { ScriptProviderAdapter } from \"./builtin/script.js\";\nimport { OPENCLAW_SUPPORT_CATALOG } from \"./catalog.js\";\nimport type {\n InboundEnvelope,\n ProbeResult,\n ProviderAdapter,\n ProviderContext,\n ProviderSupportStatus,\n SendContext,\n SendResult,\n WaitContext,\n WatchContext,\n} from \"./types.js\";\nimport { getBuiltinTargetCodec, type BuiltinProviderAdapterId } from \"./target-normalizers.js\";\n\nexport type Registry = {\n catalog: typeof OPENCLAW_SUPPORT_CATALOG;\n resolve(providerId: string, fixtureId: string): ProviderAdapter;\n};\n\ntype LazyAdapterId = BuiltinProviderAdapterId;\ntype ProviderFactory = () => Promise<ProviderAdapter>;\ntype ActiveWatch = {\n abort(): void;\n close(): Promise<void>;\n dispatch: DispatchBarrier;\n};\ntype DispatchBarrier = {\n promise: Promise<void>;\n reach(): void;\n reached: boolean;\n};\ntype AdmittedOperation = {\n completion: Promise<unknown>;\n dispatch: DispatchBarrier;\n};\ntype LazyProviderFactory = (params: {\n config: ProviderConfig;\n providerId: string;\n userName: string;\n}) => Promise<ProviderAdapter>;\n\nconst LAZY_PROVIDER_FACTORIES = {\n async discord({ config, providerId, userName }) {\n const { DiscordProviderAdapter } = await import(\"./builtin/discord.js\");\n return new DiscordProviderAdapter(providerId, config, userName);\n },\n async feishu({ config, providerId, userName }) {\n const { FeishuProviderAdapter } = await import(\"./builtin/feishu.js\");\n return new FeishuProviderAdapter(providerId, config, userName);\n },\n async googlechat({ config, providerId, userName }) {\n const { GoogleChatProviderAdapter } = await import(\"./builtin/googlechat.js\");\n return new GoogleChatProviderAdapter(providerId, config, userName);\n },\n async imessage({ config, providerId, userName }) {\n const { IMessageProviderAdapter } = await import(\"./builtin/imessage.js\");\n return new IMessageProviderAdapter(providerId, config, userName);\n },\n async loopback({ config, providerId, userName }) {\n const { LoopbackProviderAdapter } = await import(\"./builtin/loopback.js\");\n return new LoopbackProviderAdapter(providerId, config, userName);\n },\n async matrix({ config, providerId, userName }) {\n const { MatrixProviderAdapter } = await import(\"./builtin/matrix.js\");\n return new MatrixProviderAdapter(providerId, config, userName);\n },\n async mattermost({ config, providerId, userName }) {\n const { MattermostProviderAdapter } = await import(\"./builtin/mattermost.js\");\n return new MattermostProviderAdapter(providerId, config, userName);\n },\n async msteams({ config, providerId, userName }) {\n const { MsTeamsProviderAdapter } = await import(\"./builtin/msteams.js\");\n return new MsTeamsProviderAdapter(providerId, config, userName);\n },\n async slack({ config, providerId, userName }) {\n const { SlackProviderAdapter } = await import(\"./builtin/slack.js\");\n return new SlackProviderAdapter(providerId, config, userName);\n },\n async telegram({ config, providerId, userName }) {\n const { TelegramProviderAdapter } = await import(\"./builtin/telegram.js\");\n return new TelegramProviderAdapter(providerId, config, userName);\n },\n async whatsapp({ config, providerId, userName }) {\n const { WhatsAppProviderAdapter } = await import(\"./builtin/whatsapp.js\");\n return new WhatsAppProviderAdapter(providerId, config, userName);\n },\n async zalo({ config, providerId, userName }) {\n const { ZaloProviderAdapter } = await import(\"./builtin/zalo.js\");\n return new ZaloProviderAdapter(providerId, config, userName);\n },\n} satisfies Record<LazyAdapterId, LazyProviderFactory>;\n\nfunction createDispatchBarrier(): DispatchBarrier {\n let resolveDispatch: (() => void) | undefined;\n const dispatch: DispatchBarrier = {\n promise: new Promise<void>((resolve) => {\n resolveDispatch = resolve;\n }),\n reach() {\n if (dispatch.reached) {\n return;\n }\n dispatch.reached = true;\n resolveDispatch?.();\n },\n reached: false,\n };\n return dispatch;\n}\n\nfunction isLazyAdapter(adapter: BuiltinAdapterId): adapter is LazyAdapterId {\n return Object.hasOwn(LAZY_PROVIDER_FACTORIES, adapter);\n}\n\nfunction createLazyProvider(params: {\n adapter: LazyAdapterId;\n config: ProviderConfig;\n providerId: string;\n userName: string;\n}): ProviderAdapter {\n return new LazyProviderAdapter({\n adapterName: params.adapter,\n factory: () => LAZY_PROVIDER_FACTORIES[params.adapter](params),\n id: params.providerId,\n normalizeTarget: getBuiltinTargetCodec(params.adapter).normalize,\n platform: params.config.platform,\n status: \"ready\",\n supports: params.config.capabilities,\n });\n}\n\nexport class LazyProviderAdapter implements ProviderAdapter {\n readonly id;\n readonly platform;\n readonly status;\n readonly supports;\n\n readonly #factory: ProviderFactory;\n readonly #normalizeTarget: ProviderAdapter[\"normalizeTarget\"];\n readonly #activeWatches = new Set<ActiveWatch>();\n readonly #inFlightOperations = new Set<AdmittedOperation>();\n readonly #providerCleanupErrors: unknown[] = [];\n #cleanedUp = false;\n #cleanupPromise: Promise<void> | null = null;\n #providerCleanupBegun = false;\n #providerInstance: ProviderAdapter | null = null;\n #providerPromise: Promise<ProviderAdapter> | null = null;\n\n constructor(params: {\n adapterName: string;\n factory: ProviderFactory;\n id: string;\n normalizeTarget: ProviderAdapter[\"normalizeTarget\"];\n platform: ProviderAdapter[\"platform\"];\n status: ProviderSupportStatus;\n supports: ProviderAdapter[\"supports\"];\n }) {\n this.#factory = params.factory;\n this.#normalizeTarget = params.normalizeTarget;\n this.id = params.id;\n this.platform = params.platform;\n this.status = params.status;\n this.supports = params.supports;\n }\n\n normalizeTarget(target: ProviderContext[\"fixture\"][\"target\"]) {\n this.#assertActive();\n return this.#normalizeTarget(target);\n }\n\n probe(context: ProviderContext): Promise<ProbeResult> {\n return this.#runOperation((provider) => provider.probe(context), context.signal);\n }\n\n send(context: SendContext): Promise<SendResult> {\n return this.#runOperation((provider) => provider.send(context), context.signal);\n }\n\n waitForInbound(context: WaitContext): Promise<InboundEnvelope | null> {\n return this.#runOperation((provider) => provider.waitForInbound(context), context.signal);\n }\n\n watch(context: WatchContext): AsyncIterable<InboundEnvelope> {\n if (this.#cleanedUp) {\n const error = this.#cleanedUpError();\n return {\n [Symbol.asyncIterator](): AsyncIterator<InboundEnvelope> {\n return {\n next: () => Promise.reject(error),\n };\n },\n };\n }\n const controller = new AbortController();\n const abortFromContext = () => controller.abort(context.signal?.reason);\n if (context.signal?.aborted) {\n abortFromContext();\n } else {\n context.signal?.addEventListener(\"abort\", abortFromContext, { once: true });\n }\n const dispatch = createDispatchBarrier();\n const source = this.#watch(context, controller.signal, dispatch)[Symbol.asyncIterator]();\n let activeWatch: ActiveWatch;\n let closed = false;\n let closePromise: Promise<IteratorResult<InboundEnvelope>> | null = null;\n const finish = () => {\n if (closed) {\n return;\n }\n closed = true;\n context.signal?.removeEventListener(\"abort\", abortFromContext);\n this.#activeWatches.delete(activeWatch);\n };\n const close = () => {\n if (closed) {\n return Promise.resolve({ done: true as const, value: undefined as never });\n }\n closePromise ??= (async () => {\n controller.abort();\n try {\n if (!source.return) {\n finish();\n return { done: true as const, value: undefined as never };\n }\n let result = await source.return();\n while (!result.done) {\n result = await source.next();\n }\n finish();\n return result;\n } catch (error) {\n finish();\n throw error;\n } finally {\n dispatch.reach();\n }\n })();\n const closing = closePromise;\n void closing.then(\n () => {\n if (closePromise === closing) {\n closePromise = null;\n }\n },\n () => {\n if (closePromise === closing) {\n closePromise = null;\n }\n },\n );\n return closing;\n };\n const iterator: AsyncIterableIterator<InboundEnvelope> = {\n async next() {\n try {\n const result = await source.next();\n if (result.done) {\n finish();\n }\n return result;\n } catch (error) {\n finish();\n throw error;\n }\n },\n return: close,\n async throw(error?: unknown) {\n controller.abort();\n try {\n if (source.throw) {\n const result = await source.throw(error);\n if (result.done) {\n finish();\n }\n return result;\n }\n throw error;\n } catch (thrownError) {\n finish();\n throw thrownError;\n }\n },\n [Symbol.asyncIterator]() {\n return this;\n },\n };\n activeWatch = {\n abort: () => controller.abort(),\n close: async () => {\n while (!(await close()).done) {\n // Async iterators may yield final values before acknowledging return.\n }\n },\n dispatch,\n };\n this.#activeWatches.add(activeWatch);\n return iterator;\n }\n\n beginCleanup(): void {\n if (this.#cleanedUp) {\n return;\n }\n this.#cleanedUp = true;\n for (const watch of this.#activeWatches) {\n watch.abort();\n }\n this.#beginProviderCleanupIfReady();\n }\n\n async cleanup(): Promise<void> {\n this.beginCleanup();\n this.#cleanupPromise ??= (async () => {\n const operations = [...this.#inFlightOperations];\n const watches = [...this.#activeWatches];\n const closingWatches = watches.map(async (watch) => await watch.close());\n const providerCleanup = this.#cleanupProvider(\n operations\n .map((operation) => operation.dispatch)\n .concat(watches.map((watch) => watch.dispatch)),\n );\n const [cleanupResult, , watchResults] = await Promise.all([\n providerCleanup.then(\n () => ({ ok: true as const }),\n (error: unknown) => ({ error, ok: false as const }),\n ),\n Promise.allSettled(operations.map((operation) => operation.completion)),\n Promise.allSettled(closingWatches),\n ]);\n const teardownErrors = watchResults.flatMap((result) =>\n result.status === \"rejected\" ? [result.reason] : [],\n );\n if (!cleanupResult.ok) {\n teardownErrors.unshift(cleanupResult.error);\n }\n if (teardownErrors.length === 1) {\n throw teardownErrors[0];\n }\n if (teardownErrors.length > 1) {\n throw new AggregateError(teardownErrors, \"Provider cleanup failed.\");\n }\n })();\n await this.#cleanupPromise;\n }\n\n async #provider(): Promise<ProviderAdapter> {\n this.#assertActive();\n this.#providerPromise ??= this.#factory()\n .then((provider) => {\n this.#providerInstance = provider;\n this.#beginProviderCleanupIfReady();\n return provider;\n })\n .catch((error: unknown) => {\n this.#providerPromise = null;\n throw error;\n });\n return await this.#providerPromise;\n }\n\n async *#watch(\n context: WatchContext,\n signal: AbortSignal,\n dispatch: DispatchBarrier,\n ): AsyncIterable<InboundEnvelope> {\n try {\n if (signal.aborted) {\n return;\n }\n const provider = await this.#provider();\n if (signal.aborted) {\n return;\n }\n if (!provider.watch) {\n throw new CrablineError(`Provider \"${this.id}\" does not implement watch.`, {\n kind: \"config\",\n });\n }\n dispatch.reach();\n yield* provider.watch({ ...context, signal });\n } finally {\n dispatch.reach();\n }\n }\n\n #assertActive(): void {\n if (this.#cleanedUp) {\n throw this.#cleanedUpError();\n }\n }\n\n async #cleanupProvider(dispatches: readonly DispatchBarrier[]): Promise<void> {\n const pendingDispatches = dispatches\n .filter((dispatch) => !dispatch.reached)\n .map((dispatch) => dispatch.promise);\n if (pendingDispatches.length > 0) {\n await Promise.allSettled(pendingDispatches);\n }\n let provider = this.#providerInstance;\n if (!provider) {\n const providerPromise = this.#providerPromise;\n if (!providerPromise) {\n return;\n }\n provider = await providerPromise;\n }\n if (!provider) {\n return;\n }\n this.#beginProviderCleanup(provider);\n const errors = [...this.#providerCleanupErrors];\n try {\n await provider.cleanup?.();\n } catch (error) {\n errors.push(error);\n }\n if (errors.length === 1) {\n throw errors[0];\n }\n if (errors.length > 1) {\n throw new AggregateError(errors, \"Provider teardown failed.\");\n }\n }\n\n #beginProviderCleanup(provider: ProviderAdapter): void {\n if (this.#providerCleanupBegun) {\n return;\n }\n this.#providerCleanupBegun = true;\n try {\n provider.beginCleanup?.();\n } catch (error) {\n this.#providerCleanupErrors.push(error);\n }\n }\n\n #beginProviderCleanupIfReady(): void {\n const provider = this.#providerInstance;\n if (\n !this.#cleanedUp ||\n !provider ||\n [...this.#inFlightOperations].some((operation) => !operation.dispatch.reached)\n ) {\n return;\n }\n this.#beginProviderCleanup(provider);\n }\n\n #runOperation<T>(\n run: (provider: ProviderAdapter) => Promise<T>,\n signal?: AbortSignal,\n ): Promise<T> {\n if (this.#cleanedUp) {\n return Promise.reject(this.#cleanedUpError());\n }\n if (signal?.aborted) {\n return Promise.reject(signal.reason ?? new Error(\"Provider operation aborted.\"));\n }\n const dispatch = createDispatchBarrier();\n let rejectCompletion!: (reason?: unknown) => void;\n let resolveCompletion!: (value: T | PromiseLike<T>) => void;\n const completion = new Promise<T>((resolve, reject) => {\n rejectCompletion = reject;\n resolveCompletion = resolve;\n });\n const operation = { completion, dispatch };\n this.#inFlightOperations.add(operation);\n const underlying = (async () => {\n try {\n const provider = await this.#provider();\n if (signal?.aborted) {\n throw signal.reason ?? new Error(\"Provider operation aborted.\");\n }\n const result = run(provider);\n dispatch.reach();\n this.#beginProviderCleanupIfReady();\n return await result;\n } catch (error) {\n dispatch.reach();\n this.#beginProviderCleanupIfReady();\n throw error;\n }\n })();\n void underlying.then(resolveCompletion, rejectCompletion);\n void completion.then(\n () => this.#inFlightOperations.delete(operation),\n () => this.#inFlightOperations.delete(operation),\n );\n return completion;\n }\n\n #cleanedUpError(): CrablineError {\n return new CrablineError(`Provider \"${this.id}\" has been cleaned up.`, { kind: \"config\" });\n }\n}\n\nexport function createRegistry(manifest: ManifestDefinition, manifestPath: string): Registry {\n return {\n catalog: OPENCLAW_SUPPORT_CATALOG,\n resolve(providerId, fixtureId) {\n const fixture = manifest.fixtures.find((entry) => entry.id === fixtureId);\n if (!fixture) {\n throw new CrablineError(`Unknown fixture: ${fixtureId}`, { kind: \"config\" });\n }\n const config = Object.hasOwn(manifest.providers, providerId)\n ? manifest.providers[providerId]\n : undefined;\n if (!config) {\n throw new CrablineError(`Unknown provider: ${providerId}`, { kind: \"config\" });\n }\n if (fixture.provider !== providerId) {\n throw new CrablineError(\n `Fixture \"${fixtureId}\" belongs to provider \"${fixture.provider}\", not \"${providerId}\".`,\n { kind: \"config\" },\n );\n }\n\n if (config.status === \"disabled\") {\n throw new CrablineError(`Provider \"${providerId}\" is disabled.`, { kind: \"config\" });\n }\n if (config.status === \"planned\") {\n throw new CrablineError(`Provider \"${providerId}\" is planned and cannot run.`, {\n kind: \"config\",\n });\n }\n\n const context: ProviderContext = {\n config,\n fixture,\n manifestPath,\n providerId,\n userName: manifest.userName,\n };\n\n if (isLazyAdapter(config.adapter)) {\n return createLazyProvider({\n adapter: config.adapter,\n config,\n providerId,\n userName: manifest.userName,\n });\n }\n\n return new ScriptProviderAdapter(context);\n },\n };\n}\n"]}
@@ -8,8 +8,13 @@ export type RemoteJwtKeySet<T> = {
8
8
  expiresAt: number;
9
9
  values: readonly T[];
10
10
  };
11
+ export declare class JwtKeyInfrastructureError extends Error {
12
+ constructor(message: string, options?: {
13
+ cause?: unknown;
14
+ });
15
+ }
11
16
  export declare function readBearerToken(request: Request): string | undefined;
12
- export declare function resolveHttpCacheExpiry(response: Response, now: number): number;
17
+ export declare function resolveHttpCacheExpiry(response: Response, requestTime: number): number;
13
18
  export declare function createCachedJwtKeyResolver<T>(params: {
14
19
  fetchKeys(signal: AbortSignal): Promise<RemoteJwtKeySet<T>>;
15
20
  keyId(value: T): string | undefined;
@@ -1,8 +1,37 @@
1
1
  import { verify } from "node:crypto";
2
+ export class JwtKeyInfrastructureError extends Error {
3
+ constructor(message, options) {
4
+ super(message, options);
5
+ this.name = "JwtKeyInfrastructureError";
6
+ }
7
+ }
2
8
  const DEFAULT_KEY_FETCH_TIMEOUT_MS = 5_000;
3
9
  const DEFAULT_UNKNOWN_KEY_COOLDOWN_MS = 30_000;
10
+ const MAX_HTTP_CACHE_AGE_SECONDS = 24 * 60 * 60;
4
11
  const MAX_NEGATIVE_KEY_IDS = 128;
12
+ const MAX_NODE_TIMER_DELAY_MS = 2_147_483_647;
13
+ const MAX_REMOTE_KEY_SET_SIZE = 128;
5
14
  const UTF8_DECODER = new TextDecoder("utf-8", { fatal: true });
15
+ function jwtKeyInfrastructureError(error) {
16
+ return error instanceof JwtKeyInfrastructureError
17
+ ? error
18
+ : new JwtKeyInfrastructureError("JWT signing key fetch failed.", { cause: error });
19
+ }
20
+ function requireSafeDuration(value, name, allowZero = false) {
21
+ if (!Number.isSafeInteger(value) ||
22
+ value < (allowZero ? 0 : 1) ||
23
+ value > MAX_NODE_TIMER_DELAY_MS) {
24
+ throw new RangeError(`${name} must be a ${allowZero ? "non-negative" : "positive"} integer no greater than ${MAX_NODE_TIMER_DELAY_MS}.`);
25
+ }
26
+ return value;
27
+ }
28
+ function readJwtClock(now) {
29
+ const value = now();
30
+ if (!Number.isFinite(value)) {
31
+ throw new RangeError("JWT clock must return a finite number.");
32
+ }
33
+ return value;
34
+ }
6
35
  function decodeBase64UrlPart(value, label) {
7
36
  if (!/^[A-Za-z0-9_-]+$/u.test(value)) {
8
37
  throw new Error(`${label} must use unpadded base64url encoding.`);
@@ -21,13 +50,25 @@ function decodeJsonPart(value) {
21
50
  return decoded;
22
51
  }
23
52
  function readHeader(value) {
53
+ if ("crit" in value) {
54
+ const critical = value.crit;
55
+ if (!Array.isArray(critical) ||
56
+ critical.length === 0 ||
57
+ !critical.every((name) => typeof name === "string" && name.length > 0)) {
58
+ throw new Error("JWT crit header must be a non-empty array of parameter names.");
59
+ }
60
+ throw new Error("JWT critical header parameters are unsupported.");
61
+ }
24
62
  if (value.alg !== "RS256" || typeof value.kid !== "string" || !value.kid) {
25
63
  throw new Error("JWT must use RS256 and include a key id.");
26
64
  }
27
65
  return { alg: value.alg, kid: value.kid };
28
66
  }
29
67
  function hasAudience(claim, expected) {
30
- return claim === expected || (Array.isArray(claim) && claim.includes(expected));
68
+ return (claim === expected ||
69
+ (Array.isArray(claim) &&
70
+ claim.every((candidate) => typeof candidate === "string") &&
71
+ claim.includes(expected)));
31
72
  }
32
73
  function numericClaim(claims, name, required = false) {
33
74
  if (!(name in claims)) {
@@ -47,28 +88,128 @@ export function readBearerToken(request) {
47
88
  const match = /^Bearer\s+(\S+)$/iu.exec(authorization ?? "");
48
89
  return match?.[1];
49
90
  }
50
- export function resolveHttpCacheExpiry(response, now) {
91
+ function splitCacheControlDirectives(value) {
92
+ const directives = [];
93
+ let start = 0;
94
+ let quoted = false;
95
+ let escaped = false;
96
+ for (let index = 0; index < value.length; index += 1) {
97
+ const character = value[index];
98
+ if (quoted) {
99
+ if (escaped) {
100
+ escaped = false;
101
+ }
102
+ else if (character === "\\") {
103
+ escaped = true;
104
+ }
105
+ else if (character === '"') {
106
+ quoted = false;
107
+ }
108
+ }
109
+ else if (character === '"') {
110
+ quoted = true;
111
+ }
112
+ else if (character === ",") {
113
+ directives.push(value.slice(start, index));
114
+ start = index + 1;
115
+ }
116
+ }
117
+ if (quoted || escaped) {
118
+ return undefined;
119
+ }
120
+ directives.push(value.slice(start));
121
+ return directives;
122
+ }
123
+ function cacheControlDirectiveName(value) {
124
+ return /^[ \t]*([!#$%&'*+\-.^_`|~0-9A-Za-z]+)/u.exec(value)?.[1]?.toLowerCase();
125
+ }
126
+ export function resolveHttpCacheExpiry(response, requestTime) {
51
127
  const cacheControl = response.headers.get("cache-control");
52
- if (/(?:^|,)\s*(?:no-cache|no-store)(?:\s*(?:=|,|$))/iu.test(cacheControl ?? "")) {
53
- return now;
128
+ const cacheControlDirectives = splitCacheControlDirectives(cacheControl ?? "");
129
+ if (!cacheControlDirectives) {
130
+ return requestTime;
131
+ }
132
+ if (cacheControlDirectives.some((directive) => {
133
+ const name = cacheControlDirectiveName(directive);
134
+ return name === "no-cache" || name === "no-store";
135
+ })) {
136
+ return requestTime;
54
137
  }
55
138
  const ageHeader = response.headers.get("age");
56
139
  const ageSeconds = ageHeader && /^\d+$/u.test(ageHeader) ? Number.parseInt(ageHeader, 10) : 0;
57
- const maxAge = /(?:^|,)\s*max-age=(\d+)/iu.exec(cacheControl ?? "");
58
- if (maxAge) {
59
- return now + Math.max(0, Number(maxAge[1]) - ageSeconds) * 1_000;
140
+ const dateHeader = response.headers.get("date");
141
+ const parsedDate = dateHeader === null ? Number.NaN : Date.parse(dateHeader);
142
+ const dateValue = Number.isFinite(parsedDate) ? parsedDate : undefined;
143
+ const apparentAgeMs = dateValue === undefined ? 0 : Math.max(0, requestTime - dateValue);
144
+ const currentAgeMs = Math.max(apparentAgeMs, ageSeconds * 1_000);
145
+ const maxAgeDirectives = cacheControlDirectives.filter((directive) => cacheControlDirectiveName(directive) === "max-age");
146
+ if (maxAgeDirectives.length > 0) {
147
+ if (maxAgeDirectives.length !== 1) {
148
+ return requestTime;
149
+ }
150
+ const maxAge = /^[ \t]*max-age[ \t]*=[ \t]*(?:"(\d+)"|(\d+))[ \t]*$/iu.exec(maxAgeDirectives[0]);
151
+ if (!maxAge) {
152
+ return requestTime;
153
+ }
154
+ const maxAgeSeconds = Number(maxAge[1] ?? maxAge[2]);
155
+ if (!Number.isSafeInteger(maxAgeSeconds)) {
156
+ return requestTime;
157
+ }
158
+ return (requestTime +
159
+ Math.min(MAX_HTTP_CACHE_AGE_SECONDS * 1_000, Math.max(0, maxAgeSeconds * 1_000 - currentAgeMs)));
160
+ }
161
+ const expiresHeader = response.headers.get("expires");
162
+ if (expiresHeader === null) {
163
+ return requestTime + Math.max(0, 60 * 60 * 1_000 - currentAgeMs);
164
+ }
165
+ const expires = Date.parse(expiresHeader);
166
+ if (!Number.isFinite(expires)) {
167
+ return requestTime;
60
168
  }
61
- const expires = Date.parse(response.headers.get("expires") ?? "");
62
- return Number.isFinite(expires) && expires > now
63
- ? expires
64
- : now + Math.max(0, 60 * 60 - ageSeconds) * 1_000;
169
+ const freshnessLifetimeMs = Math.max(0, expires - (dateValue ?? requestTime));
170
+ return (requestTime +
171
+ Math.min(MAX_HTTP_CACHE_AGE_SECONDS * 1_000, Math.max(0, freshnessLifetimeMs - currentAgeMs)));
172
+ }
173
+ function validateRemoteJwtKeySet(keySet, keyId) {
174
+ if (!Number.isFinite(keySet.expiresAt)) {
175
+ throw new JwtKeyInfrastructureError("JWT signing key set expiry is invalid.");
176
+ }
177
+ if (!Array.isArray(keySet.values)) {
178
+ throw new JwtKeyInfrastructureError("JWT signing key set values must be an array.");
179
+ }
180
+ if (keySet.values.length === 0) {
181
+ throw new JwtKeyInfrastructureError("JWT signing key set must include at least one key.");
182
+ }
183
+ if (keySet.values.length > MAX_REMOTE_KEY_SET_SIZE) {
184
+ throw new JwtKeyInfrastructureError(`JWT signing key set exceeds the ${MAX_REMOTE_KEY_SET_SIZE}-key limit.`);
185
+ }
186
+ const keyIds = new Set();
187
+ for (const value of keySet.values) {
188
+ let candidateKeyId;
189
+ try {
190
+ candidateKeyId = keyId(value);
191
+ }
192
+ catch (error) {
193
+ throw new JwtKeyInfrastructureError("JWT signing key id is invalid.", { cause: error });
194
+ }
195
+ if (typeof candidateKeyId !== "string" || candidateKeyId.length === 0) {
196
+ throw new JwtKeyInfrastructureError("JWT signing key id is invalid.");
197
+ }
198
+ if (keyIds.has(candidateKeyId)) {
199
+ throw new JwtKeyInfrastructureError("JWT signing key ids must be unique.");
200
+ }
201
+ keyIds.add(candidateKeyId);
202
+ }
203
+ return { keyIds: [...keyIds], keySet };
65
204
  }
66
205
  export function createCachedJwtKeyResolver(params) {
67
- const now = params.now ?? Date.now;
68
- const refreshCooldownMs = params.refreshCooldownMs ?? DEFAULT_UNKNOWN_KEY_COOLDOWN_MS;
69
- const timeoutMs = params.timeoutMs ?? DEFAULT_KEY_FETCH_TIMEOUT_MS;
206
+ const clock = params.now ?? Date.now;
207
+ const now = () => readJwtClock(clock);
208
+ const refreshCooldownMs = requireSafeDuration(params.refreshCooldownMs ?? DEFAULT_UNKNOWN_KEY_COOLDOWN_MS, "refreshCooldownMs", true);
209
+ const timeoutMs = requireSafeDuration(params.timeoutMs ?? DEFAULT_KEY_FETCH_TIMEOUT_MS, "timeoutMs");
70
210
  let cached;
71
211
  let fetchInFlight;
212
+ let fetchGeneration = 0;
72
213
  let refreshInFlight;
73
214
  let refreshCooldownUntil = 0;
74
215
  let fetchFailureCooldownUntil = 0;
@@ -90,54 +231,91 @@ export function createCachedJwtKeyResolver(params) {
90
231
  throw new Error(params.unknownKeyMessage);
91
232
  };
92
233
  const fetchKeys = async () => {
93
- if (fetchInFlight) {
94
- return await fetchInFlight;
234
+ let inFlight = fetchInFlight;
235
+ const currentTime = now();
236
+ if (inFlight?.retryAt !== undefined && inFlight.retryAt <= currentTime) {
237
+ if (fetchInFlight?.generation === inFlight.generation) {
238
+ fetchInFlight = undefined;
239
+ }
240
+ inFlight = undefined;
95
241
  }
96
- if (fetchFailureCooldownUntil > now()) {
97
- throw fetchFailureError;
242
+ if (!inFlight) {
243
+ if (fetchFailureCooldownUntil > currentTime) {
244
+ throw fetchFailureError;
245
+ }
246
+ const controller = new AbortController();
247
+ const generation = ++fetchGeneration;
248
+ let keyFetch;
249
+ keyFetch = Promise.resolve()
250
+ .then(() => params.fetchKeys(controller.signal))
251
+ .then((keySet) => validateRemoteJwtKeySet(keySet, params.keyId))
252
+ .then(({ keyIds, keySet }) => {
253
+ if (fetchInFlight?.generation !== generation) {
254
+ throw new JwtKeyInfrastructureError("JWT signing key fetch completed after its generation expired.");
255
+ }
256
+ cached = keySet.expiresAt > now() ? keySet : undefined;
257
+ fetchFailureCooldownUntil = 0;
258
+ fetchFailureError = undefined;
259
+ for (const keyId of keyIds) {
260
+ negativeKeyIds.delete(keyId);
261
+ }
262
+ return keySet;
263
+ }, (error) => {
264
+ const infrastructureError = jwtKeyInfrastructureError(error);
265
+ if (fetchInFlight?.generation === generation) {
266
+ fetchFailureCooldownUntil = now() + refreshCooldownMs;
267
+ fetchFailureError = infrastructureError;
268
+ }
269
+ throw infrastructureError;
270
+ })
271
+ .finally(() => {
272
+ if (fetchInFlight?.generation === generation) {
273
+ fetchInFlight = undefined;
274
+ }
275
+ });
276
+ inFlight = { controller, generation, promise: keyFetch, retryAt: undefined };
277
+ fetchInFlight = inFlight;
278
+ void keyFetch.catch(() => { });
98
279
  }
99
- const controller = new AbortController();
100
280
  let timeout;
101
281
  const timedOut = new Promise((_, reject) => {
102
282
  timeout = setTimeout(() => {
103
- controller.abort();
104
- reject(new Error("JWT signing key fetch timed out."));
283
+ inFlight.controller.abort();
284
+ const timeoutError = new JwtKeyInfrastructureError("JWT signing key fetch timed out.");
285
+ inFlight.retryAt ??= now() + refreshCooldownMs;
286
+ if (fetchInFlight?.generation === inFlight.generation) {
287
+ fetchFailureCooldownUntil = inFlight.retryAt;
288
+ fetchFailureError = timeoutError;
289
+ }
290
+ reject(timeoutError);
105
291
  }, timeoutMs);
106
292
  });
107
- fetchInFlight = Promise.race([params.fetchKeys(controller.signal), timedOut])
108
- .then((keySet) => {
109
- cached = keySet.expiresAt > now() ? keySet : undefined;
110
- fetchFailureCooldownUntil = 0;
111
- fetchFailureError = undefined;
112
- for (const value of keySet.values) {
113
- const keyId = params.keyId(value);
114
- if (keyId) {
115
- negativeKeyIds.delete(keyId);
116
- }
117
- }
118
- return keySet;
119
- })
120
- .catch((error) => {
121
- fetchFailureCooldownUntil = now() + refreshCooldownMs;
122
- fetchFailureError = error;
123
- throw error;
124
- })
125
- .finally(() => {
293
+ try {
294
+ return await Promise.race([inFlight.promise, timedOut]);
295
+ }
296
+ finally {
126
297
  if (timeout) {
127
298
  clearTimeout(timeout);
128
299
  }
129
- fetchInFlight = undefined;
130
- });
131
- return await fetchInFlight;
300
+ }
132
301
  };
133
302
  return async (header) => {
134
303
  const currentTime = now();
304
+ const freshCache = cached && cached.expiresAt > currentTime ? cached : undefined;
305
+ if (!freshCache && cached) {
306
+ const refreshed = await fetchKeys();
307
+ const refreshedKey = refreshed.values.find((candidate) => params.keyId(candidate) === header.kid);
308
+ if (refreshedKey) {
309
+ return refreshedKey;
310
+ }
311
+ refreshCooldownUntil = now() + refreshCooldownMs;
312
+ return rejectUnknownKey(header.kid, refreshCooldownUntil);
313
+ }
135
314
  const negativeExpiry = negativeKeyIds.get(header.kid);
136
315
  if (negativeExpiry && negativeExpiry > currentTime) {
137
316
  throw new Error(params.unknownKeyMessage);
138
317
  }
139
318
  negativeKeyIds.delete(header.kid);
140
- const freshCache = cached && cached.expiresAt > currentTime ? cached : undefined;
141
319
  const keySet = freshCache ?? (await fetchKeys());
142
320
  const key = keySet.values.find((candidate) => params.keyId(candidate) === header.kid);
143
321
  if (key) {
@@ -151,12 +329,22 @@ export function createCachedJwtKeyResolver(params) {
151
329
  refreshed = await refreshInFlight;
152
330
  }
153
331
  else {
154
- const refreshTime = now();
155
- if (refreshCooldownUntil > refreshTime) {
332
+ if (refreshCooldownUntil > now()) {
333
+ if (fetchFailureCooldownUntil > now() && fetchFailureError) {
334
+ throw fetchFailureError;
335
+ }
156
336
  return rejectUnknownKey(header.kid, refreshCooldownUntil);
157
337
  }
158
- refreshCooldownUntil = refreshTime + refreshCooldownMs;
159
- refreshInFlight = fetchKeys().finally(() => {
338
+ refreshInFlight = Promise.resolve()
339
+ .then(fetchKeys)
340
+ .then((refreshedKeySet) => {
341
+ refreshCooldownUntil = now() + refreshCooldownMs;
342
+ return refreshedKeySet;
343
+ }, (error) => {
344
+ refreshCooldownUntil = now() + refreshCooldownMs;
345
+ throw error;
346
+ })
347
+ .finally(() => {
160
348
  refreshInFlight = undefined;
161
349
  });
162
350
  refreshed = await refreshInFlight;
@@ -181,14 +369,17 @@ export async function verifySignedJwt(params) {
181
369
  if (!verify("RSA-SHA256", Buffer.from(`${encodedHeader}.${encodedClaims}`), key, signature)) {
182
370
  throw new Error("JWT signature is invalid.");
183
371
  }
184
- if (!params.issuers.includes(String(claims.iss ?? ""))) {
372
+ if (typeof claims.iss !== "string" || !params.issuers.includes(claims.iss)) {
185
373
  throw new Error("JWT issuer is invalid.");
186
374
  }
187
375
  if (!hasAudience(claims.aud, params.audience)) {
188
376
  throw new Error("JWT audience is invalid.");
189
377
  }
190
- const now = Math.floor((params.now?.() ?? Date.now()) / 1000);
378
+ const now = Math.floor(readJwtClock(params.now ?? Date.now) / 1000);
191
379
  const skew = params.clockSkewSeconds ?? 300;
380
+ if (!Number.isFinite(skew) || skew < 0) {
381
+ throw new Error("JWT clock skew must be a finite non-negative number.");
382
+ }
192
383
  const expiresAt = numericClaim(claims, "exp", true);
193
384
  if (expiresAt <= now - skew) {
194
385
  throw new Error("JWT is expired.");