@private.me/xbind 1.3.5 → 3.0.0

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 (306) hide show
  1. package/LICENSES.md +212 -0
  2. package/README.md +388 -6
  3. package/dist-standalone/_deps/mldsa-wasm/dist/mldsa.js +1 -1920
  4. package/dist-standalone/_deps/shared/cjs/errors.js +1 -639
  5. package/dist-standalone/_deps/shared/cjs/index.js +1 -496
  6. package/dist-standalone/_deps/shared/cjs/types.js +1 -317
  7. package/dist-standalone/_deps/shared/errors.js +1 -255
  8. package/dist-standalone/_deps/shared/index.js +1 -74
  9. package/dist-standalone/_deps/shared/types.js +1 -90
  10. package/dist-standalone/_deps/ux-helpers/cjs/errors.js +1 -1
  11. package/dist-standalone/_deps/ux-helpers/cjs/index.js +1 -1
  12. package/dist-standalone/_deps/ux-helpers/cjs/pagination.js +1 -1
  13. package/dist-standalone/_deps/ux-helpers/cjs/progress.js +1 -1
  14. package/dist-standalone/_deps/ux-helpers/cjs/search.js +1 -1
  15. package/dist-standalone/_deps/ux-helpers/cjs/types.js +1 -1
  16. package/dist-standalone/_deps/ux-helpers/errors.js +1 -1
  17. package/dist-standalone/_deps/ux-helpers/index.js +1 -1
  18. package/dist-standalone/_deps/ux-helpers/pagination.js +1 -1
  19. package/dist-standalone/_deps/ux-helpers/progress.js +1 -1
  20. package/dist-standalone/_deps/ux-helpers/search.js +1 -1
  21. package/dist-standalone/_deps/xchange/auto-accept.js +1 -1
  22. package/dist-standalone/_deps/xchange/cjs/auto-accept.js +1 -1
  23. package/dist-standalone/_deps/xchange/cjs/errors.js +1 -1
  24. package/dist-standalone/_deps/xchange/cjs/index.js +1 -1
  25. package/dist-standalone/_deps/xchange/cjs/invite-client.js +1 -1
  26. package/dist-standalone/_deps/xchange/cjs/lazy-init.js +1 -1
  27. package/dist-standalone/_deps/xchange/cjs/trust-integration.js +1 -1
  28. package/dist-standalone/_deps/xchange/cjs/xchange.js +1 -1
  29. package/dist-standalone/_deps/xchange/errors.js +1 -1
  30. package/dist-standalone/_deps/xchange/index.js +1 -1
  31. package/dist-standalone/_deps/xchange/invite-client.js +1 -1
  32. package/dist-standalone/_deps/xchange/lazy-init.js +1 -1
  33. package/dist-standalone/_deps/xchange/trust-integration.js +1 -1
  34. package/dist-standalone/_deps/xchange/xchange.js +1 -1
  35. package/dist-standalone/_deps/xregistry/cjs/discovery.js +1 -1
  36. package/dist-standalone/_deps/xregistry/cjs/errors.js +1 -1
  37. package/dist-standalone/_deps/xregistry/cjs/index.js +1 -1
  38. package/dist-standalone/_deps/xregistry/cjs/registry.js +1 -1
  39. package/dist-standalone/_deps/xregistry/cjs/schema.js +1 -1
  40. package/dist-standalone/_deps/xregistry/cjs/types.js +1 -1
  41. package/dist-standalone/_deps/xregistry/discovery.js +1 -1
  42. package/dist-standalone/_deps/xregistry/errors.js +1 -1
  43. package/dist-standalone/_deps/xregistry/index.js +1 -1
  44. package/dist-standalone/_deps/xregistry/registry.js +1 -1
  45. package/dist-standalone/_deps/xregistry/schema.js +1 -1
  46. package/dist-standalone/_deps/xregistry/types.js +1 -1
  47. package/dist-standalone/agent-call.js +1 -642
  48. package/dist-standalone/agent-sdk.js +1 -328
  49. package/dist-standalone/agent.d.ts +95 -5
  50. package/dist-standalone/agent.js +1 -1545
  51. package/dist-standalone/approval.js +1 -193
  52. package/dist-standalone/async-iterators.d.ts +275 -0
  53. package/dist-standalone/async-iterators.js +1 -0
  54. package/dist-standalone/auth.js +1 -219
  55. package/dist-standalone/auto-accept.js +1 -229
  56. package/dist-standalone/backup-config.js +1 -201
  57. package/dist-standalone/backup.d.ts +114 -0
  58. package/dist-standalone/backup.js +1 -0
  59. package/dist-standalone/batch-operations.d.ts +297 -0
  60. package/dist-standalone/batch-operations.js +1 -0
  61. package/dist-standalone/cancellation.d.ts +301 -0
  62. package/dist-standalone/cancellation.js +1 -0
  63. package/dist-standalone/checkpoint.js +1 -186
  64. package/dist-standalone/circuit-breaker.d.ts +351 -0
  65. package/dist-standalone/circuit-breaker.js +1 -0
  66. package/dist-standalone/cjs/agent-call.js +1 -651
  67. package/dist-standalone/cjs/agent-sdk.js +1 -332
  68. package/dist-standalone/cjs/agent.js +1 -1582
  69. package/dist-standalone/cjs/approval.js +1 -199
  70. package/dist-standalone/cjs/async-iterators.js +1 -0
  71. package/dist-standalone/cjs/auth.js +1 -225
  72. package/dist-standalone/cjs/auto-accept.js +1 -233
  73. package/dist-standalone/cjs/backup-config.js +1 -207
  74. package/dist-standalone/cjs/backup.js +1 -0
  75. package/dist-standalone/cjs/batch-operations.js +1 -0
  76. package/dist-standalone/cjs/cancellation.js +1 -0
  77. package/dist-standalone/cjs/checkpoint.js +1 -193
  78. package/dist-standalone/cjs/circuit-breaker.js +1 -0
  79. package/dist-standalone/cjs/cli/init.js +1 -486
  80. package/dist-standalone/cjs/config-validation.js +1 -0
  81. package/dist-standalone/cjs/connect.js +1 -312
  82. package/dist-standalone/cjs/connection-pool.js +1 -0
  83. package/dist-standalone/cjs/correlation-id.js +1 -339
  84. package/dist-standalone/cjs/crypto-utils.js +1 -0
  85. package/dist-standalone/cjs/debug-mode.js +1 -0
  86. package/dist-standalone/cjs/did-document.js +1 -101
  87. package/dist-standalone/cjs/did-privateme.js +1 -130
  88. package/dist-standalone/cjs/did-web.js +1 -201
  89. package/dist-standalone/cjs/discovery.js +1 -462
  90. package/dist-standalone/cjs/dual-mode.js +1 -251
  91. package/dist-standalone/cjs/email-templates.js +1 -313
  92. package/dist-standalone/cjs/email-transport.js +1 -239
  93. package/dist-standalone/cjs/envelope.js +1 -510
  94. package/dist-standalone/cjs/errors.js +1 -826
  95. package/dist-standalone/cjs/event-emitter.js +1 -0
  96. package/dist-standalone/cjs/gateway-state.js +1 -55
  97. package/dist-standalone/cjs/gateway-transport.js +1 -120
  98. package/dist-standalone/cjs/graceful-degradation.js +1 -0
  99. package/dist-standalone/cjs/guardrails.js +1 -223
  100. package/dist-standalone/cjs/health-check.js +1 -0
  101. package/dist-standalone/cjs/http-compat.js +1 -272
  102. package/dist-standalone/cjs/http-status-map.js +1 -571
  103. package/dist-standalone/cjs/identity.js +1 -540
  104. package/dist-standalone/cjs/index.js +1 -237
  105. package/dist-standalone/cjs/invitation.js +1 -421
  106. package/dist-standalone/cjs/invite.js +1 -328
  107. package/dist-standalone/cjs/key-agreement.js +1 -246
  108. package/dist-standalone/cjs/lazy-init.js +1 -300
  109. package/dist-standalone/cjs/logger.js +1 -0
  110. package/dist-standalone/cjs/mdns-discovery.js +1 -202
  111. package/dist-standalone/cjs/nonce-store.js +1 -66
  112. package/dist-standalone/cjs/pairing-manager.js +1 -223
  113. package/dist-standalone/cjs/plugin-system.js +1 -0
  114. package/dist-standalone/cjs/plugins/logging.js +1 -0
  115. package/dist-standalone/cjs/plugins/metrics.js +1 -0
  116. package/dist-standalone/cjs/plugins/validation.js +1 -0
  117. package/dist-standalone/cjs/policy.js +1 -320
  118. package/dist-standalone/cjs/progress-callbacks.js +1 -0
  119. package/dist-standalone/cjs/redis-nonce-store.js +1 -76
  120. package/dist-standalone/cjs/registry-middleware.js +1 -50
  121. package/dist-standalone/cjs/retry-strategies.js +1 -0
  122. package/dist-standalone/cjs/retry-transport.js +1 -102
  123. package/dist-standalone/cjs/runtime/browser.js +1 -0
  124. package/dist-standalone/cjs/runtime/edge.js +1 -0
  125. package/dist-standalone/cjs/runtime/react-native.js +1 -0
  126. package/dist-standalone/cjs/security-policy.js +1 -245
  127. package/dist-standalone/cjs/serialization.js +1 -0
  128. package/dist-standalone/cjs/split-channel.js +1 -177
  129. package/dist-standalone/cjs/subscription-proof.js +1 -230
  130. package/dist-standalone/cjs/succession.js +1 -148
  131. package/dist-standalone/cjs/timeouts.js +1 -0
  132. package/dist-standalone/cjs/trace-context.js +1 -0
  133. package/dist-standalone/cjs/trace-spans.js +1 -0
  134. package/dist-standalone/cjs/transport.js +1 -63
  135. package/dist-standalone/cjs/trust-registry.js +1 -742
  136. package/dist-standalone/cjs/types/error-response.js +1 -56
  137. package/dist-standalone/cjs/vault-auth.js +1 -0
  138. package/dist-standalone/cjs/vault-store-loader.js +1 -0
  139. package/dist-standalone/cjs/verify.js +1 -25
  140. package/dist-standalone/cjs/version-info.js +1 -0
  141. package/dist-standalone/cjs/xfetch.js +1 -252
  142. package/dist-standalone/cli/init.js +1 -449
  143. package/dist-standalone/cli/setup.js +1 -514
  144. package/dist-standalone/cli/types.js +1 -27
  145. package/dist-standalone/cli/xbind.js +1 -148
  146. package/dist-standalone/config-validation.d.ts +185 -0
  147. package/dist-standalone/config-validation.js +1 -0
  148. package/dist-standalone/connect.js +1 -274
  149. package/dist-standalone/connection-pool.d.ts +251 -0
  150. package/dist-standalone/connection-pool.js +1 -0
  151. package/dist-standalone/correlation-id.js +1 -326
  152. package/dist-standalone/crypto-utils.d.ts +60 -0
  153. package/dist-standalone/crypto-utils.js +1 -0
  154. package/dist-standalone/debug-mode.d.ts +286 -0
  155. package/dist-standalone/debug-mode.js +1 -0
  156. package/dist-standalone/did-document.js +1 -96
  157. package/dist-standalone/did-privateme.js +1 -121
  158. package/dist-standalone/did-web.js +1 -196
  159. package/dist-standalone/discovery.js +1 -458
  160. package/dist-standalone/dual-mode.js +1 -247
  161. package/dist-standalone/email-templates.js +1 -309
  162. package/dist-standalone/email-transport.js +1 -232
  163. package/dist-standalone/envelope.d.ts +29 -1
  164. package/dist-standalone/envelope.js +1 -497
  165. package/dist-standalone/errors.d.ts +10 -0
  166. package/dist-standalone/errors.js +1 -811
  167. package/dist-standalone/event-emitter.d.ts +395 -0
  168. package/dist-standalone/event-emitter.js +1 -0
  169. package/dist-standalone/gateway-state.js +1 -51
  170. package/dist-standalone/gateway-transport.js +1 -116
  171. package/dist-standalone/graceful-degradation.d.ts +246 -0
  172. package/dist-standalone/graceful-degradation.js +1 -0
  173. package/dist-standalone/guardrails.js +1 -216
  174. package/dist-standalone/health-check.d.ts +150 -0
  175. package/dist-standalone/health-check.js +1 -0
  176. package/dist-standalone/http-compat.js +1 -267
  177. package/dist-standalone/http-status-map.js +1 -561
  178. package/dist-standalone/identity.d.ts +64 -1
  179. package/dist-standalone/identity.js +1 -515
  180. package/dist-standalone/index.d.ts +45 -3
  181. package/dist-standalone/index.js +1 -52
  182. package/dist-standalone/invitation.js +1 -415
  183. package/dist-standalone/invite.js +1 -324
  184. package/dist-standalone/key-agreement.d.ts +61 -13
  185. package/dist-standalone/key-agreement.js +1 -236
  186. package/dist-standalone/lazy-init.js +1 -295
  187. package/dist-standalone/logger.d.ts +77 -0
  188. package/dist-standalone/logger.js +1 -0
  189. package/dist-standalone/mdns-discovery.js +1 -195
  190. package/dist-standalone/nonce-store.d.ts +16 -3
  191. package/dist-standalone/nonce-store.js +1 -62
  192. package/dist-standalone/package.json +0 -1
  193. package/dist-standalone/pairing-manager.js +1 -219
  194. package/dist-standalone/plugin-system.d.ts +145 -0
  195. package/dist-standalone/plugin-system.js +1 -0
  196. package/dist-standalone/policy.js +1 -315
  197. package/dist-standalone/progress-callbacks.d.ts +394 -0
  198. package/dist-standalone/progress-callbacks.js +1 -0
  199. package/dist-standalone/redis-nonce-store.js +1 -72
  200. package/dist-standalone/registry-middleware.js +1 -47
  201. package/dist-standalone/retry-strategies.d.ts +382 -0
  202. package/dist-standalone/retry-strategies.js +1 -0
  203. package/dist-standalone/retry-transport.js +1 -98
  204. package/dist-standalone/security-policy.js +1 -239
  205. package/dist-standalone/serialization.d.ts +244 -0
  206. package/dist-standalone/serialization.js +1 -0
  207. package/dist-standalone/split-channel.d.ts +49 -1
  208. package/dist-standalone/split-channel.js +1 -171
  209. package/dist-standalone/subscription-proof.js +1 -224
  210. package/dist-standalone/succession.js +1 -142
  211. package/dist-standalone/timeouts.d.ts +275 -0
  212. package/dist-standalone/timeouts.js +1 -0
  213. package/dist-standalone/trace-context.d.ts +252 -0
  214. package/dist-standalone/trace-context.js +1 -0
  215. package/dist-standalone/trace-spans.d.ts +360 -0
  216. package/dist-standalone/trace-spans.js +1 -0
  217. package/dist-standalone/transport.js +1 -59
  218. package/dist-standalone/trust-registry.d.ts +106 -5
  219. package/dist-standalone/trust-registry.js +1 -702
  220. package/dist-standalone/vault-auth.d.ts +91 -0
  221. package/dist-standalone/vault-auth.js +1 -0
  222. package/dist-standalone/vault-store-loader.d.ts +110 -0
  223. package/dist-standalone/vault-store-loader.js +1 -0
  224. package/dist-standalone/verify.js +1 -16
  225. package/dist-standalone/version-info.d.ts +259 -0
  226. package/dist-standalone/version-info.js +1 -0
  227. package/dist-standalone/xfetch.js +1 -247
  228. package/llms.txt +1 -0
  229. package/package.json +65 -5
  230. package/share1.dat +0 -0
  231. package/dist-standalone/_deps/crypto/base64.d.ts +0 -29
  232. package/dist-standalone/_deps/crypto/base64.js +0 -222
  233. package/dist-standalone/_deps/crypto/cjs/base64.js +0 -665
  234. package/dist-standalone/_deps/crypto/cjs/errors.js +0 -675
  235. package/dist-standalone/_deps/crypto/cjs/hmac.js +0 -473
  236. package/dist-standalone/_deps/crypto/cjs/index.js +0 -852
  237. package/dist-standalone/_deps/crypto/cjs/package.json +0 -1
  238. package/dist-standalone/_deps/crypto/cjs/padding.js +0 -511
  239. package/dist-standalone/_deps/crypto/cjs/share-header.js +0 -372
  240. package/dist-standalone/_deps/crypto/cjs/shares.js +0 -874
  241. package/dist-standalone/_deps/crypto/cjs/tlv.js +0 -1021
  242. package/dist-standalone/_deps/crypto/cjs/uuid.js +0 -443
  243. package/dist-standalone/_deps/crypto/cjs/verify.js +0 -414
  244. package/dist-standalone/_deps/crypto/cjs/xorida.js +0 -923
  245. package/dist-standalone/_deps/crypto/errors.d.ts +0 -51
  246. package/dist-standalone/_deps/crypto/errors.js +0 -199
  247. package/dist-standalone/_deps/crypto/hmac.d.ts +0 -39
  248. package/dist-standalone/_deps/crypto/hmac.js +0 -134
  249. package/dist-standalone/_deps/crypto/index.d.ts +0 -20
  250. package/dist-standalone/_deps/crypto/index.js +0 -145
  251. package/dist-standalone/_deps/crypto/padding.d.ts +0 -19
  252. package/dist-standalone/_deps/crypto/padding.js +0 -159
  253. package/dist-standalone/_deps/crypto/share-header.d.ts +0 -44
  254. package/dist-standalone/_deps/crypto/share-header.js +0 -92
  255. package/dist-standalone/_deps/crypto/shares.d.ts +0 -27
  256. package/dist-standalone/_deps/crypto/shares.js +0 -295
  257. package/dist-standalone/_deps/crypto/tlv.d.ts +0 -26
  258. package/dist-standalone/_deps/crypto/tlv.js +0 -364
  259. package/dist-standalone/_deps/crypto/uuid.d.ts +0 -22
  260. package/dist-standalone/_deps/crypto/uuid.js +0 -136
  261. package/dist-standalone/_deps/crypto/verify.d.ts +0 -15
  262. package/dist-standalone/_deps/crypto/verify.js +0 -71
  263. package/dist-standalone/_deps/crypto/xorida.d.ts +0 -44
  264. package/dist-standalone/_deps/crypto/xorida.js +0 -366
  265. package/dist-standalone/_deps/shared/errors.d.ts.map +0 -1
  266. package/dist-standalone/_deps/shared/errors.js.map +0 -1
  267. package/dist-standalone/_deps/shared/index.d.ts.map +0 -1
  268. package/dist-standalone/_deps/shared/index.js.map +0 -1
  269. package/dist-standalone/_deps/shared/types.d.ts.map +0 -1
  270. package/dist-standalone/_deps/shared/types.js.map +0 -1
  271. package/dist-standalone/_deps/ux-helpers/cjs/errors.d.ts.map +0 -1
  272. package/dist-standalone/_deps/ux-helpers/cjs/errors.js.map +0 -1
  273. package/dist-standalone/_deps/ux-helpers/cjs/index.d.ts.map +0 -1
  274. package/dist-standalone/_deps/ux-helpers/cjs/index.js.map +0 -1
  275. package/dist-standalone/_deps/ux-helpers/cjs/pagination.d.ts.map +0 -1
  276. package/dist-standalone/_deps/ux-helpers/cjs/pagination.js.map +0 -1
  277. package/dist-standalone/_deps/ux-helpers/cjs/progress.d.ts.map +0 -1
  278. package/dist-standalone/_deps/ux-helpers/cjs/progress.js.map +0 -1
  279. package/dist-standalone/_deps/ux-helpers/cjs/search.d.ts.map +0 -1
  280. package/dist-standalone/_deps/ux-helpers/cjs/search.js.map +0 -1
  281. package/dist-standalone/_deps/ux-helpers/cjs/types.d.ts.map +0 -1
  282. package/dist-standalone/_deps/ux-helpers/cjs/types.js.map +0 -1
  283. package/dist-standalone/_deps/ux-helpers/errors.d.ts.map +0 -1
  284. package/dist-standalone/_deps/ux-helpers/errors.js.map +0 -1
  285. package/dist-standalone/_deps/ux-helpers/index.d.ts.map +0 -1
  286. package/dist-standalone/_deps/ux-helpers/index.js.map +0 -1
  287. package/dist-standalone/_deps/ux-helpers/pagination.d.ts.map +0 -1
  288. package/dist-standalone/_deps/ux-helpers/pagination.js.map +0 -1
  289. package/dist-standalone/_deps/ux-helpers/progress.d.ts.map +0 -1
  290. package/dist-standalone/_deps/ux-helpers/progress.js.map +0 -1
  291. package/dist-standalone/_deps/ux-helpers/search.d.ts.map +0 -1
  292. package/dist-standalone/_deps/ux-helpers/search.js.map +0 -1
  293. package/dist-standalone/_deps/ux-helpers/types.d.ts.map +0 -1
  294. package/dist-standalone/_deps/ux-helpers/types.js.map +0 -1
  295. package/dist-standalone/_deps/xregistry/discovery.d.ts.map +0 -1
  296. package/dist-standalone/_deps/xregistry/discovery.js.map +0 -1
  297. package/dist-standalone/_deps/xregistry/errors.d.ts.map +0 -1
  298. package/dist-standalone/_deps/xregistry/errors.js.map +0 -1
  299. package/dist-standalone/_deps/xregistry/index.d.ts.map +0 -1
  300. package/dist-standalone/_deps/xregistry/index.js.map +0 -1
  301. package/dist-standalone/_deps/xregistry/registry.d.ts.map +0 -1
  302. package/dist-standalone/_deps/xregistry/registry.js.map +0 -1
  303. package/dist-standalone/_deps/xregistry/schema.d.ts.map +0 -1
  304. package/dist-standalone/_deps/xregistry/schema.js.map +0 -1
  305. package/dist-standalone/_deps/xregistry/types.d.ts.map +0 -1
  306. package/dist-standalone/_deps/xregistry/types.js.map +0 -1
