@private.me/xbind 3.0.1 → 3.0.2

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 (210) hide show
  1. package/README.md +55 -14
  2. package/dist-standalone/_deps/mldsa-wasm/dist/mldsa.js +1920 -1
  3. package/dist-standalone/_deps/shared/cjs/errors.js +729 -1
  4. package/dist-standalone/_deps/shared/cjs/index.js +463 -1
  5. package/dist-standalone/_deps/shared/cjs/types.js +315 -1
  6. package/dist-standalone/_deps/shared/errors.js +244 -1
  7. package/dist-standalone/_deps/shared/index.js +72 -1
  8. package/dist-standalone/_deps/shared/types.js +86 -1
  9. package/dist-standalone/_deps/ux-helpers/cjs/errors.js +1 -1
  10. package/dist-standalone/_deps/ux-helpers/cjs/index.js +1 -1
  11. package/dist-standalone/_deps/ux-helpers/cjs/pagination.js +1 -1
  12. package/dist-standalone/_deps/ux-helpers/cjs/progress.js +1 -1
  13. package/dist-standalone/_deps/ux-helpers/cjs/search.js +1 -1
  14. package/dist-standalone/_deps/ux-helpers/cjs/types.js +1 -1
  15. package/dist-standalone/_deps/ux-helpers/errors.js +1 -1
  16. package/dist-standalone/_deps/ux-helpers/index.js +1 -1
  17. package/dist-standalone/_deps/ux-helpers/pagination.js +1 -1
  18. package/dist-standalone/_deps/ux-helpers/progress.js +1 -1
  19. package/dist-standalone/_deps/ux-helpers/search.js +1 -1
  20. package/dist-standalone/_deps/xchange/auto-accept.js +1 -1
  21. package/dist-standalone/_deps/xchange/cjs/auto-accept.js +1 -1
  22. package/dist-standalone/_deps/xchange/cjs/errors.js +1 -1
  23. package/dist-standalone/_deps/xchange/cjs/index.js +1 -1
  24. package/dist-standalone/_deps/xchange/cjs/invite-client.js +1 -1
  25. package/dist-standalone/_deps/xchange/cjs/lazy-init.js +1 -1
  26. package/dist-standalone/_deps/xchange/cjs/trust-integration.js +1 -1
  27. package/dist-standalone/_deps/xchange/cjs/xchange.js +1 -1
  28. package/dist-standalone/_deps/xchange/errors.js +1 -1
  29. package/dist-standalone/_deps/xchange/index.js +1 -1
  30. package/dist-standalone/_deps/xchange/invite-client.js +1 -1
  31. package/dist-standalone/_deps/xchange/lazy-init.js +1 -1
  32. package/dist-standalone/_deps/xchange/trust-integration.js +1 -1
  33. package/dist-standalone/_deps/xchange/xchange.js +1 -1
  34. package/dist-standalone/_deps/xregistry/cjs/discovery.js +1 -1
  35. package/dist-standalone/_deps/xregistry/cjs/errors.js +1 -1
  36. package/dist-standalone/_deps/xregistry/cjs/index.js +1 -1
  37. package/dist-standalone/_deps/xregistry/cjs/registry.js +1 -1
  38. package/dist-standalone/_deps/xregistry/cjs/schema.js +1 -1
  39. package/dist-standalone/_deps/xregistry/cjs/types.js +1 -1
  40. package/dist-standalone/_deps/xregistry/discovery.js +1 -1
  41. package/dist-standalone/_deps/xregistry/errors.js +1 -1
  42. package/dist-standalone/_deps/xregistry/index.js +1 -1
  43. package/dist-standalone/_deps/xregistry/registry.js +1 -1
  44. package/dist-standalone/_deps/xregistry/schema.js +1 -1
  45. package/dist-standalone/_deps/xregistry/types.js +1 -1
  46. package/dist-standalone/agent-call.js +659 -1
  47. package/dist-standalone/agent-sdk.js +328 -1
  48. package/dist-standalone/agent.js +1800 -1
  49. package/dist-standalone/approval.js +193 -1
  50. package/dist-standalone/async-iterators.js +382 -1
  51. package/dist-standalone/auth.js +219 -1
  52. package/dist-standalone/auto-accept.js +229 -1
  53. package/dist-standalone/backup-config.js +201 -1
  54. package/dist-standalone/backup.js +326 -1
  55. package/dist-standalone/batch-operations.js +388 -1
  56. package/dist-standalone/cancellation.js +477 -1
  57. package/dist-standalone/checkpoint.js +186 -1
  58. package/dist-standalone/circuit-breaker.js +468 -1
  59. package/dist-standalone/cjs/agent-call.js +701 -1
  60. package/dist-standalone/cjs/agent-sdk.js +332 -1
  61. package/dist-standalone/cjs/agent.js +1837 -1
  62. package/dist-standalone/cjs/approval.js +199 -1
  63. package/dist-standalone/cjs/async-iterators.js +392 -1
  64. package/dist-standalone/cjs/auth.js +225 -1
  65. package/dist-standalone/cjs/auto-accept.js +233 -1
  66. package/dist-standalone/cjs/backup-config.js +207 -1
  67. package/dist-standalone/cjs/backup.js +330 -1
  68. package/dist-standalone/cjs/batch-operations.js +397 -1
  69. package/dist-standalone/cjs/cancellation.js +490 -1
  70. package/dist-standalone/cjs/checkpoint.js +193 -1
  71. package/dist-standalone/cjs/circuit-breaker.js +476 -1
  72. package/dist-standalone/cjs/cli/init.js +492 -1
  73. package/dist-standalone/cjs/config-validation.js +522 -1
  74. package/dist-standalone/cjs/connect.js +312 -1
  75. package/dist-standalone/cjs/connection-pool.js +506 -1
  76. package/dist-standalone/cjs/correlation-id.js +339 -1
  77. package/dist-standalone/cjs/crypto-utils.js +176 -1
  78. package/dist-standalone/cjs/debug-mode.js +534 -1
  79. package/dist-standalone/cjs/did-document.js +101 -1
  80. package/dist-standalone/cjs/did-privateme.js +130 -1
  81. package/dist-standalone/cjs/did-web.js +201 -1
  82. package/dist-standalone/cjs/discovery.js +462 -1
  83. package/dist-standalone/cjs/dual-mode.js +251 -1
  84. package/dist-standalone/cjs/email-templates.js +313 -1
  85. package/dist-standalone/cjs/email-transport.js +239 -1
  86. package/dist-standalone/cjs/envelope.js +538 -1
  87. package/dist-standalone/cjs/errors.js +913 -1
  88. package/dist-standalone/cjs/event-emitter.js +461 -1
  89. package/dist-standalone/cjs/gateway-state.js +55 -1
  90. package/dist-standalone/cjs/gateway-transport.js +120 -1
  91. package/dist-standalone/cjs/graceful-degradation.js +403 -1
  92. package/dist-standalone/cjs/guardrails.js +223 -1
  93. package/dist-standalone/cjs/health-check.js +336 -1
  94. package/dist-standalone/cjs/http-compat.js +272 -1
  95. package/dist-standalone/cjs/http-status-map.js +571 -1
  96. package/dist-standalone/cjs/identity.js +645 -1
  97. package/dist-standalone/cjs/index.js +406 -1
  98. package/dist-standalone/cjs/invitation.js +421 -1
  99. package/dist-standalone/cjs/invite.js +328 -1
  100. package/dist-standalone/cjs/key-agreement.js +335 -1
  101. package/dist-standalone/cjs/lazy-init.js +300 -1
  102. package/dist-standalone/cjs/logger.js +291 -1
  103. package/dist-standalone/cjs/mdns-discovery.js +202 -1
  104. package/dist-standalone/cjs/nonce-store.js +80 -1
  105. package/dist-standalone/cjs/pairing-manager.js +223 -1
  106. package/dist-standalone/cjs/plugin-system.js +264 -1
  107. package/dist-standalone/cjs/plugins/logging.js +168 -1
  108. package/dist-standalone/cjs/plugins/metrics.js +181 -1
  109. package/dist-standalone/cjs/plugins/validation.js +302 -1
  110. package/dist-standalone/cjs/policy.js +320 -1
  111. package/dist-standalone/cjs/progress-callbacks.js +583 -1
  112. package/dist-standalone/cjs/redis-nonce-store.js +76 -1
  113. package/dist-standalone/cjs/registry-middleware.js +50 -1
  114. package/dist-standalone/cjs/retry-strategies.js +544 -1
  115. package/dist-standalone/cjs/retry-transport.js +102 -1
  116. package/dist-standalone/cjs/runtime/browser.js +533 -1
  117. package/dist-standalone/cjs/runtime/edge.js +526 -1
  118. package/dist-standalone/cjs/runtime/react-native.js +394 -1
  119. package/dist-standalone/cjs/security-policy.js +245 -1
  120. package/dist-standalone/cjs/serialization.js +1040 -1
  121. package/dist-standalone/cjs/split-channel.js +225 -1
  122. package/dist-standalone/cjs/subscription-proof.js +230 -1
  123. package/dist-standalone/cjs/succession.js +148 -1
  124. package/dist-standalone/cjs/timeouts.js +412 -1
  125. package/dist-standalone/cjs/trace-context.js +424 -1
  126. package/dist-standalone/cjs/trace-spans.js +495 -1
  127. package/dist-standalone/cjs/transport.js +63 -1
  128. package/dist-standalone/cjs/trust-registry.js +991 -1
  129. package/dist-standalone/cjs/types/error-response.js +56 -1
  130. package/dist-standalone/cjs/vault-auth.js +178 -1
  131. package/dist-standalone/cjs/vault-store-loader.js +194 -1
  132. package/dist-standalone/cjs/verify.js +25 -1
  133. package/dist-standalone/cjs/version-info.js +543 -1
  134. package/dist-standalone/cjs/xfetch.js +340 -1
  135. package/dist-standalone/cli/init.js +455 -1
  136. package/dist-standalone/cli/setup.js +514 -1
  137. package/dist-standalone/cli/types.js +27 -1
  138. package/dist-standalone/cli/xbind.js +148 -1
  139. package/dist-standalone/config-validation.js +513 -1
  140. package/dist-standalone/connect.js +274 -1
  141. package/dist-standalone/connection-pool.js +500 -1
  142. package/dist-standalone/correlation-id.js +326 -1
  143. package/dist-standalone/crypto-utils.js +157 -1
  144. package/dist-standalone/debug-mode.js +510 -1
  145. package/dist-standalone/did-document.js +96 -1
  146. package/dist-standalone/did-privateme.js +121 -1
  147. package/dist-standalone/did-web.js +196 -1
  148. package/dist-standalone/discovery.js +458 -1
  149. package/dist-standalone/dual-mode.js +247 -1
  150. package/dist-standalone/email-templates.js +309 -1
  151. package/dist-standalone/email-transport.js +232 -1
  152. package/dist-standalone/envelope.js +525 -1
  153. package/dist-standalone/errors.js +896 -1
  154. package/dist-standalone/event-emitter.js +456 -1
  155. package/dist-standalone/gateway-state.js +51 -1
  156. package/dist-standalone/gateway-transport.js +116 -1
  157. package/dist-standalone/graceful-degradation.js +396 -1
  158. package/dist-standalone/guardrails.js +216 -1
  159. package/dist-standalone/health-check.js +332 -1
  160. package/dist-standalone/http-compat.js +267 -1
  161. package/dist-standalone/http-status-map.js +561 -1
  162. package/dist-standalone/identity.js +619 -1
  163. package/dist-standalone/index.js +78 -1
  164. package/dist-standalone/invitation.js +415 -1
  165. package/dist-standalone/invite.js +324 -1
  166. package/dist-standalone/key-agreement.js +325 -1
  167. package/dist-standalone/lazy-init.js +295 -1
  168. package/dist-standalone/logger.js +285 -1
  169. package/dist-standalone/mdns-discovery.js +195 -1
  170. package/dist-standalone/nonce-store.js +76 -1
  171. package/dist-standalone/pairing-manager.js +219 -1
  172. package/dist-standalone/plugin-system.js +257 -1
  173. package/dist-standalone/plugins/logging.js +163 -1
  174. package/dist-standalone/plugins/metrics.js +176 -1
  175. package/dist-standalone/plugins/validation.js +297 -1
  176. package/dist-standalone/policy.js +315 -1
  177. package/dist-standalone/progress-callbacks.js +576 -1
  178. package/dist-standalone/redis-nonce-store.js +72 -1
  179. package/dist-standalone/registry-middleware.js +47 -1
  180. package/dist-standalone/retry-strategies.js +534 -1
  181. package/dist-standalone/retry-transport.js +98 -1
  182. package/dist-standalone/runtime/browser.js +516 -1
  183. package/dist-standalone/runtime/edge.js +511 -1
  184. package/dist-standalone/runtime/react-native.js +383 -1
  185. package/dist-standalone/security-policy.js +239 -1
  186. package/dist-standalone/serialization.js +1031 -1
  187. package/dist-standalone/split-channel.js +219 -1
  188. package/dist-standalone/subscription-proof.js +224 -1
  189. package/dist-standalone/succession.js +142 -1
  190. package/dist-standalone/timeouts.js +398 -1
  191. package/dist-standalone/trace-context.js +414 -1
  192. package/dist-standalone/trace-spans.js +488 -1
  193. package/dist-standalone/transport.js +59 -1
  194. package/dist-standalone/trust-registry.js +950 -1
  195. package/dist-standalone/types/error-response.js +52 -1
  196. package/dist-standalone/vault-auth.js +174 -1
  197. package/dist-standalone/vault-store-loader.js +187 -1
  198. package/dist-standalone/verify.js +16 -1
  199. package/dist-standalone/version-info.js +530 -1
  200. package/dist-standalone/xfetch.js +335 -1
  201. package/package.json +4 -13
  202. package/share1.dat +0 -0
  203. package/dist-standalone/_deps/mldsa-wasm/LICENSE +0 -24
  204. package/dist-standalone/_deps/mldsa-wasm/package.json +0 -46
  205. package/dist-standalone/_deps/shared/cjs/package.json +0 -1
  206. package/dist-standalone/_deps/ux-helpers/cjs/package.json +0 -1
  207. package/dist-standalone/_deps/xchange/cjs/package.json +0 -1
  208. package/dist-standalone/_deps/xregistry/cjs/package.json +0 -1
  209. package/dist-standalone/cjs/package.json +0 -3
  210. package/dist-standalone/package.json +0 -10
@@ -1 +1,397 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.BatchOperationError=void 0,exports.batchSend=batchSend,exports.batchReceive=batchReceive,exports.batchRegistryOps=batchRegistryOps,exports.batchResolve=batchResolve,exports.batchGetEntries=batchGetEntries;const shared_1=require("../_deps/shared/index.js"),ux_helpers_1=require("../_deps/ux-helpers/index.js");class BatchOperationError extends Error{summary;constructor(e,t){super(e),this.summary=t,this.name="BatchOperationError"}}async function batchSend(e,t){const r=new ux_helpers_1.ProgressReporter(t.onProgress),n=Date.now(),{messages:s,strategy:o="parallel",concurrency:a=10,continueOnError:c=!0}=t;r.start(`Sending ${s.length} messages (${o} mode)...`);const i=[];if("sequential"===o)for(let t=0;t<s.length;t++){const n=s[t],o=Date.now();r.update(`Sending message ${t+1}/${s.length}...`,t/s.length*100);const a=await e.send(n),u=Date.now()-o;if(i.push({index:t,result:a,durationMs:u}),!c&&!a.ok)break}else if("failfast"===o){const t=s.map((t,r)=>{const s=Date.now();return e.send(t).then(e=>{const t=Date.now()-s;if(!e.ok)throw new BatchOperationError(`Batch send failed at index ${r}: ${e.error}`,createSummary(i,Date.now()-n));return{index:r,result:e,durationMs:t}})});try{const e=await Promise.all(t);i.push(...e)}catch(e){if(e instanceof BatchOperationError)throw e;throw new BatchOperationError("Batch send failed",createSummary(i,Date.now()-n))}}else{const t=chunkArray(s,a);for(let n=0;n<t.length;n++){const s=t[n],o=n*a;r.update(`Processing chunk ${n+1}/${t.length}...`,n/t.length*100);const c=await Promise.all(s.map(async(t,r)=>{const n=o+r,s=Date.now();return{index:n,result:await e.send(t),durationMs:Date.now()-s}}));i.push(...c)}}return r.complete(),createSummary(i,Date.now()-n)}async function batchReceive(e,t){const r=new ux_helpers_1.ProgressReporter(t.onProgress),n=Date.now(),{envelopes:s,receiveOptions:o,strategy:a="parallel",concurrency:c=10,continueOnError:i=!0}=t;r.start(`Receiving ${s.length} envelopes (${a} mode)...`);const u=[];if("sequential"===a)for(let t=0;t<s.length;t++){const n=s[t],a=Date.now();r.update(`Receiving envelope ${t+1}/${s.length}...`,t/s.length*100);const c=await e.receive(n,o),l=Date.now()-a;if(u.push({index:t,result:c,durationMs:l}),!i&&!c.ok)break}else{const t=chunkArray(s,c);for(let n=0;n<t.length;n++){const s=t[n],a=n*c;r.update(`Processing chunk ${n+1}/${t.length}...`,n/t.length*100);const i=await Promise.all(s.map(async(t,r)=>{const n=a+r,s=Date.now();return{index:n,result:await e.receive(t,o),durationMs:Date.now()-s}}));u.push(...i)}}return r.complete(),createSummary(u,Date.now()-n)}async function batchRegistryOps(e,t){const r=new ux_helpers_1.ProgressReporter(t.onProgress),n=Date.now(),{operations:s,atomic:o=!1,strategy:a="parallel",concurrency:c=5}=t;r.start(`Executing ${s.length} registry operations (${o?"atomic":"best-effort"} mode)...`);const i=[];if(o&&r.update("Warning: Atomic mode not fully implemented - using best-effort",10),"sequential"===a)for(let t=0;t<s.length;t++){const n=s[t],a=Date.now();r.update(`Operation ${t+1}/${s.length}: ${n.type} ${n.did}`,t/s.length*100);const c=await executeRegistryOperation(e,n),u=Date.now()-a;if(i.push({index:t,result:c,durationMs:u}),o&&!c.ok)break}else{const t=chunkArray(s,c);for(let n=0;n<t.length;n++){const s=t[n],a=n*c;r.update(`Processing chunk ${n+1}/${t.length}...`,n/t.length*100);const u=await Promise.all(s.map(async(t,r)=>{const n=a+r,s=Date.now();return{index:n,result:await executeRegistryOperation(e,t),durationMs:Date.now()-s}}));if(i.push(...u),o&&u.some(e=>!e.result.ok))break}}return r.complete(),createSummary(i,Date.now()-n)}async function batchResolve(e,t,r){const n=new ux_helpers_1.ProgressReporter(r?.onProgress),s=Date.now(),o=r?.concurrency??10;n.start(`Resolving ${t.length} DIDs...`);const a=[],c=chunkArray(t,o);for(let t=0;t<c.length;t++){const r=c[t],s=t*o;n.update(`Resolving chunk ${t+1}/${c.length}...`,t/c.length*100);const i=await Promise.all(r.map(async(t,r)=>{const n=s+r,o=Date.now();return{index:n,result:await e.resolve(t),durationMs:Date.now()-o}}));a.push(...i)}return n.complete(),createSummary(a,Date.now()-s)}async function batchGetEntries(e,t,r){const n=new ux_helpers_1.ProgressReporter(r?.onProgress),s=Date.now(),o=r?.concurrency??10;n.start(`Fetching ${t.length} registry entries...`);const a=[],c=chunkArray(t,o);for(let t=0;t<c.length;t++){const r=c[t],s=t*o;n.update(`Fetching chunk ${t+1}/${c.length}...`,t/c.length*100);const i=await Promise.all(r.map(async(t,r)=>{const n=s+r,o=Date.now();return{index:n,result:await e.getEntry(t),durationMs:Date.now()-o}}));a.push(...i)}return n.complete(),createSummary(a,Date.now()-s)}async function executeRegistryOperation(e,t){switch(t.type){case"register":{if(!t.params)return(0,shared_1.err)("INVALID_PARAMS");const{publicKey:r,name:n,scopes:s,x25519PublicKey:o,mlKemPublicKey:a,mlDsaPublicKey:c,xchange:i,receiveScopes:u,sdkVersion:l,minEnvelopeVersion:h,maxEnvelopeVersion:p,ttlMs:g}=t.params;return e.register(t.did,r,n,s,o,a,c,i,u,l,h,p,g)}case"revoke":return e.revoke(t.did);case"updateScopes":return t.newScopes&&"updateScopes"in e&&"function"==typeof e.updateScopes?e.updateScopes(t.did,t.newScopes):(0,shared_1.err)("INVALID_PARAMS");default:return(0,shared_1.err)("INVALID_OPERATION")}}function createSummary(e,t){const r=e.filter(e=>e.result.ok).length,n=e.filter(e=>!e.result.ok).length,s=e.length>0?e.reduce((e,t)=>e+t.durationMs,0)/e.length:0;return{total:e.length,succeeded:r,failed:n,results:e,totalDurationMs:t,avgDurationMs:s}}function chunkArray(e,t){const r=[];for(let n=0;n<e.length;n+=t)r.push(e.slice(n,n+t));return r}exports.BatchOperationError=BatchOperationError;
1
+ "use strict";
2
+ /**
3
+ * @module batch-operations
4
+ * Batch operations support for xBind - enhanced API efficiency
5
+ *
6
+ * Provides batch operations for:
7
+ * - Send: Multiple messages in one call (reduces round-trips)
8
+ * - Receive: Batch envelope processing
9
+ * - Registry: Bulk registration/revocation/updates
10
+ *
11
+ * Features:
12
+ * - Atomic semantics where possible (registry operations)
13
+ * - Partial success handling (graceful degradation)
14
+ * - Progress tracking for long-running batches
15
+ * - Performance optimization (parallel processing)
16
+ */
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.BatchOperationError = void 0;
19
+ exports.batchSend = batchSend;
20
+ exports.batchReceive = batchReceive;
21
+ exports.batchRegistryOps = batchRegistryOps;
22
+ exports.batchResolve = batchResolve;
23
+ exports.batchGetEntries = batchGetEntries;
24
+ const shared_1 = require("../_deps/shared/index.js");
25
+ const ux_helpers_1 = require("../_deps/ux-helpers/index.js");
26
+ /**
27
+ * Error thrown when batch operation fails.
28
+ */
29
+ class BatchOperationError extends Error {
30
+ summary;
31
+ constructor(message, summary) {
32
+ super(message);
33
+ this.summary = summary;
34
+ this.name = 'BatchOperationError';
35
+ }
36
+ }
37
+ exports.BatchOperationError = BatchOperationError;
38
+ /* ── Implementation ── */
39
+ /**
40
+ * Batch send multiple messages.
41
+ *
42
+ * Performance optimization: Sends messages in parallel (default) or sequentially.
43
+ * Reduces round-trips for bulk message delivery.
44
+ *
45
+ * @param agent - Agent instance
46
+ * @param options - Batch send options
47
+ * @returns Batch summary with individual results
48
+ *
49
+ * @example
50
+ * ```typescript
51
+ * const agent = await Agent.create({ name: 'sender', registry });
52
+ * const summary = await batchSend(agent, {
53
+ * messages: [
54
+ * { to: 'did:key:abc', payload: { msg: 1 }, scope: 'chat' },
55
+ * { to: 'did:key:def', payload: { msg: 2 }, scope: 'chat' },
56
+ * ],
57
+ * strategy: 'parallel',
58
+ * });
59
+ * console.log(`Sent ${summary.succeeded}/${summary.total} messages`);
60
+ * ```
61
+ */
62
+ async function batchSend(agent, options) {
63
+ const progress = new ux_helpers_1.ProgressReporter(options.onProgress);
64
+ const startTime = Date.now();
65
+ const { messages, strategy = 'parallel', concurrency = 10, continueOnError = true, } = options;
66
+ progress.start(`Sending ${messages.length} messages (${strategy} mode)...`);
67
+ const results = [];
68
+ if (strategy === 'sequential') {
69
+ // Sequential: preserve ordering
70
+ for (let i = 0; i < messages.length; i++) {
71
+ const msg = messages[i];
72
+ const opStart = Date.now();
73
+ progress.update(`Sending message ${i + 1}/${messages.length}...`, (i / messages.length) * 100);
74
+ const result = await agent.send(msg);
75
+ const durationMs = Date.now() - opStart;
76
+ results.push({ index: i, result, durationMs });
77
+ if (!continueOnError && !result.ok) {
78
+ break;
79
+ }
80
+ }
81
+ }
82
+ else if (strategy === 'failfast') {
83
+ // Parallel with fail-fast: stop immediately on first error
84
+ const promises = messages.map((msg, index) => {
85
+ const opStart = Date.now();
86
+ return agent.send(msg).then(result => {
87
+ const durationMs = Date.now() - opStart;
88
+ if (!result.ok) {
89
+ throw new BatchOperationError(`Batch send failed at index ${index}: ${result.error}`, createSummary(results, Date.now() - startTime));
90
+ }
91
+ return { index, result, durationMs };
92
+ });
93
+ });
94
+ try {
95
+ const allResults = await Promise.all(promises);
96
+ results.push(...allResults);
97
+ }
98
+ catch (error) {
99
+ if (error instanceof BatchOperationError) {
100
+ throw error;
101
+ }
102
+ throw new BatchOperationError('Batch send failed', createSummary(results, Date.now() - startTime));
103
+ }
104
+ }
105
+ else {
106
+ // Parallel: process concurrently with controlled concurrency
107
+ const chunks = chunkArray(messages, concurrency);
108
+ for (let chunkIndex = 0; chunkIndex < chunks.length; chunkIndex++) {
109
+ const chunk = chunks[chunkIndex];
110
+ const baseIndex = chunkIndex * concurrency;
111
+ progress.update(`Processing chunk ${chunkIndex + 1}/${chunks.length}...`, (chunkIndex / chunks.length) * 100);
112
+ const chunkResults = await Promise.all(chunk.map(async (msg, offset) => {
113
+ const index = baseIndex + offset;
114
+ const opStart = Date.now();
115
+ const result = await agent.send(msg);
116
+ const durationMs = Date.now() - opStart;
117
+ return { index, result, durationMs };
118
+ }));
119
+ results.push(...chunkResults);
120
+ }
121
+ }
122
+ progress.complete();
123
+ return createSummary(results, Date.now() - startTime);
124
+ }
125
+ /**
126
+ * Batch receive multiple envelopes.
127
+ *
128
+ * Performance optimization: Processes envelopes in parallel (default).
129
+ * Useful for bulk message ingestion from queues or webhooks.
130
+ *
131
+ * @param agent - Agent instance
132
+ * @param options - Batch receive options
133
+ * @returns Batch summary with individual results
134
+ *
135
+ * @example
136
+ * ```typescript
137
+ * const agent = await Agent.create({ name: 'receiver', registry });
138
+ * const summary = await batchReceive(agent, {
139
+ * envelopes: incomingEnvelopes,
140
+ * strategy: 'parallel',
141
+ * });
142
+ * console.log(`Processed ${summary.succeeded}/${summary.total} envelopes`);
143
+ * ```
144
+ */
145
+ async function batchReceive(agent, options) {
146
+ const progress = new ux_helpers_1.ProgressReporter(options.onProgress);
147
+ const startTime = Date.now();
148
+ const { envelopes, receiveOptions, strategy = 'parallel', concurrency = 10, continueOnError = true, } = options;
149
+ progress.start(`Receiving ${envelopes.length} envelopes (${strategy} mode)...`);
150
+ const results = [];
151
+ if (strategy === 'sequential') {
152
+ // Sequential: preserve ordering
153
+ for (let i = 0; i < envelopes.length; i++) {
154
+ const envelope = envelopes[i];
155
+ const opStart = Date.now();
156
+ progress.update(`Receiving envelope ${i + 1}/${envelopes.length}...`, (i / envelopes.length) * 100);
157
+ const result = await agent.receive(envelope, receiveOptions);
158
+ const durationMs = Date.now() - opStart;
159
+ results.push({ index: i, result, durationMs });
160
+ if (!continueOnError && !result.ok) {
161
+ break;
162
+ }
163
+ }
164
+ }
165
+ else {
166
+ // Parallel: process concurrently with controlled concurrency
167
+ const chunks = chunkArray(envelopes, concurrency);
168
+ for (let chunkIndex = 0; chunkIndex < chunks.length; chunkIndex++) {
169
+ const chunk = chunks[chunkIndex];
170
+ const baseIndex = chunkIndex * concurrency;
171
+ progress.update(`Processing chunk ${chunkIndex + 1}/${chunks.length}...`, (chunkIndex / chunks.length) * 100);
172
+ const chunkResults = await Promise.all(chunk.map(async (envelope, offset) => {
173
+ const index = baseIndex + offset;
174
+ const opStart = Date.now();
175
+ const result = await agent.receive(envelope, receiveOptions);
176
+ const durationMs = Date.now() - opStart;
177
+ return { index, result, durationMs };
178
+ }));
179
+ results.push(...chunkResults);
180
+ }
181
+ }
182
+ progress.complete();
183
+ return createSummary(results, Date.now() - startTime);
184
+ }
185
+ /**
186
+ * Batch registry operations (register, revoke, updateScopes).
187
+ *
188
+ * Performance optimization: Groups operations by type for efficient processing.
189
+ * Atomic semantics: When atomic=true, all operations succeed or all fail.
190
+ *
191
+ * @param registry - Trust registry instance
192
+ * @param options - Batch registry options
193
+ * @returns Batch summary with individual results
194
+ *
195
+ * @example
196
+ * ```typescript
197
+ * const summary = await batchRegistryOps(registry, {
198
+ * operations: [
199
+ * { type: 'register', did: 'did:key:abc', params: { publicKey, name: 'Alice' } },
200
+ * { type: 'revoke', did: 'did:key:old' },
201
+ * ],
202
+ * atomic: false, // best-effort mode
203
+ * });
204
+ * console.log(`Completed ${summary.succeeded}/${summary.total} operations`);
205
+ * ```
206
+ */
207
+ async function batchRegistryOps(registry, options) {
208
+ const progress = new ux_helpers_1.ProgressReporter(options.onProgress);
209
+ const startTime = Date.now();
210
+ const { operations, atomic = false, strategy = 'parallel', concurrency = 5, } = options;
211
+ progress.start(`Executing ${operations.length} registry operations (${atomic ? 'atomic' : 'best-effort'} mode)...`);
212
+ const results = [];
213
+ // Atomic mode: execute all or rollback (not implemented in base TrustRegistry)
214
+ // This is a placeholder for future transaction support
215
+ if (atomic) {
216
+ progress.update('Warning: Atomic mode not fully implemented - using best-effort', 10);
217
+ }
218
+ if (strategy === 'sequential') {
219
+ // Sequential: preserve ordering
220
+ for (let i = 0; i < operations.length; i++) {
221
+ const op = operations[i];
222
+ const opStart = Date.now();
223
+ progress.update(`Operation ${i + 1}/${operations.length}: ${op.type} ${op.did}`, (i / operations.length) * 100);
224
+ const result = await executeRegistryOperation(registry, op);
225
+ const durationMs = Date.now() - opStart;
226
+ results.push({ index: i, result, durationMs });
227
+ if (atomic && !result.ok) {
228
+ // TODO: Rollback previous operations
229
+ break;
230
+ }
231
+ }
232
+ }
233
+ else {
234
+ // Parallel: process concurrently with controlled concurrency
235
+ const chunks = chunkArray(operations, concurrency);
236
+ for (let chunkIndex = 0; chunkIndex < chunks.length; chunkIndex++) {
237
+ const chunk = chunks[chunkIndex];
238
+ const baseIndex = chunkIndex * concurrency;
239
+ progress.update(`Processing chunk ${chunkIndex + 1}/${chunks.length}...`, (chunkIndex / chunks.length) * 100);
240
+ const chunkResults = await Promise.all(chunk.map(async (op, offset) => {
241
+ const index = baseIndex + offset;
242
+ const opStart = Date.now();
243
+ const result = await executeRegistryOperation(registry, op);
244
+ const durationMs = Date.now() - opStart;
245
+ return { index, result, durationMs };
246
+ }));
247
+ results.push(...chunkResults);
248
+ if (atomic && chunkResults.some(r => !r.result.ok)) {
249
+ // TODO: Rollback all operations
250
+ break;
251
+ }
252
+ }
253
+ }
254
+ progress.complete();
255
+ return createSummary(results, Date.now() - startTime);
256
+ }
257
+ /**
258
+ * Batch resolve multiple DIDs.
259
+ *
260
+ * Performance optimization: Resolves DIDs in parallel.
261
+ * Useful for resolving recipient keys before bulk message sending.
262
+ *
263
+ * @param registry - Trust registry instance
264
+ * @param dids - DIDs to resolve
265
+ * @param options - Optional progress callback and concurrency
266
+ * @returns Batch summary with resolution results
267
+ *
268
+ * @example
269
+ * ```typescript
270
+ * const summary = await batchResolve(registry, [
271
+ * 'did:key:abc',
272
+ * 'did:key:def',
273
+ * 'did:key:ghi',
274
+ * ]);
275
+ * const keys = summary.results
276
+ * .filter(r => r.result.ok)
277
+ * .map(r => r.result.value);
278
+ * ```
279
+ */
280
+ async function batchResolve(registry, dids, options) {
281
+ const progress = new ux_helpers_1.ProgressReporter(options?.onProgress);
282
+ const startTime = Date.now();
283
+ const concurrency = options?.concurrency ?? 10;
284
+ progress.start(`Resolving ${dids.length} DIDs...`);
285
+ const results = [];
286
+ const chunks = chunkArray(dids, concurrency);
287
+ for (let chunkIndex = 0; chunkIndex < chunks.length; chunkIndex++) {
288
+ const chunk = chunks[chunkIndex];
289
+ const baseIndex = chunkIndex * concurrency;
290
+ progress.update(`Resolving chunk ${chunkIndex + 1}/${chunks.length}...`, (chunkIndex / chunks.length) * 100);
291
+ const chunkResults = await Promise.all(chunk.map(async (did, offset) => {
292
+ const index = baseIndex + offset;
293
+ const opStart = Date.now();
294
+ const result = await registry.resolve(did);
295
+ const durationMs = Date.now() - opStart;
296
+ return { index, result, durationMs };
297
+ }));
298
+ results.push(...chunkResults);
299
+ }
300
+ progress.complete();
301
+ return createSummary(results, Date.now() - startTime);
302
+ }
303
+ /**
304
+ * Batch get registry entries.
305
+ *
306
+ * Performance optimization: Fetches entries in parallel.
307
+ * Returns full registry metadata for multiple DIDs.
308
+ *
309
+ * @param registry - Trust registry instance
310
+ * @param dids - DIDs to fetch
311
+ * @param options - Optional progress callback and concurrency
312
+ * @returns Batch summary with entry results
313
+ *
314
+ * @example
315
+ * ```typescript
316
+ * const summary = await batchGetEntries(registry, dids);
317
+ * const entries = summary.results
318
+ * .filter(r => r.result.ok)
319
+ * .map(r => r.result.value);
320
+ * ```
321
+ */
322
+ async function batchGetEntries(registry, dids, options) {
323
+ const progress = new ux_helpers_1.ProgressReporter(options?.onProgress);
324
+ const startTime = Date.now();
325
+ const concurrency = options?.concurrency ?? 10;
326
+ progress.start(`Fetching ${dids.length} registry entries...`);
327
+ const results = [];
328
+ const chunks = chunkArray(dids, concurrency);
329
+ for (let chunkIndex = 0; chunkIndex < chunks.length; chunkIndex++) {
330
+ const chunk = chunks[chunkIndex];
331
+ const baseIndex = chunkIndex * concurrency;
332
+ progress.update(`Fetching chunk ${chunkIndex + 1}/${chunks.length}...`, (chunkIndex / chunks.length) * 100);
333
+ const chunkResults = await Promise.all(chunk.map(async (did, offset) => {
334
+ const index = baseIndex + offset;
335
+ const opStart = Date.now();
336
+ const result = await registry.getEntry(did);
337
+ const durationMs = Date.now() - opStart;
338
+ return { index, result, durationMs };
339
+ }));
340
+ results.push(...chunkResults);
341
+ }
342
+ progress.complete();
343
+ return createSummary(results, Date.now() - startTime);
344
+ }
345
+ /* ── Helper Functions ── */
346
+ /**
347
+ * Execute a single registry operation.
348
+ */
349
+ async function executeRegistryOperation(registry, op) {
350
+ switch (op.type) {
351
+ case 'register': {
352
+ if (!op.params) {
353
+ return (0, shared_1.err)('INVALID_PARAMS');
354
+ }
355
+ const { publicKey, name, scopes, x25519PublicKey, mlKemPublicKey, mlDsaPublicKey, xchange, receiveScopes, sdkVersion, minEnvelopeVersion, maxEnvelopeVersion, ttlMs } = op.params;
356
+ return registry.register(op.did, publicKey, name, scopes, x25519PublicKey, mlKemPublicKey, mlDsaPublicKey, xchange, receiveScopes, sdkVersion, minEnvelopeVersion, maxEnvelopeVersion, ttlMs);
357
+ }
358
+ case 'revoke':
359
+ return registry.revoke(op.did);
360
+ case 'updateScopes': {
361
+ if (!op.newScopes || !('updateScopes' in registry) || typeof registry.updateScopes !== 'function') {
362
+ return (0, shared_1.err)('INVALID_PARAMS');
363
+ }
364
+ return registry.updateScopes(op.did, op.newScopes);
365
+ }
366
+ default:
367
+ return (0, shared_1.err)('INVALID_OPERATION');
368
+ }
369
+ }
370
+ /**
371
+ * Create batch summary from results.
372
+ */
373
+ function createSummary(results, totalDurationMs) {
374
+ const succeeded = results.filter(r => r.result.ok).length;
375
+ const failed = results.filter(r => !r.result.ok).length;
376
+ const avgDurationMs = results.length > 0
377
+ ? results.reduce((sum, r) => sum + r.durationMs, 0) / results.length
378
+ : 0;
379
+ return {
380
+ total: results.length,
381
+ succeeded,
382
+ failed,
383
+ results,
384
+ totalDurationMs,
385
+ avgDurationMs,
386
+ };
387
+ }
388
+ /**
389
+ * Split array into chunks of specified size.
390
+ */
391
+ function chunkArray(array, size) {
392
+ const chunks = [];
393
+ for (let i = 0; i < array.length; i += size) {
394
+ chunks.push(array.slice(i, i + size));
395
+ }
396
+ return chunks;
397
+ }