@@ -1,177 +1 @@
1
- "use strict";
2
- /**
3
- * XorIDA split-channel bridge for @private.me/xbind.
4
- *
5
- * Bridges @private.me/crypto threshold sharing with the agent-sdk
6
- * TransportEnvelope format. Splits plaintext into n shares with HMAC
7
- * integrity, each share wrapped in its own envelope for independent routing.
8
- *
9
- * Pipeline:
10
- * split: pad -> HMAC -> XorIDA split -> share Uint8Arrays with metadata
11
- * reconstruct: collect k shares -> XorIDA reconstruct -> HMAC verify -> unpad
12
- */
13
- Object.defineProperty(exports, "__esModule", { value: true });
14
- exports.DEFAULT_SPLIT_CONFIG = void 0;
15
- exports.splitForChannel = splitForChannel;
16
- exports.splitForChannelWithGroupId = splitForChannelWithGroupId;
17
- exports.reconstructFromChannel = reconstructFromChannel;
18
- const shared_1 = require("../_deps/shared/index.js");
19
- const crypto_1 = require("../_deps/crypto/index.js");
20
- /** Default split-channel configuration: 3 shares, threshold 2. */
21
- exports.DEFAULT_SPLIT_CONFIG = {
22
- totalShares: 3,
23
- threshold: 2,
24
- };
25
- /* ── Split ── */
26
- /**
27
- * Split plaintext into n shares via XorIDA with HMAC integrity.
28
- *
29
- * Pipeline: pad(PKCS#7) -> HMAC(padded) -> XorIDA split -> ChannelShare[]
30
- *
31
- * @param plaintext - Raw plaintext bytes to split
32
- * @param config - Split configuration (totalShares, threshold)
33
- * @returns Array of n ChannelShare objects ready for envelope wrapping
34
- */
35
- async function splitForChannel(plaintext, config = exports.DEFAULT_SPLIT_CONFIG) {
36
- const { totalShares: n, threshold: k } = config;
37
- if (n < 2 || k < 2 || k > n) {
38
- return (0, shared_1.err)('SPLIT_FAILED:INVALID_PARAMS');
39
- }
40
- const groupId = (0, crypto_1.generateUUID)();
41
- return splitForChannelWithGroupId(plaintext, config, groupId);
42
- }
43
- /**
44
- * Split plaintext with a specific groupId (for testability).
45
- *
46
- * @param plaintext - Raw plaintext bytes
47
- * @param config - Split configuration
48
- * @param groupId - UUID to use for the share group
49
- * @returns Array of ChannelShare objects
50
- */
51
- async function splitForChannelWithGroupId(plaintext, config, groupId) {
52
- const { totalShares: n, threshold: k } = config;
53
- if (n < 2 || k < 2 || k > n) {
54
- return (0, shared_1.err)('SPLIT_FAILED:INVALID_PARAMS');
55
- }
56
- const p = (0, crypto_1.nextOddPrime)(n);
57
- const blockSize = p - 1;
58
- const padded = (0, crypto_1.pkcs7Pad)(plaintext, blockSize);
59
- const { key: hmacKey, signature: hmacSig } = await (0, crypto_1.generateHMAC)(padded);
60
- let shareArrays;
61
- try {
62
- shareArrays = (0, crypto_1.splitXorIDA)(padded, n, k);
63
- }
64
- catch {
65
- return (0, shared_1.err)('SPLIT_FAILED');
66
- }
67
- const hmacKeyB64 = (0, crypto_1.toBase64)(hmacKey);
68
- const hmacSigB64 = (0, crypto_1.toBase64)(hmacSig);
69
- const shares = shareArrays.map((data, index) => ({
70
- data: (0, crypto_1.formatShareHeader)((0, crypto_1.toBase64)(data)),
71
- index,
72
- total: n,
73
- threshold: k,
74
- groupId,
75
- hmacKey: hmacKeyB64,
76
- hmacSig: hmacSigB64,
77
- }));
78
- return (0, shared_1.ok)(shares);
79
- }
80
- /* ── Reconstruct ── */
81
- /**
82
- * Reconstruct plaintext from k-of-n shares.
83
- *
84
- * Pipeline: validate -> XorIDA reconstruct -> HMAC verify -> unpad -> plaintext
85
- * HMAC verification happens BEFORE the data is trusted.
86
- *
87
- * @param shares - Array of at least k ChannelShare objects
88
- * @returns Reconstructed plaintext bytes
89
- */
90
- async function reconstructFromChannel(shares) {
91
- const validationResult = validateShares(shares);
92
- if (!validationResult.ok)
93
- return validationResult;
94
- const { k, n } = validationResult.value;
95
- const usedShares = shares.slice(0, k);
96
- return reconstructValidated(usedShares, n, k);
97
- }
98
- /**
99
- * Validate share consistency before reconstruction.
100
- *
101
- * @param shares - Shares to validate
102
- * @returns Validated parameters or error
103
- */
104
- function validateShares(shares) {
105
- if (shares.length === 0) {
106
- return (0, shared_1.err)('INSUFFICIENT_SHARES');
107
- }
108
- const first = shares[0];
109
- const k = first.threshold;
110
- const n = first.total;
111
- if (shares.length < k) {
112
- return (0, shared_1.err)('INSUFFICIENT_SHARES');
113
- }
114
- const indexSet = new Set();
115
- for (const share of shares) {
116
- if (share.groupId !== first.groupId) {
117
- return (0, shared_1.err)('INCONSISTENT_SHARES');
118
- }
119
- if (share.total !== n || share.threshold !== k) {
120
- return (0, shared_1.err)('INCONSISTENT_SHARES');
121
- }
122
- if (share.index < 0 || share.index >= n) {
123
- return (0, shared_1.err)('INVALID_SHARE_DATA');
124
- }
125
- if (indexSet.has(share.index)) {
126
- return (0, shared_1.err)('INVALID_SHARE_DATA');
127
- }
128
- indexSet.add(share.index);
129
- }
130
- return (0, shared_1.ok)({ k, n, groupId: first.groupId });
131
- }
132
- /**
133
- * Perform XorIDA reconstruction and HMAC verification.
134
- *
135
- * @param usedShares - Exactly k validated shares
136
- * @param n - Total shares
137
- * @param k - Threshold
138
- * @returns Reconstructed plaintext
139
- */
140
- async function reconstructValidated(usedShares, n, k) {
141
- let shareData;
142
- try {
143
- shareData = usedShares.map((s) => (0, crypto_1.fromBase64)((0, crypto_1.parseShareHeader)(s.data)));
144
- }
145
- catch {
146
- return (0, shared_1.err)('INVALID_SHARE_DATA:BASE64');
147
- }
148
- const indices = usedShares.map((s) => s.index);
149
- let padded;
150
- try {
151
- padded = (0, crypto_1.reconstructXorIDA)(shareData, indices, n, k);
152
- }
153
- catch {
154
- return (0, shared_1.err)('SPLIT_FAILED:RECONSTRUCT');
155
- }
156
- const first = usedShares[0];
157
- let hmacKey;
158
- let hmacSig;
159
- try {
160
- hmacKey = (0, crypto_1.fromBase64)(first.hmacKey);
161
- hmacSig = (0, crypto_1.fromBase64)(first.hmacSig);
162
- }
163
- catch {
164
- return (0, shared_1.err)('INVALID_SHARE_DATA:HMAC_DECODE');
165
- }
166
- const hmacValid = await (0, crypto_1.verifyHMAC)(hmacKey, padded, hmacSig);
167
- if (!hmacValid) {
168
- return (0, shared_1.err)('HMAC_VERIFICATION_FAILED');
169
- }
170
- const p = (0, crypto_1.nextOddPrime)(n);
171
- const blockSize = p - 1;
172
- const unpadResult = (0, crypto_1.pkcs7Unpad)(padded, blockSize);
173
- if (!unpadResult.ok) {
174
- return (0, shared_1.err)('UNPAD_FAILED');
175
- }
176
- return (0, shared_1.ok)(unpadResult.value);
177
- }
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.DEFAULT_SPLIT_CONFIG=void 0,exports.splitForChannel=splitForChannel,exports.splitForChannelWithGroupId=splitForChannelWithGroupId,exports.reconstructFromChannel=reconstructFromChannel;const shared_1=require("../_deps/shared/index.js"),crypto_utils_js_1=require("./crypto-utils.js");async function splitForChannel(r,t=exports.DEFAULT_SPLIT_CONFIG){const{totalShares:e,threshold:s}=t;if(e<2||s<2||s>e)return(0,shared_1.err)("SPLIT_FAILED:INVALID_PARAMS");return splitForChannelWithGroupId(r,t,(0,crypto_utils_js_1.generateUUID)())}async function splitForChannelWithGroupId(r,t,e){const{totalShares:s,threshold:_}=t;if(s<2||_<2||_>s)return(0,shared_1.err)("SPLIT_FAILED:INVALID_PARAMS");const o=(0,crypto_utils_js_1.nextOddPrime)(s)-1,a=(0,crypto_utils_js_1.pkcs7Pad)(r,o),{key:n,signature:i}=await(0,crypto_utils_js_1.generateHMAC)(a);let c;try{c=(0,crypto_utils_js_1.splitXorIDA)(a,s,_)}catch{return(0,shared_1.err)("SPLIT_FAILED")}const u=(0,crypto_utils_js_1.toBase64)(n),l=(0,crypto_utils_js_1.toBase64)(i),d=c.map((r,t)=>({data:(0,crypto_utils_js_1.formatShareHeader)((0,crypto_utils_js_1.toBase64)(r)),index:t,total:s,threshold:_,groupId:e,hmacKey:u,hmacSig:l}));return(0,shared_1.ok)(d)}async function reconstructFromChannel(r){const t=validateShares(r);if(!t.ok)return t;const{k:e,n:s}=t.value;return reconstructValidated(r.slice(0,e),s,e)}function validateShares(r){if(0===r.length)return(0,shared_1.err)("INSUFFICIENT_SHARES");const t=r[0],e=t.threshold,s=t.total;if(r.length<e)return(0,shared_1.err)("INSUFFICIENT_SHARES");const _=new Set;for(const o of r){if(o.groupId!==t.groupId)return(0,shared_1.err)("INCONSISTENT_SHARES");if(o.total!==s||o.threshold!==e)return(0,shared_1.err)("INCONSISTENT_SHARES");if(o.index<0||o.index>=s)return(0,shared_1.err)("INVALID_SHARE_DATA");if(_.has(o.index))return(0,shared_1.err)("INVALID_SHARE_DATA");_.add(o.index)}return(0,shared_1.ok)({k:e,n:s,groupId:t.groupId})}async function reconstructValidated(r,t,e){let s;try{s=r.map(r=>(0,crypto_utils_js_1.fromBase64)((0,crypto_utils_js_1.parseShareHeader)(r.data)))}catch{return(0,shared_1.err)("INVALID_SHARE_DATA:BASE64")}const _=r.map(r=>r.index);let o;try{o=(0,crypto_utils_js_1.reconstructXorIDA)(s,_,t,e)}catch{return(0,shared_1.err)("SPLIT_FAILED:RECONSTRUCT")}const a=r[0];let n,i;try{n=(0,crypto_utils_js_1.fromBase64)(a.hmacKey),i=(0,crypto_utils_js_1.fromBase64)(a.hmacSig)}catch{return(0,shared_1.err)("INVALID_SHARE_DATA:HMAC_DECODE")}if(!await(0,crypto_utils_js_1.verifyHMAC)(n,o,i))return(0,shared_1.err)("HMAC_VERIFICATION_FAILED");const c=(0,crypto_utils_js_1.nextOddPrime)(t)-1,u=(0,crypto_utils_js_1.pkcs7Unpad)(o,c);return u.ok?(0,shared_1.ok)(u.value):(0,shared_1.err)("UNPAD_FAILED")}exports.DEFAULT_SPLIT_CONFIG={totalShares:3,threshold:2};
@@ -1,230 +1 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createSubscriptionProof = createSubscriptionProof;
4
- exports.verifySubscriptionProof = verifySubscriptionProof;
5
- exports.resumeSubscription = resumeSubscription;
6
- exports.hashBloomFilter = hashBloomFilter;
7
- const shared_1 = require("../_deps/shared/index.js");
8
- const identity_js_1 = require("./identity.js");
9
- /* ── Internal Helpers ── */
10
- /**
11
- * Compute SHA-256 hash of a Uint8Array.
12
- *
13
- * @param data - Data to hash.
14
- * @returns Hex-encoded SHA-256 hash.
15
- */
16
- async function sha256Hash(data) {
17
- try {
18
- // SAFETY: Creating fresh copy ensures proper ArrayBuffer type (not SharedArrayBuffer)
19
- const buffer = new Uint8Array(data);
20
- const hashBuffer = await crypto.subtle.digest('SHA-256', buffer);
21
- const hashArray = Array.from(new Uint8Array(hashBuffer));
22
- const hashHex = hashArray.map(b => b.toString(16).padStart(2, '0')).join('');
23
- return (0, shared_1.ok)(hashHex);
24
- }
25
- catch {
26
- return (0, shared_1.err)('HASH_FAILED');
27
- }
28
- }
29
- /**
30
- * Serialize subscription proof data for signing (canonical format).
31
- *
32
- * Format: type|version|peer_did|bloom_filter_hash|asserted_at|expires_at
33
- *
34
- * @param proof - Subscription proof (without signature).
35
- * @returns Canonical byte representation.
36
- */
37
- function serializeForSigning(proof) {
38
- const canonical = `${proof.type}|${proof.version}|${proof.peer_did}|${proof.bloom_filter_hash}|${proof.asserted_at}|${proof.expires_at}`;
39
- return new TextEncoder().encode(canonical);
40
- }
41
- /**
42
- * Base64 encode (standard, not URL-safe).
43
- */
44
- function toBase64(data) {
45
- // Use Buffer in Node.js, btoa in browser
46
- if (typeof Buffer !== 'undefined') {
47
- return Buffer.from(data).toString('base64');
48
- }
49
- // SAFETY: btoa is standard in browsers
50
- return globalThis.btoa(String.fromCharCode(...data));
51
- }
52
- /**
53
- * Base64 decode (standard, not URL-safe).
54
- */
55
- function fromBase64(data) {
56
- // Use Buffer in Node.js, atob in browser
57
- if (typeof Buffer !== 'undefined') {
58
- return new Uint8Array(Buffer.from(data, 'base64'));
59
- }
60
- // SAFETY: atob is standard in browsers
61
- const binary = globalThis.atob(data);
62
- const bytes = new Uint8Array(binary.length);
63
- for (let i = 0; i < binary.length; i++) {
64
- bytes[i] = binary.charCodeAt(i);
65
- }
66
- return bytes;
67
- }
68
- /* ── Public API ── */
69
- /**
70
- * Create a subscription proof (client-side).
71
- *
72
- * Signs a bloom filter hash with the peer's ML-DSA-65 private key, creating
73
- * a portable proof that can be used to resume subscriptions on a new gateway.
74
- *
75
- * @param peerDid - Subscriber's DID (must match the private key).
76
- * @param bloomFilterHash - SHA-256 hash of the bloom filter (hex string).
77
- * @param privateKey - 32-byte ML-DSA-65 secret key seed.
78
- * @param expiresAt - Optional expiration timestamp (ms). Default: 30 days from now.
79
- * @returns Subscription proof with ML-DSA-65 signature.
80
- *
81
- * @example
82
- * ```typescript
83
- * const proof = await createSubscriptionProof(
84
- * 'did:key:z6Mk...',
85
- * 'a1b2c3...',
86
- * mlDsaPrivateKey,
87
- * Date.now() + 30 * 24 * 60 * 60 * 1000
88
- * );
89
- * ```
90
- */
91
- async function createSubscriptionProof(peerDid, bloomFilterHash, privateKey, expiresAt) {
92
- const assertedAt = Date.now();
93
- const expiresAtFinal = expiresAt ?? (assertedAt + 30 * 24 * 60 * 60 * 1000); // 30 days default
94
- // Build proof without signature
95
- const proofWithoutSig = {
96
- type: 'SubscriptionProof',
97
- version: '1.0',
98
- peer_did: peerDid,
99
- bloom_filter_hash: bloomFilterHash,
100
- asserted_at: assertedAt,
101
- expires_at: expiresAtFinal,
102
- };
103
- // Serialize and sign
104
- const dataToSign = serializeForSigning(proofWithoutSig);
105
- const signatureResult = await (0, identity_js_1.signMlDsa65)(privateKey, dataToSign);
106
- if (!signatureResult.ok) {
107
- return (0, shared_1.err)('SIGNATURE_VERIFICATION_FAILED');
108
- }
109
- const signature = signatureResult.value;
110
- if (signature.length !== identity_js_1.ML_DSA65_SIG_BYTES) {
111
- return (0, shared_1.err)('SIGNATURE_VERIFICATION_FAILED');
112
- }
113
- // Build final proof
114
- const proof = {
115
- ...proofWithoutSig,
116
- peer_signature_algorithm: 'ML-DSA-65',
117
- peer_signature: toBase64(signature),
118
- };
119
- return (0, shared_1.ok)(proof);
120
- }
121
- /**
122
- * Verify a subscription proof (gateway-side).
123
- *
124
- * Validates the ML-DSA-65 signature and checks expiration.
125
- *
126
- * @param proof - Subscription proof to verify.
127
- * @param peerPublicKey - 1952-byte ML-DSA-65 public key of the subscriber.
128
- * @returns true if valid, false if invalid or expired.
129
- *
130
- * @example
131
- * ```typescript
132
- * const isValid = await verifySubscriptionProof(proof, mlDsaPublicKey);
133
- * if (isValid.ok && isValid.value) {
134
- * // Resume subscription
135
- * }
136
- * ```
137
- */
138
- async function verifySubscriptionProof(proof, peerPublicKey) {
139
- // Check proof version
140
- if (proof.version !== '1.0' || proof.type !== 'SubscriptionProof') {
141
- return (0, shared_1.ok)(false);
142
- }
143
- // Check expiration
144
- if (Date.now() > proof.expires_at) {
145
- return (0, shared_1.err)('EXPIRED');
146
- }
147
- // Check signature algorithm
148
- if (proof.peer_signature_algorithm !== 'ML-DSA-65') {
149
- return (0, shared_1.ok)(false);
150
- }
151
- // Decode signature
152
- let signature;
153
- try {
154
- signature = fromBase64(proof.peer_signature);
155
- }
156
- catch {
157
- return (0, shared_1.ok)(false);
158
- }
159
- if (signature.length !== identity_js_1.ML_DSA65_SIG_BYTES) {
160
- return (0, shared_1.ok)(false);
161
- }
162
- // Reconstruct signed data
163
- const proofWithoutSig = {
164
- type: proof.type,
165
- version: proof.version,
166
- peer_did: proof.peer_did,
167
- bloom_filter_hash: proof.bloom_filter_hash,
168
- asserted_at: proof.asserted_at,
169
- expires_at: proof.expires_at,
170
- };
171
- const dataToVerify = serializeForSigning(proofWithoutSig);
172
- // Verify signature
173
- const verifyResult = await (0, identity_js_1.verifyMlDsa65)(peerPublicKey, signature, dataToVerify);
174
- if (!verifyResult.ok) {
175
- return (0, shared_1.err)('SIGNATURE_VERIFICATION_FAILED');
176
- }
177
- return (0, shared_1.ok)(verifyResult.value);
178
- }
179
- /**
180
- * Resume subscription on a new gateway using a proof.
181
- *
182
- * Presents the subscription proof to the new gateway, allowing the client
183
- * to resume receiving trust events without re-subscribing.
184
- *
185
- * @param proof - Valid subscription proof.
186
- * @param newGatewayUrl - Base URL of the new gateway (e.g., https://atelier2.xail.io).
187
- * @returns Success or network error.
188
- *
189
- * @example
190
- * ```typescript
191
- * const result = await resumeSubscription(proof, 'https://atelier2.xail.io');
192
- * if (result.ok) {
193
- * console.log('Subscription resumed on new gateway');
194
- * }
195
- * ```
196
- */
197
- async function resumeSubscription(proof, newGatewayUrl) {
198
- try {
199
- const baseUrl = newGatewayUrl.replace(/\/$/, '');
200
- const response = await fetch(`${baseUrl}/trust/resume`, {
201
- method: 'POST',
202
- headers: { 'Content-Type': 'application/json' },
203
- body: JSON.stringify(proof),
204
- });
205
- if (!response.ok) {
206
- return (0, shared_1.err)('NETWORK_ERROR');
207
- }
208
- return (0, shared_1.ok)(undefined);
209
- }
210
- catch {
211
- return (0, shared_1.err)('NETWORK_ERROR');
212
- }
213
- }
214
- /**
215
- * Compute SHA-256 hash of a bloom filter for proof creation.
216
- *
217
- * @param bloomFilter - Bloom filter bytes.
218
- * @returns Hex-encoded SHA-256 hash.
219
- *
220
- * @example
221
- * ```typescript
222
- * const hash = await hashBloomFilter(bloomFilterBytes);
223
- * if (hash.ok) {
224
- * const proof = await createSubscriptionProof(did, hash.value, privateKey);
225
- * }
226
- * ```
227
- */
228
- async function hashBloomFilter(bloomFilter) {
229
- return sha256Hash(bloomFilter);
230
- }
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.createSubscriptionProof=createSubscriptionProof,exports.verifySubscriptionProof=verifySubscriptionProof,exports.resumeSubscription=resumeSubscription,exports.hashBloomFilter=hashBloomFilter;const shared_1=require("../_deps/shared/index.js"),identity_js_1=require("./identity.js");async function sha256Hash(e){try{const r=new Uint8Array(e),t=await crypto.subtle.digest("SHA-256",r),i=Array.from(new Uint8Array(t)).map(e=>e.toString(16).padStart(2,"0")).join("");return(0,shared_1.ok)(i)}catch{return(0,shared_1.err)("HASH_FAILED")}}function serializeForSigning(e){const r=`${e.type}|${e.version}|${e.peer_did}|${e.bloom_filter_hash}|${e.asserted_at}|${e.expires_at}`;return(new TextEncoder).encode(r)}function toBase64(e){return"undefined"!=typeof Buffer?Buffer.from(e).toString("base64"):globalThis.btoa(String.fromCharCode(...e))}function fromBase64(e){if("undefined"!=typeof Buffer)return new Uint8Array(Buffer.from(e,"base64"));const r=globalThis.atob(e),t=new Uint8Array(r.length);for(let e=0;e<r.length;e++)t[e]=r.charCodeAt(e);return t}async function createSubscriptionProof(e,r,t,i){const o=Date.now(),s={type:"SubscriptionProof",version:"1.0",peer_did:e,bloom_filter_hash:r,asserted_at:o,expires_at:i??o+2592e6},n=serializeForSigning(s),a=await(0,identity_js_1.signMlDsa65)(t,n);if(!a.ok)return(0,shared_1.err)("SIGNATURE_VERIFICATION_FAILED");const _=a.value;if(_.length!==identity_js_1.ML_DSA65_SIG_BYTES)return(0,shared_1.err)("SIGNATURE_VERIFICATION_FAILED");const u={...s,peer_signature_algorithm:"ML-DSA-65",peer_signature:toBase64(_)};return(0,shared_1.ok)(u)}async function verifySubscriptionProof(e,r){if("1.0"!==e.version||"SubscriptionProof"!==e.type)return(0,shared_1.ok)(!1);if(Date.now()>e.expires_at)return(0,shared_1.err)("EXPIRED");if("ML-DSA-65"!==e.peer_signature_algorithm)return(0,shared_1.ok)(!1);let t;try{t=fromBase64(e.peer_signature)}catch{return(0,shared_1.ok)(!1)}if(t.length!==identity_js_1.ML_DSA65_SIG_BYTES)return(0,shared_1.ok)(!1);const i=serializeForSigning({type:e.type,version:e.version,peer_did:e.peer_did,bloom_filter_hash:e.bloom_filter_hash,asserted_at:e.asserted_at,expires_at:e.expires_at}),o=await(0,identity_js_1.verifyMlDsa65)(r,t,i);return o.ok?(0,shared_1.ok)(o.value):(0,shared_1.err)("SIGNATURE_VERIFICATION_FAILED")}async function resumeSubscription(e,r){try{const t=r.replace(/\/$/,"");return(await fetch(`${t}/trust/resume`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)})).ok?(0,shared_1.ok)(void 0):(0,shared_1.err)("NETWORK_ERROR")}catch{return(0,shared_1.err)("NETWORK_ERROR")}}async function hashBloomFilter(e){return sha256Hash(e)}
@@ -1,148 +1 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createSuccession = createSuccession;
4
- exports.verifySuccession = verifySuccession;
5
- exports.encodeSuccession = encodeSuccession;
6
- exports.decodeSuccession = decodeSuccession;
7
- const identity_js_1 = require("./identity.js");
8
- const shared_1 = require("../_deps/shared/index.js");
9
- /**
10
- * Create DID succession announcement with dual signatures.
11
- *
12
- * Format: did:key:OLD||did:key:NEW||sequence||effective_at||expires_at||grace_period||timestamp||sig_OLD||sig_NEW
13
- * Both old and new keys must sign to prove possession.
14
- *
15
- * @param oldDid - DID being rotated (old key)
16
- * @param oldPrivateKey - ML-DSA-65 secret key (32-byte seed) for old DID
17
- * @param newDid - DID replacing old DID
18
- * @param newPrivateKey - ML-DSA-65 secret key (32-byte seed) for new DID
19
- * @param rotationSequence - Monotonically increasing sequence number
20
- * @param gracePeriodMs - Overlap window in milliseconds (default: 7 days)
21
- * @returns Succession announcement with dual signatures or error
22
- */
23
- async function createSuccession(oldDid, oldPrivateKey, newDid, newPrivateKey, rotationSequence, gracePeriodMs = 7 * 24 * 60 * 60 * 1000 // 7 days default
24
- ) {
25
- const timestamp = Date.now();
26
- const effective_at = timestamp;
27
- const expires_at = timestamp + 30 * 24 * 60 * 60 * 1000; // 30 days proof validity
28
- const message = `${oldDid}||${newDid}||${rotationSequence}||${effective_at}||${expires_at}||${gracePeriodMs}||${timestamp}`;
29
- const messageBytes = new TextEncoder().encode(message);
30
- const oldSigResult = await (0, identity_js_1.signMlDsa65)(oldPrivateKey, messageBytes);
31
- if (!oldSigResult.ok) {
32
- return (0, shared_1.err)('SIGN_FAILED');
33
- }
34
- const newSigResult = await (0, identity_js_1.signMlDsa65)(newPrivateKey, messageBytes);
35
- if (!newSigResult.ok) {
36
- return (0, shared_1.err)('SIGN_FAILED');
37
- }
38
- return (0, shared_1.ok)({
39
- oldDid,
40
- newDid,
41
- rotation_sequence: rotationSequence,
42
- effective_at,
43
- expires_at,
44
- grace_period_ms: gracePeriodMs,
45
- timestamp,
46
- oldSignature: oldSigResult.value,
47
- newSignature: newSigResult.value
48
- });
49
- }
50
- /**
51
- * Verify succession announcement dual signatures.
52
- *
53
- * Both old and new keys must have valid signatures.
54
- * Also checks sequence monotonicity (new sequence must be greater than current).
55
- *
56
- * @param announcement - Succession announcement to verify
57
- * @param oldPublicKey - ML-DSA-65 public key (1952 bytes) for old DID
58
- * @param newPublicKey - ML-DSA-65 public key (1952 bytes) for new DID
59
- * @returns true if both signatures valid, false otherwise
60
- */
61
- async function verifySuccession(announcement, oldPublicKey, newPublicKey) {
62
- const message = `${announcement.oldDid}||${announcement.newDid}||${announcement.rotation_sequence}||${announcement.effective_at}||${announcement.expires_at}||${announcement.grace_period_ms}||${announcement.timestamp}`;
63
- const messageBytes = new TextEncoder().encode(message);
64
- const oldValidResult = await (0, identity_js_1.verifyMlDsa65)(oldPublicKey, announcement.oldSignature, messageBytes);
65
- if (!oldValidResult.ok) {
66
- return (0, shared_1.err)('VERIFY_FAILED');
67
- }
68
- const newValidResult = await (0, identity_js_1.verifyMlDsa65)(newPublicKey, announcement.newSignature, messageBytes);
69
- if (!newValidResult.ok) {
70
- return (0, shared_1.err)('VERIFY_FAILED');
71
- }
72
- const bothValid = oldValidResult.value && newValidResult.value;
73
- return (0, shared_1.ok)(bothValid);
74
- }
75
- /**
76
- * Encode succession announcement to wire format.
77
- *
78
- * Format: did:key:OLD||did:key:NEW||sequence||effective_at||expires_at||grace_period||timestamp||sig_OLD||sig_NEW
79
- *
80
- * @param announcement - Succession announcement to encode
81
- * @returns Wire format string (base64-encoded signatures)
82
- */
83
- function encodeSuccession(announcement) {
84
- const parts = [
85
- announcement.oldDid,
86
- announcement.newDid,
87
- announcement.rotation_sequence.toString(),
88
- announcement.effective_at.toString(),
89
- announcement.expires_at.toString(),
90
- announcement.grace_period_ms.toString(),
91
- announcement.timestamp.toString(),
92
- Buffer.from(announcement.oldSignature).toString('base64'),
93
- Buffer.from(announcement.newSignature).toString('base64')
94
- ];
95
- return parts.join('||');
96
- }
97
- /**
98
- * Decode succession announcement from wire format.
99
- *
100
- * @param encoded - Wire format string
101
- * @returns Parsed succession announcement or error
102
- */
103
- function decodeSuccession(encoded) {
104
- const parts = encoded.split('||');
105
- if (parts.length !== 9) {
106
- return (0, shared_1.err)('INVALID_FORMAT');
107
- }
108
- const oldDid = parts[0];
109
- const newDid = parts[1];
110
- const sequenceStr = parts[2];
111
- const effectiveAtStr = parts[3];
112
- const expiresAtStr = parts[4];
113
- const gracePeriodStr = parts[5];
114
- const timestampStr = parts[6];
115
- const oldSigB64 = parts[7];
116
- const newSigB64 = parts[8];
117
- if (!oldDid || !newDid || !sequenceStr || !effectiveAtStr || !expiresAtStr || !gracePeriodStr || !timestampStr || !oldSigB64 || !newSigB64) {
118
- return (0, shared_1.err)('INVALID_FORMAT');
119
- }
120
- const rotation_sequence = parseInt(sequenceStr, 10);
121
- const effective_at = parseInt(effectiveAtStr, 10);
122
- const expires_at = parseInt(expiresAtStr, 10);
123
- const grace_period_ms = parseInt(gracePeriodStr, 10);
124
- const timestamp = parseInt(timestampStr, 10);
125
- if (isNaN(rotation_sequence) || rotation_sequence < 0 ||
126
- isNaN(effective_at) || effective_at < 0 ||
127
- isNaN(expires_at) || expires_at < 0 ||
128
- isNaN(grace_period_ms) || grace_period_ms < 0 ||
129
- isNaN(timestamp) || timestamp < 0) {
130
- return (0, shared_1.err)('INVALID_TIMESTAMP');
131
- }
132
- try {
133
- return (0, shared_1.ok)({
134
- oldDid,
135
- newDid,
136
- rotation_sequence,
137
- effective_at,
138
- expires_at,
139
- grace_period_ms,
140
- timestamp,
141
- oldSignature: new Uint8Array(Buffer.from(oldSigB64, 'base64')),
142
- newSignature: new Uint8Array(Buffer.from(newSigB64, 'base64'))
143
- });
144
- }
145
- catch {
146
- return (0, shared_1.err)('INVALID_FORMAT');
147
- }
148
- }
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.createSuccession=createSuccession,exports.verifySuccession=verifySuccession,exports.encodeSuccession=encodeSuccession,exports.decodeSuccession=decodeSuccession;const identity_js_1=require("./identity.js"),shared_1=require("../_deps/shared/index.js");async function createSuccession(e,r,t,n,i,s=6048e5){const o=Date.now(),a=o,c=o+2592e6,d=`${e}||${t}||${i}||${a}||${c}||${s}||${o}`,_=(new TextEncoder).encode(d),u=await(0,identity_js_1.signMlDsa65)(r,_);if(!u.ok)return(0,shared_1.err)("SIGN_FAILED");const f=await(0,identity_js_1.signMlDsa65)(n,_);return f.ok?(0,shared_1.ok)({oldDid:e,newDid:t,rotation_sequence:i,effective_at:a,expires_at:c,grace_period_ms:s,timestamp:o,oldSignature:u.value,newSignature:f.value}):(0,shared_1.err)("SIGN_FAILED")}async function verifySuccession(e,r,t){const n=`${e.oldDid}||${e.newDid}||${e.rotation_sequence}||${e.effective_at}||${e.expires_at}||${e.grace_period_ms}||${e.timestamp}`,i=(new TextEncoder).encode(n),s=await(0,identity_js_1.verifyMlDsa65)(r,e.oldSignature,i);if(!s.ok)return(0,shared_1.err)("VERIFY_FAILED");const o=await(0,identity_js_1.verifyMlDsa65)(t,e.newSignature,i);if(!o.ok)return(0,shared_1.err)("VERIFY_FAILED");const a=s.value&&o.value;return(0,shared_1.ok)(a)}function encodeSuccession(e){return[e.oldDid,e.newDid,e.rotation_sequence.toString(),e.effective_at.toString(),e.expires_at.toString(),e.grace_period_ms.toString(),e.timestamp.toString(),Buffer.from(e.oldSignature).toString("base64"),Buffer.from(e.newSignature).toString("base64")].join("||")}function decodeSuccession(e){const r=e.split("||");if(9!==r.length)return(0,shared_1.err)("INVALID_FORMAT");const t=r[0],n=r[1],i=r[2],s=r[3],o=r[4],a=r[5],c=r[6],d=r[7],_=r[8];if(!(t&&n&&i&&s&&o&&a&&c&&d&&_))return(0,shared_1.err)("INVALID_FORMAT");const u=parseInt(i,10),f=parseInt(s,10),S=parseInt(o,10),p=parseInt(a,10),g=parseInt(c,10);if(isNaN(u)||u<0||isNaN(f)||f<0||isNaN(S)||S<0||isNaN(p)||p<0||isNaN(g)||g<0)return(0,shared_1.err)("INVALID_TIMESTAMP");try{return(0,shared_1.ok)({oldDid:t,newDid:n,rotation_sequence:u,effective_at:f,expires_at:S,grace_period_ms:p,timestamp:g,oldSignature:new Uint8Array(Buffer.from(d,"base64")),newSignature:new Uint8Array(Buffer.from(_,"base64"))})}catch{return(0,shared_1.err)("INVALID_FORMAT")}}
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.globalTimeoutConfig=exports.OperationTimeoutController=exports.TimeoutConfig=exports.DEFAULT_TIMEOUTS=exports.TimeoutError=void 0,exports.createTimeoutController=createTimeoutController,exports.withTimeout=withTimeout,exports.withTimeoutResult=withTimeoutResult,exports.createOperationTimeoutSignal=createOperationTimeoutSignal,exports.createOperationTimeout=createOperationTimeout,exports.isTimeoutError=isTimeoutError,exports.getTimeoutFromError=getTimeoutFromError,exports.createTimeoutConfigFromEnv=createTimeoutConfigFromEnv;const shared_1=require("../_deps/shared/index.js");class TimeoutError extends Error{code="TIMEOUT";operation;timeoutMs;timestamp;constructor(t,e){super(`Operation '${t}' timed out after ${e}ms. Actions: (1) Check network connectivity, (2) Increase timeout threshold, (3) Verify service availability, (4) Implement retry with exponential backoff.`),this.name="TimeoutError",this.operation=t,this.timeoutMs=e,this.timestamp=Date.now()}static withContext(t,e,r){const o=new TimeoutError(t,e);return r&&Object.assign(o,{context:r}),o}}exports.TimeoutError=TimeoutError,exports.DEFAULT_TIMEOUTS={registry:1e4,gateway:15e3,transport:3e4,default:3e4};class TimeoutConfig{registry;gateway;transport;default;constructor(t={}){this.registry=t.registry??exports.DEFAULT_TIMEOUTS.registry,this.gateway=t.gateway??exports.DEFAULT_TIMEOUTS.gateway,this.transport=t.transport??exports.DEFAULT_TIMEOUTS.transport,this.default=t.default??exports.DEFAULT_TIMEOUTS.default,this.validateTimeout("registry",this.registry),this.validateTimeout("gateway",this.gateway),this.validateTimeout("transport",this.transport),this.validateTimeout("default",this.default)}getRegistry(t){return t??this.registry}getGateway(t){return t??this.gateway}getTransport(t){return t??this.transport}getDefault(t){return t??this.default}get(t,e){switch(t){case"registry":return this.getRegistry(e);case"gateway":return this.getGateway(e);case"transport":return this.getTransport(e);case"default":return this.getDefault(e)}}with(t){return new TimeoutConfig({registry:t.registry??this.registry,gateway:t.gateway??this.gateway,transport:t.transport??this.transport,default:t.default??this.default})}validateTimeout(t,e){if(!Number.isFinite(e)||e<=0)throw new Error(`Invalid timeout for '${t}': ${e}. Must be positive finite number.`);e>3e5&&console.warn(`[xbind:timeout] Large timeout for '${t}': ${e}ms. Consider reducing to avoid indefinite hangs.`)}toJSON(){return{registry:this.registry,gateway:this.gateway,transport:this.transport,default:this.default}}}exports.TimeoutConfig=TimeoutConfig;class OperationTimeoutController{signal;timeoutMs;operation;controller;timer;timedOut=!1;constructor(t,e="operation"){this.controller=new AbortController,this.signal=this.controller.signal,this.timeoutMs=t,this.operation=e,this.timer=setTimeout(()=>{this.timedOut=!0,this.controller.abort()},t)}cancel(){clearTimeout(this.timer),this.controller.signal.aborted||this.controller.abort()}clear(){clearTimeout(this.timer)}didTimeout(){return this.timedOut}getTimeoutError(){return this.timedOut?new TimeoutError(this.operation,this.timeoutMs):null}}function createTimeoutController(t,e="operation"){return new OperationTimeoutController(t,e)}async function withTimeout(t,e,r="operation"){const o=createTimeoutController(e,r);try{const i=await Promise.race([t(),new Promise((t,i)=>{o.signal.addEventListener("abort",()=>{i(new TimeoutError(r,e))})})]);return o.clear(),i}catch(t){throw o.clear(),t}}async function withTimeoutResult(t,e,r="operation"){try{const o=await withTimeout(t,e,r);return(0,shared_1.ok)(o)}catch(t){if(t instanceof TimeoutError)return(0,shared_1.err)("TIMEOUT");throw t}}function createOperationTimeoutSignal(t,e="operation"){return createTimeoutController(t,e).signal}function createOperationTimeout(t,e,r,o){return createTimeoutController(t.get(e,o),r)}function isTimeoutError(t){return t instanceof TimeoutError}function getTimeoutFromError(t){return isTimeoutError(t)?t.timeoutMs:void 0}function createTimeoutConfigFromEnv(){const t={},e=process.env.XBIND_TIMEOUT_REGISTRY;if(e){const r=parseInt(e,10);isNaN(r)||(t.registry=r)}const r=process.env.XBIND_TIMEOUT_GATEWAY;if(r){const e=parseInt(r,10);isNaN(e)||(t.gateway=e)}const o=process.env.XBIND_TIMEOUT_TRANSPORT;if(o){const e=parseInt(o,10);isNaN(e)||(t.transport=e)}const i=process.env.XBIND_TIMEOUT_DEFAULT;if(i){const e=parseInt(i,10);isNaN(e)||(t.default=e)}return new TimeoutConfig(t)}exports.OperationTimeoutController=OperationTimeoutController,exports.globalTimeoutConfig=createTimeoutConfigFromEnv();
@@ -0,0 +1 @@
1
+ "use strict";var TraceFlags;Object.defineProperty(exports,"__esModule",{value:!0}),exports.TraceContext=exports.TraceFlags=exports.TRACE_VERSION=exports.TRACESTATE_HEADER=exports.TRACEPARENT_HEADER=void 0,exports.generateTraceId=generateTraceId,exports.generateSpanId=generateSpanId,exports.validateTraceId=validateTraceId,exports.validateSpanId=validateSpanId,exports.parseTraceparent=parseTraceparent,exports.parseTracestate=parseTracestate,exports.TRACEPARENT_HEADER="traceparent",exports.TRACESTATE_HEADER="tracestate",exports.TRACE_VERSION="00",function(t){t[t.NONE=0]="NONE",t[t.SAMPLED=1]="SAMPLED"}(TraceFlags||(exports.TraceFlags=TraceFlags={}));class TraceContext{version;traceId;parentId;traceFlags;traceState;constructor(t,e,r=TraceFlags.SAMPLED,a=[]){if(!validateTraceId(t))throw new Error(`Invalid trace ID: ${t}. Must be 32 hex characters.`);if(!validateSpanId(e))throw new Error(`Invalid parent ID: ${e}. Must be 16 hex characters.`);if(r<0||r>255)throw new Error(`Invalid trace flags: ${r}. Must be 0-255.`);this.version=exports.TRACE_VERSION,this.traceId=t,this.parentId=e,this.traceFlags=r,this.traceState=a}static create(t=!0){const e=generateTraceId(),r=generateSpanId(),a=t?TraceFlags.SAMPLED:TraceFlags.NONE;return new TraceContext(e,r,a)}static extract(t){const e=t instanceof Headers?t.get(exports.TRACEPARENT_HEADER):t[exports.TRACEPARENT_HEADER];if(!e)return null;const r=parseTraceparent(e);if(!r)return null;const a=t instanceof Headers?t.get(exports.TRACESTATE_HEADER):t[exports.TRACESTATE_HEADER],n=a?parseTracestate(a):[];return new TraceContext(r.traceId,r.parentId,r.traceFlags,n)}inject(t){const e=this.toTraceparent();return t instanceof Headers?(t.set(exports.TRACEPARENT_HEADER,e),this.traceState.length>0&&t.set(exports.TRACESTATE_HEADER,this.toTracestate())):(t[exports.TRACEPARENT_HEADER]=e,this.traceState.length>0&&(t[exports.TRACESTATE_HEADER]=this.toTracestate())),t}createChild(t){const e=generateSpanId(),r=void 0!==t?t?TraceFlags.SAMPLED:TraceFlags.NONE:this.traceFlags;return new TraceContext(this.traceId,e,r,this.traceState)}toTraceparent(){const t=this.traceFlags.toString(16).padStart(2,"0");return`${this.version}-${this.traceId}-${this.parentId}-${t}`}toTracestate(){return this.traceState.map(({key:t,value:e})=>`${t}=${e}`).join(",")}isSampled(){return(this.traceFlags&TraceFlags.SAMPLED)===TraceFlags.SAMPLED}withTracestate(t,e){const r=this.traceState.filter(e=>e.key!==t);return r.unshift({key:t,value:e}),new TraceContext(this.traceId,this.parentId,this.traceFlags,r)}getTracestate(t){const e=this.traceState.find(e=>e.key===t);return e?.value}toObject(){return{version:this.version,traceId:this.traceId,parentId:this.parentId,traceFlags:this.traceFlags,traceState:[...this.traceState],sampled:this.isSampled()}}}function generateTraceId(){return generateRandomHex(32)}function generateSpanId(){return generateRandomHex(16)}function validateTraceId(t){return"string"==typeof t&&(32===t.length&&(!!/^[a-f0-9]{32}$/.test(t)&&"00000000000000000000000000000000"!==t))}function validateSpanId(t){return"string"==typeof t&&(16===t.length&&(!!/^[a-f0-9]{16}$/.test(t)&&"0000000000000000"!==t))}function parseTraceparent(t){if("string"!=typeof t)return null;const e=t.split("-");if(4!==e.length)return null;const[r,a,n,s]=e;if("00"!==r)return null;if(!validateTraceId(a??""))return null;if(!validateSpanId(n??""))return null;if(!s||2!==s.length)return null;if(!/^[a-f0-9]{2}$/.test(s))return null;return{version:r??"00",traceId:a??"",parentId:n??"",traceFlags:parseInt(s,16)}}function parseTracestate(t){if(!t)return[];const e=[],r=t.split(",");for(const t of r){const r=t.trim(),a=r.indexOf("=");if(-1===a)continue;const n=r.substring(0,a).trim(),s=r.substring(a+1).trim();n&&s&&e.push({key:n,value:s})}return e}function generateRandomHex(t){const e=Math.ceil(t/2);if("undefined"!=typeof crypto&&crypto.getRandomValues){const r=new Uint8Array(e);return crypto.getRandomValues(r),Array.from(r).map(t=>t.toString(16).padStart(2,"0")).join("").substring(0,t)}try{return require("node:crypto").randomBytes(e).toString("hex").substring(0,t)}catch{throw new Error("Cryptographic random generation unavailable. Install crypto polyfill or use environment with crypto support.")}}exports.TraceContext=TraceContext;
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.SpanRecorder=exports.TraceSpan=exports.SpanKind=exports.SpanStatusCode=void 0,exports.measureAsync=measureAsync,exports.measureSync=measureSync;const trace_context_js_1=require("./trace-context.js");var SpanStatusCode,SpanKind;!function(t){t[t.OK=0]="OK",t[t.ERROR=1]="ERROR",t[t.UNSET=2]="UNSET"}(SpanStatusCode||(exports.SpanStatusCode=SpanStatusCode={})),function(t){t[t.INTERNAL=0]="INTERNAL",t[t.SERVER=1]="SERVER",t[t.CLIENT=2]="CLIENT",t[t.PRODUCER=3]="PRODUCER",t[t.CONSUMER=4]="CONSUMER"}(SpanKind||(exports.SpanKind=SpanKind={}));class TraceSpan{spanId;traceContext;name;kind;parentSpanId;startTime;endTime;status;attributes;events;ended;constructor(t,e,n={}){this.spanId=(0,trace_context_js_1.generateSpanId)(),this.traceContext=e,this.name=t,this.kind=n.kind??SpanKind.INTERNAL,this.parentSpanId=n.parentSpanId,this.startTime=Date.now(),this.status={code:SpanStatusCode.UNSET},this.attributes=n.attributes??{},this.events=[],this.ended=!1}setAttribute(t,e){if(this.ended)throw new Error("Cannot set attribute on ended span");return this.attributes[t]=e,this}setAttributes(t){if(this.ended)throw new Error("Cannot set attributes on ended span");return Object.assign(this.attributes,t),this}addEvent(t,e){if(this.ended)throw new Error("Cannot add event to ended span");return this.events.push({name:t,timestamp:Date.now(),attributes:e}),this}setStatus(t,e){if(this.ended)throw new Error("Cannot set status on ended span");return this.status={code:t,message:e},this}recordException(t){if(this.ended)throw new Error("Cannot record exception on ended span");this.setStatus(SpanStatusCode.ERROR);const e={};return t instanceof Error?(e["exception.type"]=t.name,e["exception.message"]=t.message,t.stack&&(e["exception.stacktrace"]=t.stack)):e["exception.message"]=String(t),this.addEvent("exception",e),this}end(t){this.ended||(this.endTime=t??Date.now(),this.ended=!0,this.status.code===SpanStatusCode.UNSET&&(this.status={code:SpanStatusCode.OK}))}isEnded(){return this.ended}getDuration(){return this.ended&&this.endTime?this.endTime-this.startTime:null}toData(){if(!this.ended||!this.endTime)throw new Error("Cannot export data from active span. Call end() first.");return{spanId:this.spanId,traceId:this.traceContext.traceId,parentSpanId:this.parentSpanId,name:this.name,kind:this.kind,startTime:this.startTime,endTime:this.endTime,duration:this.endTime-this.startTime,status:{...this.status},attributes:{...this.attributes},events:this.events.map(t=>({name:t.name,timestamp:t.timestamp,attributes:t.attributes?{...t.attributes}:void 0}))}}createChild(t,e={}){return new TraceSpan(t,this.traceContext,{...e,parentSpanId:this.spanId})}}exports.TraceSpan=TraceSpan;class SpanRecorder{activeSpans;completedSpans;maxSpans;rootContext;constructor(t={}){this.activeSpans=new Map,this.completedSpans=[],this.maxSpans=t.maxSpans??1e3,this.rootContext=t.traceContext}startSpan(t,e={}){const n=e.traceContext??e.parentSpan?.traceContext??this.rootContext??trace_context_js_1.TraceContext.create(),s=new TraceSpan(t,n,{kind:e.kind,attributes:e.attributes,parentSpanId:e.parentSpan?.spanId});this.activeSpans.set(s.spanId,s);const a=setTimeout(()=>{s.isEnded()||(s.setStatus(SpanStatusCode.ERROR,"Span not ended (auto-ended by recorder)"),this.endSpan(s))},6e4),r=s.end.bind(s);return s.end=t=>{clearTimeout(a),r(t),this.endSpan(s)},s}endSpan(t){t.isEnded()||t.end(),this.activeSpans.delete(t.spanId);const e=t.toData();this.completedSpans.push(e),this.completedSpans.length>this.maxSpans&&this.completedSpans.shift()}getCompletedSpans(){return[...this.completedSpans]}getActiveSpans(){return Array.from(this.activeSpans.values())}clearCompletedSpans(){this.completedSpans=[]}getSpanCount(){return{active:this.activeSpans.size,completed:this.completedSpans.length}}findSpansByTraceId(t){return this.completedSpans.filter(e=>e.traceId===t)}buildTraceTree(t){const e=this.findSpansByTraceId(t);if(0===e.length)return null;const n=e.find(t=>!t.parentSpanId);return n?buildSpanTreeNode(n,e):null}}function buildSpanTreeNode(t,e){const n=e.filter(e=>e.parentSpanId===t.spanId).map(t=>buildSpanTreeNode(t,e));return{span:t,children:n}}async function measureAsync(t,e,n,s){const a=t.startSpan(e,s);try{const t=await n();return a.setStatus(SpanStatusCode.OK),t}catch(t){throw a.recordException(t),t}finally{a.end()}}function measureSync(t,e,n,s){const a=t.startSpan(e,s);try{const t=n();return a.setStatus(SpanStatusCode.OK),t}catch(t){throw a.recordException(t),t}finally{a.end()}}exports.SpanRecorder=SpanRecorder;
@@ -1,63 +1 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.HttpsTransportAdapter = void 0;
4
- const shared_1 = require("../_deps/shared/index.js");
5
- /**
6
- * HTTPS transport adapter — sends envelopes as JSON POST requests.
7
- *
8
- * Recipient URL resolved as: baseUrl/deliver/{recipientDid}
9
- * This is the SDK's default transport for server-to-server delivery.
10
- */
11
- class HttpsTransportAdapter {
12
- baseUrl;
13
- timeoutMs;
14
- fetchFn;
15
- handlers = [];
16
- constructor(opts) {
17
- this.baseUrl = opts.baseUrl.replace(/\/$/, '');
18
- this.timeoutMs = opts.timeoutMs ?? 10_000;
19
- this.fetchFn = opts.fetch ?? globalThis.fetch.bind(globalThis);
20
- }
21
- async send(envelope, recipientDid) {
22
- const url = `${this.baseUrl}/deliver/${encodeURIComponent(recipientDid)}`;
23
- try {
24
- const controller = new AbortController();
25
- const timer = setTimeout(() => controller.abort(), this.timeoutMs);
26
- const response = await this.fetchFn(url, {
27
- method: 'POST',
28
- headers: { 'Content-Type': 'application/json' },
29
- body: JSON.stringify(envelope),
30
- signal: controller.signal,
31
- });
32
- clearTimeout(timer);
33
- if (!response.ok) {
34
- return (0, shared_1.err)(response.status === 404
35
- ? 'RECIPIENT_UNREACHABLE'
36
- : 'SEND_FAILED');
37
- }
38
- return (0, shared_1.ok)(undefined);
39
- }
40
- catch (e) {
41
- if (e instanceof DOMException && e.name === 'AbortError') {
42
- return (0, shared_1.err)('TIMEOUT');
43
- }
44
- return (0, shared_1.err)('NETWORK_ERROR');
45
- }
46
- }
47
- onReceive(handler) {
48
- this.handlers.push(handler);
49
- }
50
- /**
51
- * Dispatch a received envelope to all handlers.
52
- * Called by the server when an incoming POST is received.
53
- */
54
- dispatch(envelope) {
55
- for (const handler of this.handlers) {
56
- handler(envelope);
57
- }
58
- }
59
- dispose() {
60
- this.handlers = [];
61
- }
62
- }
63
- exports.HttpsTransportAdapter = HttpsTransportAdapter;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.HttpsTransportAdapter=void 0;const shared_1=require("../_deps/shared/index.js");class HttpsTransportAdapter{baseUrl;timeoutMs;fetchFn;handlers=[];constructor(e){this.baseUrl=e.baseUrl.replace(/\/$/,""),this.timeoutMs=e.timeoutMs??1e4,this.fetchFn=e.fetch??globalThis.fetch.bind(globalThis)}async send(e,t){const s=`${this.baseUrl}/deliver/${encodeURIComponent(t)}`;try{const t=new AbortController,r=setTimeout(()=>t.abort(),this.timeoutMs),o=await this.fetchFn(s,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e),signal:t.signal});return clearTimeout(r),o.ok?(0,shared_1.ok)(void 0):(0,shared_1.err)(404===o.status?"RECIPIENT_UNREACHABLE":"SEND_FAILED")}catch(e){return e instanceof DOMException&&"AbortError"===e.name?(0,shared_1.err)("TIMEOUT"):(0,shared_1.err)("NETWORK_ERROR")}}onReceive(e){this.handlers.push(e)}dispatch(e){for(const t of this.handlers)t(e)}dispose(){this.handlers=[]}}exports.HttpsTransportAdapter=HttpsTransportAdapter;