@contextvm/sdk 0.11.7 → 0.11.9

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 (89) hide show
  1. package/dist/esm/core/utils/base64.d.ts +3 -0
  2. package/dist/esm/core/utils/base64.d.ts.map +1 -0
  3. package/dist/esm/core/utils/base64.js +24 -0
  4. package/dist/esm/core/utils/base64.js.map +1 -0
  5. package/dist/esm/payments/handlers/ln-bolt11-lnbits-payment-handler.d.ts.map +1 -1
  6. package/dist/esm/payments/handlers/ln-bolt11-lnbits-payment-handler.js +2 -1
  7. package/dist/esm/payments/handlers/ln-bolt11-lnbits-payment-handler.js.map +1 -1
  8. package/dist/esm/payments/processors/ln-bolt11-lnbits-payment-processor.d.ts.map +1 -1
  9. package/dist/esm/payments/processors/ln-bolt11-lnbits-payment-processor.js +2 -1
  10. package/dist/esm/payments/processors/ln-bolt11-lnbits-payment-processor.js.map +1 -1
  11. package/dist/esm/transport/capability-negotiator.d.ts +141 -0
  12. package/dist/esm/transport/capability-negotiator.d.ts.map +1 -0
  13. package/dist/esm/transport/capability-negotiator.js +198 -0
  14. package/dist/esm/transport/capability-negotiator.js.map +1 -0
  15. package/dist/esm/transport/middleware.d.ts +9 -0
  16. package/dist/esm/transport/middleware.d.ts.map +1 -0
  17. package/dist/esm/transport/middleware.js +2 -0
  18. package/dist/esm/transport/middleware.js.map +1 -0
  19. package/dist/esm/transport/nostr-client/event-pipeline.d.ts +29 -0
  20. package/dist/esm/transport/nostr-client/event-pipeline.d.ts.map +1 -0
  21. package/dist/esm/transport/nostr-client/event-pipeline.js +109 -0
  22. package/dist/esm/transport/nostr-client/event-pipeline.js.map +1 -0
  23. package/dist/esm/transport/nostr-client/inbound-coordinator.d.ts +37 -0
  24. package/dist/esm/transport/nostr-client/inbound-coordinator.d.ts.map +1 -0
  25. package/dist/esm/transport/nostr-client/inbound-coordinator.js +159 -0
  26. package/dist/esm/transport/nostr-client/inbound-coordinator.js.map +1 -0
  27. package/dist/esm/transport/nostr-client/inbound-notification-dispatcher.d.ts +28 -0
  28. package/dist/esm/transport/nostr-client/inbound-notification-dispatcher.d.ts.map +1 -0
  29. package/dist/esm/transport/nostr-client/inbound-notification-dispatcher.js +65 -0
  30. package/dist/esm/transport/nostr-client/inbound-notification-dispatcher.js.map +1 -0
  31. package/dist/esm/transport/nostr-client/open-stream-factory.d.ts +36 -0
  32. package/dist/esm/transport/nostr-client/open-stream-factory.d.ts.map +1 -0
  33. package/dist/esm/transport/nostr-client/open-stream-factory.js +126 -0
  34. package/dist/esm/transport/nostr-client/open-stream-factory.js.map +1 -0
  35. package/dist/esm/transport/nostr-client/outbound-sender.d.ts +45 -0
  36. package/dist/esm/transport/nostr-client/outbound-sender.d.ts.map +1 -0
  37. package/dist/esm/transport/nostr-client/outbound-sender.js +105 -0
  38. package/dist/esm/transport/nostr-client/outbound-sender.js.map +1 -0
  39. package/dist/esm/transport/nostr-client/server-metadata-store.d.ts +35 -0
  40. package/dist/esm/transport/nostr-client/server-metadata-store.d.ts.map +1 -0
  41. package/dist/esm/transport/nostr-client/server-metadata-store.js +107 -0
  42. package/dist/esm/transport/nostr-client/server-metadata-store.js.map +1 -0
  43. package/dist/esm/transport/nostr-client-transport.d.ts +18 -41
  44. package/dist/esm/transport/nostr-client-transport.d.ts.map +1 -1
  45. package/dist/esm/transport/nostr-client-transport.js +117 -553
  46. package/dist/esm/transport/nostr-client-transport.js.map +1 -1
  47. package/dist/esm/transport/nostr-server/correlation-store.d.ts +2 -2
  48. package/dist/esm/transport/nostr-server/correlation-store.d.ts.map +1 -1
  49. package/dist/esm/transport/nostr-server/correlation-store.js +12 -3
  50. package/dist/esm/transport/nostr-server/correlation-store.js.map +1 -1
  51. package/dist/esm/transport/nostr-server/event-pipeline.d.ts +32 -0
  52. package/dist/esm/transport/nostr-server/event-pipeline.d.ts.map +1 -0
  53. package/dist/esm/transport/nostr-server/event-pipeline.js +118 -0
  54. package/dist/esm/transport/nostr-server/event-pipeline.js.map +1 -0
  55. package/dist/esm/transport/nostr-server/inbound-coordinator.d.ts +56 -0
  56. package/dist/esm/transport/nostr-server/inbound-coordinator.d.ts.map +1 -0
  57. package/dist/esm/transport/nostr-server/inbound-coordinator.js +168 -0
  58. package/dist/esm/transport/nostr-server/inbound-coordinator.js.map +1 -0
  59. package/dist/esm/transport/nostr-server/inbound-notification-dispatcher.d.ts +44 -0
  60. package/dist/esm/transport/nostr-server/inbound-notification-dispatcher.d.ts.map +1 -0
  61. package/dist/esm/transport/nostr-server/inbound-notification-dispatcher.js +153 -0
  62. package/dist/esm/transport/nostr-server/inbound-notification-dispatcher.js.map +1 -0
  63. package/dist/esm/transport/nostr-server/open-stream-factory.d.ts +81 -0
  64. package/dist/esm/transport/nostr-server/open-stream-factory.d.ts.map +1 -0
  65. package/dist/esm/transport/nostr-server/open-stream-factory.js +224 -0
  66. package/dist/esm/transport/nostr-server/open-stream-factory.js.map +1 -0
  67. package/dist/esm/transport/nostr-server/outbound-notification-broadcaster.d.ts +24 -0
  68. package/dist/esm/transport/nostr-server/outbound-notification-broadcaster.d.ts.map +1 -0
  69. package/dist/esm/transport/nostr-server/outbound-notification-broadcaster.js +64 -0
  70. package/dist/esm/transport/nostr-server/outbound-notification-broadcaster.js.map +1 -0
  71. package/dist/esm/transport/nostr-server/outbound-response-router.d.ts +62 -0
  72. package/dist/esm/transport/nostr-server/outbound-response-router.d.ts.map +1 -0
  73. package/dist/esm/transport/nostr-server/outbound-response-router.js +125 -0
  74. package/dist/esm/transport/nostr-server/outbound-response-router.js.map +1 -0
  75. package/dist/esm/transport/nostr-server-transport.d.ts +15 -62
  76. package/dist/esm/transport/nostr-server-transport.d.ts.map +1 -1
  77. package/dist/esm/transport/nostr-server-transport.js +121 -741
  78. package/dist/esm/transport/nostr-server-transport.js.map +1 -1
  79. package/dist/esm/transport/open-stream/registry.d.ts.map +1 -1
  80. package/dist/esm/transport/open-stream/registry.js +7 -1
  81. package/dist/esm/transport/open-stream/registry.js.map +1 -1
  82. package/dist/esm/transport/open-stream/session.d.ts +1 -0
  83. package/dist/esm/transport/open-stream/session.d.ts.map +1 -1
  84. package/dist/esm/transport/open-stream/session.js +14 -4
  85. package/dist/esm/transport/open-stream/session.js.map +1 -1
  86. package/dist/esm/transport/open-stream/writer.d.ts.map +1 -1
  87. package/dist/esm/transport/open-stream/writer.js +6 -12
  88. package/dist/esm/transport/open-stream/writer.js.map +1 -1
  89. package/package.json +1 -1
@@ -0,0 +1,3 @@
1
+ /** Encodes a UTF-8 string as Base64 without relying on Node.js globals. */
2
+ export declare function encodeBase64(value: string): string;
3
+ //# sourceMappingURL=base64.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base64.d.ts","sourceRoot":"","sources":["../../../../src/core/utils/base64.ts"],"names":[],"mappings":"AAKA,2EAA2E;AAC3E,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAqBlD"}
@@ -0,0 +1,24 @@
1
+ const textEncoder = new TextEncoder();
2
+ const base64Alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
3
+ /** Encodes a UTF-8 string as Base64 without relying on Node.js globals. */
4
+ export function encodeBase64(value) {
5
+ var _a, _b, _c, _d, _e, _f, _g;
6
+ const bytes = textEncoder.encode(value);
7
+ let result = '';
8
+ for (let index = 0; index < bytes.length; index += 3) {
9
+ const byte0 = (_a = bytes[index]) !== null && _a !== void 0 ? _a : 0;
10
+ const byte1 = (_b = bytes[index + 1]) !== null && _b !== void 0 ? _b : 0;
11
+ const byte2 = (_c = bytes[index + 2]) !== null && _c !== void 0 ? _c : 0;
12
+ const chunk = (byte0 << 16) | (byte1 << 8) | byte2;
13
+ result += (_d = base64Alphabet[(chunk >> 18) & 0x3f]) !== null && _d !== void 0 ? _d : '';
14
+ result += (_e = base64Alphabet[(chunk >> 12) & 0x3f]) !== null && _e !== void 0 ? _e : '';
15
+ result +=
16
+ index + 1 < bytes.length
17
+ ? ((_f = base64Alphabet[(chunk >> 6) & 0x3f]) !== null && _f !== void 0 ? _f : '')
18
+ : '=';
19
+ result +=
20
+ index + 2 < bytes.length ? ((_g = base64Alphabet[chunk & 0x3f]) !== null && _g !== void 0 ? _g : '') : '=';
21
+ }
22
+ return result;
23
+ }
24
+ //# sourceMappingURL=base64.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base64.js","sourceRoot":"","sources":["../../../../src/core/utils/base64.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC;AAEtC,MAAM,cAAc,GAClB,kEAAkE,CAAC;AAErE,2EAA2E;AAC3E,MAAM,UAAU,YAAY,CAAC,KAAa;;IACxC,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACxC,IAAI,MAAM,GAAG,EAAE,CAAC;IAEhB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACrD,MAAM,KAAK,GAAG,MAAA,KAAK,CAAC,KAAK,CAAC,mCAAI,CAAC,CAAC;QAChC,MAAM,KAAK,GAAG,MAAA,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,mCAAI,CAAC,CAAC;QACpC,MAAM,KAAK,GAAG,MAAA,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,mCAAI,CAAC,CAAC;QACpC,MAAM,KAAK,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC;QAEnD,MAAM,IAAI,MAAA,cAAc,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,mCAAI,EAAE,CAAC;QACrD,MAAM,IAAI,MAAA,cAAc,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,mCAAI,EAAE,CAAC;QACrD,MAAM;YACJ,KAAK,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM;gBACtB,CAAC,CAAC,CAAC,MAAA,cAAc,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,mCAAI,EAAE,CAAC;gBAC7C,CAAC,CAAC,GAAG,CAAC;QACV,MAAM;YACJ,KAAK,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAA,cAAc,CAAC,KAAK,GAAG,IAAI,CAAC,mCAAI,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IAC1E,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"ln-bolt11-lnbits-payment-handler.d.ts","sourceRoot":"","sources":["../../../../src/payments/handlers/ln-bolt11-lnbits-payment-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAGzE,MAAM,WAAW,mCAAmC;IAClD,oEAAoE;IACpE,SAAS,EAAE,MAAM,CAAC;IAClB,gEAAgE;IAChE,cAAc,EAAE,MAAM,CAAC;IACvB,oFAAoF;IACpF,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;;GAIG;AACH,qBAAa,4BAA6B,YAAW,cAAc;IACjE,SAAgB,GAAG,6BAAgC;IAEnD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAS;gBAEvB,OAAO,EAAE,mCAAmC;IAM/D,OAAO,CAAC,YAAY;IAYP,MAAM,CAAC,GAAG,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC;CAuB/D"}
1
+ {"version":3,"file":"ln-bolt11-lnbits-payment-handler.d.ts","sourceRoot":"","sources":["../../../../src/payments/handlers/ln-bolt11-lnbits-payment-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAIzE,MAAM,WAAW,mCAAmC;IAClD,oEAAoE;IACpE,SAAS,EAAE,MAAM,CAAC;IAClB,gEAAgE;IAChE,cAAc,EAAE,MAAM,CAAC;IACvB,oFAAoF;IACpF,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;;GAIG;AACH,qBAAa,4BAA6B,YAAW,cAAc;IACjE,SAAgB,GAAG,6BAAgC;IAEnD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAS;gBAEvB,OAAO,EAAE,mCAAmC;IAM/D,OAAO,CAAC,YAAY;IAYP,MAAM,CAAC,GAAG,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC;CAuB/D"}
@@ -1,4 +1,5 @@
1
1
  import { PMI_BITCOIN_LIGHTNING_BOLT11 } from '../pmis.js';
2
+ import { encodeBase64 } from '../../core/utils/base64.js';
2
3
  /**
3
4
  * CEP-8 client payment handler for PMI `bitcoin-lightning-bolt11` backed by LNbits REST API.
4
5
  *
@@ -17,7 +18,7 @@ export class LnBolt11LnbitsPaymentHandler {
17
18
  'X-Api-Key': this.lnbitsAdminKey,
18
19
  };
19
20
  if (this.lnbitsBasicAuth) {
20
- const encoded = Buffer.from(this.lnbitsBasicAuth).toString('base64');
21
+ const encoded = encodeBase64(this.lnbitsBasicAuth);
21
22
  headers['Authorization'] = `Basic ${encoded}`;
22
23
  }
23
24
  return headers;
@@ -1 +1 @@
1
- {"version":3,"file":"ln-bolt11-lnbits-payment-handler.js","sourceRoot":"","sources":["../../../../src/payments/handlers/ln-bolt11-lnbits-payment-handler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,4BAA4B,EAAE,MAAM,YAAY,CAAC;AAW1D;;;;GAIG;AACH,MAAM,OAAO,4BAA4B;IAOvC,YAAmB,OAA4C;QAN/C,QAAG,GAAG,4BAA4B,CAAC;QAOjD,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACvD,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC;QAC7C,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC;IACjD,CAAC;IAEO,YAAY;QAClB,MAAM,OAAO,GAA2B;YACtC,cAAc,EAAE,kBAAkB;YAClC,WAAW,EAAE,IAAI,CAAC,cAAc;SACjC,CAAC;QACF,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACrE,OAAO,CAAC,eAAe,CAAC,GAAG,SAAS,OAAO,EAAE,CAAC;QAChD,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAEM,KAAK,CAAC,MAAM,CAAC,GAA0B;QAC5C,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,kBAAkB,EAAE;YAChE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE;YAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,GAAG,EAAE,IAAI;gBACT,MAAM,EAAE,GAAG,CAAC,OAAO;aACpB,CAAC;SACH,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,8BAA8B,QAAQ,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC,CAAC;QAC3E,CAAC;QAED,MAAM,MAAM,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAEpC,CAAC;QAEF,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"ln-bolt11-lnbits-payment-handler.js","sourceRoot":"","sources":["../../../../src/payments/handlers/ln-bolt11-lnbits-payment-handler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,4BAA4B,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAW1D;;;;GAIG;AACH,MAAM,OAAO,4BAA4B;IAOvC,YAAmB,OAA4C;QAN/C,QAAG,GAAG,4BAA4B,CAAC;QAOjD,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACvD,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC;QAC7C,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC;IACjD,CAAC;IAEO,YAAY;QAClB,MAAM,OAAO,GAA2B;YACtC,cAAc,EAAE,kBAAkB;YAClC,WAAW,EAAE,IAAI,CAAC,cAAc;SACjC,CAAC;QACF,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YACnD,OAAO,CAAC,eAAe,CAAC,GAAG,SAAS,OAAO,EAAE,CAAC;QAChD,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAEM,KAAK,CAAC,MAAM,CAAC,GAA0B;QAC5C,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,kBAAkB,EAAE;YAChE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE;YAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,GAAG,EAAE,IAAI;gBACT,MAAM,EAAE,GAAG,CAAC,OAAO;aACpB,CAAC;SACH,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,8BAA8B,QAAQ,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC,CAAC;QAC3E,CAAC;QAED,MAAM,MAAM,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAEpC,CAAC;QAEF,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"ln-bolt11-lnbits-payment-processor.d.ts","sourceRoot":"","sources":["../../../../src/payments/processors/ln-bolt11-lnbits-payment-processor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,4BAA4B,EAC5B,4BAA4B,EAC7B,MAAM,aAAa,CAAC;AAKrB,MAAM,WAAW,qCAAqC;IACpD,oEAAoE;IACpE,SAAS,EAAE,MAAM,CAAC;IAClB,sCAAsC;IACtC,YAAY,EAAE,MAAM,CAAC;IACrB,oFAAoF;IACpF,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB,oEAAoE;IACpE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sEAAsE;IACtE,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,4DAA4D;IAC5D,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;;;GAKG;AACH,qBAAa,8BAA+B,YAAW,gBAAgB;IACrE,SAAgB,GAAG,6BAAgC;IAEnD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAS;IAC9C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;gBAEb,OAAO,EAAE,qCAAqC;IAUjE,OAAO,CAAC,YAAY;IAYP,qBAAqB,CAChC,MAAM,EAAE,4BAA4B,GACnC,OAAO,CAAC;QACT,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,GAAG,EAAE,MAAM,CAAC;QACZ,GAAG,CAAC,EAAE,MAAM,CAAC;KACd,CAAC;IA+CW,aAAa,CACxB,MAAM,EAAE,4BAA4B,GACnC,OAAO,CAAC;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC;IA0C/C;;;;OAIG;YACW,yBAAyB;CAoCxC"}
1
+ {"version":3,"file":"ln-bolt11-lnbits-payment-processor.d.ts","sourceRoot":"","sources":["../../../../src/payments/processors/ln-bolt11-lnbits-payment-processor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,4BAA4B,EAC5B,4BAA4B,EAC7B,MAAM,aAAa,CAAC;AAMrB,MAAM,WAAW,qCAAqC;IACpD,oEAAoE;IACpE,SAAS,EAAE,MAAM,CAAC;IAClB,sCAAsC;IACtC,YAAY,EAAE,MAAM,CAAC;IACrB,oFAAoF;IACpF,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB,oEAAoE;IACpE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sEAAsE;IACtE,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,4DAA4D;IAC5D,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;;;GAKG;AACH,qBAAa,8BAA+B,YAAW,gBAAgB;IACrE,SAAgB,GAAG,6BAAgC;IAEnD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAS;IAC9C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;gBAEb,OAAO,EAAE,qCAAqC;IAUjE,OAAO,CAAC,YAAY;IAYP,qBAAqB,CAChC,MAAM,EAAE,4BAA4B,GACnC,OAAO,CAAC;QACT,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,GAAG,EAAE,MAAM,CAAC;QACZ,GAAG,CAAC,EAAE,MAAM,CAAC;KACd,CAAC;IA+CW,aAAa,CACxB,MAAM,EAAE,4BAA4B,GACnC,OAAO,CAAC;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC;IA0C/C;;;;OAIG;YACW,yBAAyB;CAoCxC"}
@@ -1,6 +1,7 @@
1
1
  import { PMI_BITCOIN_LIGHTNING_BOLT11 } from '../pmis.js';
2
2
  import { createLogger } from '../../core/utils/logger.js';
3
3
  import { sleep } from '../../core/utils/utils.js';
4
+ import { encodeBase64 } from '../../core/utils/base64.js';
4
5
  /**
5
6
  * CEP-8 server payment processor for PMI `bitcoin-lightning-bolt11` backed by LNbits REST API.
6
7
  *
@@ -25,7 +26,7 @@ export class LnBolt11LnbitsPaymentProcessor {
25
26
  'X-Api-Key': this.lnbitsApiKey,
26
27
  };
27
28
  if (this.lnbitsBasicAuth) {
28
- const encoded = Buffer.from(this.lnbitsBasicAuth).toString('base64');
29
+ const encoded = encodeBase64(this.lnbitsBasicAuth);
29
30
  headers['Authorization'] = `Basic ${encoded}`;
30
31
  }
31
32
  return headers;
@@ -1 +1 @@
1
- {"version":3,"file":"ln-bolt11-lnbits-payment-processor.js","sourceRoot":"","sources":["../../../../src/payments/processors/ln-bolt11-lnbits-payment-processor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ln-bolt11-lnbits-payment-processor.js","sourceRoot":"","sources":["../../../../src/payments/processors/ln-bolt11-lnbits-payment-processor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,141 @@
1
+ import { EncryptionMode, GiftWrapMode } from '../core/interfaces.js';
2
+ import { type NostrEvent } from 'nostr-tools';
3
+ import { type ClientSession } from './nostr-server/session-store.js';
4
+ /**
5
+ * Result of parsing peer discovery tags.
6
+ */
7
+ export interface DiscoveredPeerCapabilities {
8
+ discoveryTags: string[][];
9
+ supportsEncryption: boolean;
10
+ supportsEphemeralEncryption: boolean;
11
+ supportsOversizedTransfer: boolean;
12
+ supportsOpenStream: boolean;
13
+ }
14
+ /**
15
+ * Capability flags derived from peer discovery tags.
16
+ */
17
+ export interface PeerCapabilities {
18
+ supportsEncryption: boolean;
19
+ supportsEphemeralEncryption: boolean;
20
+ supportsOversizedTransfer: boolean;
21
+ supportsOpenStream: boolean;
22
+ }
23
+ /**
24
+ * Checks if a set of tags contains a specific single-element tag.
25
+ */
26
+ export declare function hasSingleTag(tags: readonly (readonly string[])[], tag: string): boolean;
27
+ /**
28
+ * Checks if an event contains a specific single-element tag.
29
+ */
30
+ export declare function hasEventTag(event: NostrEvent | undefined, tag: string): boolean;
31
+ /**
32
+ * Extracts capability discovery tags (omitting routing/correlation tags).
33
+ */
34
+ export declare function getDiscoveryTags(tags: readonly string[][]): string[][];
35
+ /**
36
+ * Parses raw tags into discovery tags and capability flags.
37
+ */
38
+ export declare function parseDiscoveredPeerCapabilities(tags: readonly string[][]): DiscoveredPeerCapabilities;
39
+ /**
40
+ * Determines capability flags from a list of tags.
41
+ */
42
+ export declare function learnPeerCapabilities(eventTags: readonly (readonly string[])[]): PeerCapabilities;
43
+ /**
44
+ * Manages capability discovery and negotiation for the server transport.
45
+ */
46
+ export declare class ServerCapabilityNegotiator {
47
+ private deps;
48
+ constructor(deps: {
49
+ getCommonTags: () => string[][];
50
+ composeOutboundTags: (params: {
51
+ baseTags: readonly string[][];
52
+ discoveryTags: readonly string[][];
53
+ negotiationTags: readonly string[][];
54
+ }) => string[][];
55
+ giftWrapMode: GiftWrapMode;
56
+ });
57
+ /**
58
+ * Gets pending discovery tags to attach to the next outbound event for a session.
59
+ */
60
+ takePendingDiscoveryTags(session: ClientSession): string[][];
61
+ /**
62
+ * Composes complete outbound tags including base tags, pending discovery, and negotiation tags.
63
+ */
64
+ buildOutboundTags(params: {
65
+ baseTags: readonly string[][];
66
+ session: ClientSession;
67
+ includeDiscovery?: boolean;
68
+ negotiationTags?: readonly string[][];
69
+ }): string[][];
70
+ /**
71
+ * Determines the appropriate gift-wrap kind (persistent or ephemeral) based on peer capabilities and policy.
72
+ */
73
+ chooseOutboundGiftWrapKind(params: {
74
+ session: ClientSession;
75
+ fallbackWrapKind?: number;
76
+ }): number | undefined;
77
+ }
78
+ /**
79
+ * Manages capability discovery and negotiation for the client transport.
80
+ */
81
+ export declare class ClientCapabilityNegotiator {
82
+ private deps;
83
+ private hasSentDiscoveryTags;
84
+ private clientPmis?;
85
+ private serverSupportsEphemeralGiftWraps;
86
+ private _serverInitializeEvent?;
87
+ constructor(deps: {
88
+ encryptionMode: EncryptionMode;
89
+ giftWrapMode: GiftWrapMode;
90
+ oversizedEnabled: boolean;
91
+ openStreamEnabled: boolean;
92
+ composeOutboundTags: (params: {
93
+ baseTags: readonly string[][];
94
+ discoveryTags: readonly string[][];
95
+ negotiationTags: readonly string[][];
96
+ }) => string[][];
97
+ });
98
+ /**
99
+ * Sets Package Manifest Identifiers (PMIs) to include in capability negotiation.
100
+ */
101
+ setClientPmis(pmis: readonly string[]): void;
102
+ /**
103
+ * Updates server capability flags from discovered peer tags.
104
+ * Called by the transport when it learns new capabilities from inbound events.
105
+ */
106
+ learnServerCapabilities(discovered: {
107
+ supportsEphemeralEncryption: boolean;
108
+ }): void;
109
+ /**
110
+ * Records the server's initialize event for gift-wrap kind negotiation.
111
+ */
112
+ setServerInitializeEvent(event: NostrEvent): void;
113
+ /**
114
+ * Gets the base capability tags supported by this client.
115
+ */
116
+ getCapabilityTags(): string[][];
117
+ /**
118
+ * Gets negotiation tags (like PMIs) to include in outbound discovery.
119
+ */
120
+ getNegotiationTags(): string[][];
121
+ /**
122
+ * Gets capability discovery tags if they haven't been sent yet.
123
+ */
124
+ getPendingDiscoveryTags(): string[][];
125
+ /**
126
+ * Composes outbound tags for a request, optionally including discovery.
127
+ */
128
+ buildOutboundTags(params: {
129
+ baseTags: readonly string[][];
130
+ includeDiscovery: boolean;
131
+ }): string[][];
132
+ /**
133
+ * Marks discovery tags as sent to prevent re-sending.
134
+ */
135
+ markDiscoveryTagsSent(): void;
136
+ /**
137
+ * Chooses the appropriate gift-wrap kind based on learned server capabilities.
138
+ */
139
+ chooseOutboundGiftWrapKind(): number;
140
+ }
141
+ //# sourceMappingURL=capability-negotiator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capability-negotiator.d.ts","sourceRoot":"","sources":["../../../src/transport/capability-negotiator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,198 @@
1
+ import { NOSTR_TAGS, EPHEMERAL_GIFT_WRAP_KIND, GIFT_WRAP_KIND, } from '../core/constants.js';
2
+ import { EncryptionMode, GiftWrapMode } from '../core/interfaces.js';
3
+ import { queryTags } from '../core/utils/utils.js';
4
+ const NON_DISCOVERY_TAG_NAMES = new Set(['e', 'p']);
5
+ function cloneTag(tag) {
6
+ return [...tag];
7
+ }
8
+ /**
9
+ * Checks if a set of tags contains a specific single-element tag.
10
+ */
11
+ export function hasSingleTag(tags, tag) {
12
+ return tags.some((t) => t.length === 1 && t[0] === tag);
13
+ }
14
+ /**
15
+ * Checks if an event contains a specific single-element tag.
16
+ */
17
+ export function hasEventTag(event, tag) {
18
+ return Array.isArray(event === null || event === void 0 ? void 0 : event.tags) && hasSingleTag(event.tags, tag);
19
+ }
20
+ /**
21
+ * Extracts capability discovery tags (omitting routing/correlation tags).
22
+ */
23
+ export function getDiscoveryTags(tags) {
24
+ return tags
25
+ .filter((tag) => {
26
+ const tagName = tag[0];
27
+ return (typeof tagName === 'string' && !NON_DISCOVERY_TAG_NAMES.has(tagName));
28
+ })
29
+ .map((tag) => cloneTag(tag));
30
+ }
31
+ /**
32
+ * Parses raw tags into discovery tags and capability flags.
33
+ */
34
+ export function parseDiscoveredPeerCapabilities(tags) {
35
+ const discoveryTags = getDiscoveryTags(tags);
36
+ const capabilities = learnPeerCapabilities(discoveryTags);
37
+ return {
38
+ discoveryTags,
39
+ ...capabilities,
40
+ };
41
+ }
42
+ /**
43
+ * Determines capability flags from a list of tags.
44
+ */
45
+ export function learnPeerCapabilities(eventTags) {
46
+ return {
47
+ supportsEncryption: hasSingleTag(eventTags, NOSTR_TAGS.SUPPORT_ENCRYPTION),
48
+ supportsEphemeralEncryption: hasSingleTag(eventTags, NOSTR_TAGS.SUPPORT_ENCRYPTION_EPHEMERAL),
49
+ supportsOversizedTransfer: hasSingleTag(eventTags, NOSTR_TAGS.SUPPORT_OVERSIZED_TRANSFER),
50
+ supportsOpenStream: hasSingleTag(eventTags, NOSTR_TAGS.SUPPORT_OPEN_STREAM),
51
+ };
52
+ }
53
+ /**
54
+ * Manages capability discovery and negotiation for the server transport.
55
+ */
56
+ export class ServerCapabilityNegotiator {
57
+ constructor(deps) {
58
+ this.deps = deps;
59
+ }
60
+ /**
61
+ * Gets pending discovery tags to attach to the next outbound event for a session.
62
+ */
63
+ takePendingDiscoveryTags(session) {
64
+ if (session.hasSentCommonTags) {
65
+ return [];
66
+ }
67
+ session.hasSentCommonTags = true;
68
+ return this.deps.getCommonTags();
69
+ }
70
+ /**
71
+ * Composes complete outbound tags including base tags, pending discovery, and negotiation tags.
72
+ */
73
+ buildOutboundTags(params) {
74
+ const { baseTags, session, includeDiscovery = true, negotiationTags = [], } = params;
75
+ return this.deps.composeOutboundTags({
76
+ baseTags,
77
+ discoveryTags: includeDiscovery
78
+ ? this.takePendingDiscoveryTags(session)
79
+ : [],
80
+ negotiationTags,
81
+ });
82
+ }
83
+ /**
84
+ * Determines the appropriate gift-wrap kind (persistent or ephemeral) based on peer capabilities and policy.
85
+ */
86
+ chooseOutboundGiftWrapKind(params) {
87
+ const { session, fallbackWrapKind } = params;
88
+ if (!session.isEncrypted)
89
+ return undefined;
90
+ if (this.deps.giftWrapMode === GiftWrapMode.EPHEMERAL)
91
+ return EPHEMERAL_GIFT_WRAP_KIND;
92
+ if (this.deps.giftWrapMode === GiftWrapMode.PERSISTENT)
93
+ return GIFT_WRAP_KIND;
94
+ if (session.supportsEphemeralEncryption)
95
+ return EPHEMERAL_GIFT_WRAP_KIND;
96
+ return fallbackWrapKind;
97
+ }
98
+ }
99
+ /**
100
+ * Manages capability discovery and negotiation for the client transport.
101
+ */
102
+ export class ClientCapabilityNegotiator {
103
+ constructor(deps) {
104
+ this.deps = deps;
105
+ this.hasSentDiscoveryTags = false;
106
+ this.serverSupportsEphemeralGiftWraps = false;
107
+ }
108
+ /**
109
+ * Sets Package Manifest Identifiers (PMIs) to include in capability negotiation.
110
+ */
111
+ setClientPmis(pmis) {
112
+ this.clientPmis = pmis;
113
+ }
114
+ /**
115
+ * Updates server capability flags from discovered peer tags.
116
+ * Called by the transport when it learns new capabilities from inbound events.
117
+ */
118
+ learnServerCapabilities(discovered) {
119
+ this.serverSupportsEphemeralGiftWraps || (this.serverSupportsEphemeralGiftWraps = discovered.supportsEphemeralEncryption);
120
+ }
121
+ /**
122
+ * Records the server's initialize event for gift-wrap kind negotiation.
123
+ */
124
+ setServerInitializeEvent(event) {
125
+ this._serverInitializeEvent = event;
126
+ }
127
+ /**
128
+ * Gets the base capability tags supported by this client.
129
+ */
130
+ getCapabilityTags() {
131
+ const tags = [];
132
+ if (this.deps.encryptionMode !== EncryptionMode.DISABLED) {
133
+ tags.push([NOSTR_TAGS.SUPPORT_ENCRYPTION]);
134
+ }
135
+ if (this.deps.encryptionMode !== EncryptionMode.DISABLED &&
136
+ this.deps.giftWrapMode !== GiftWrapMode.PERSISTENT) {
137
+ tags.push([NOSTR_TAGS.SUPPORT_ENCRYPTION_EPHEMERAL]);
138
+ }
139
+ if (this.deps.oversizedEnabled) {
140
+ tags.push([NOSTR_TAGS.SUPPORT_OVERSIZED_TRANSFER]);
141
+ }
142
+ if (this.deps.openStreamEnabled) {
143
+ tags.push([NOSTR_TAGS.SUPPORT_OPEN_STREAM]);
144
+ }
145
+ return tags;
146
+ }
147
+ /**
148
+ * Gets negotiation tags (like PMIs) to include in outbound discovery.
149
+ */
150
+ getNegotiationTags() {
151
+ const tags = [];
152
+ if (this.clientPmis) {
153
+ tags.push(...this.clientPmis.map((pmi) => ['pmi', pmi]));
154
+ }
155
+ return tags;
156
+ }
157
+ /**
158
+ * Gets capability discovery tags if they haven't been sent yet.
159
+ */
160
+ getPendingDiscoveryTags() {
161
+ return this.hasSentDiscoveryTags ? [] : this.getCapabilityTags();
162
+ }
163
+ /**
164
+ * Composes outbound tags for a request, optionally including discovery.
165
+ */
166
+ buildOutboundTags(params) {
167
+ const { baseTags, includeDiscovery } = params;
168
+ return this.deps.composeOutboundTags({
169
+ baseTags,
170
+ discoveryTags: includeDiscovery ? this.getPendingDiscoveryTags() : [],
171
+ negotiationTags: includeDiscovery ? this.getNegotiationTags() : [],
172
+ });
173
+ }
174
+ /**
175
+ * Marks discovery tags as sent to prevent re-sending.
176
+ */
177
+ markDiscoveryTagsSent() {
178
+ if (this.getPendingDiscoveryTags().length > 0) {
179
+ this.hasSentDiscoveryTags = true;
180
+ }
181
+ }
182
+ /**
183
+ * Chooses the appropriate gift-wrap kind based on learned server capabilities.
184
+ */
185
+ chooseOutboundGiftWrapKind() {
186
+ if (this.deps.giftWrapMode === GiftWrapMode.PERSISTENT)
187
+ return GIFT_WRAP_KIND;
188
+ if (this.deps.giftWrapMode === GiftWrapMode.EPHEMERAL)
189
+ return EPHEMERAL_GIFT_WRAP_KIND;
190
+ if (this.serverSupportsEphemeralGiftWraps)
191
+ return EPHEMERAL_GIFT_WRAP_KIND;
192
+ const supportsEphemeralFromInit = queryTags(this._serverInitializeEvent, NOSTR_TAGS.SUPPORT_ENCRYPTION_EPHEMERAL).isFlag;
193
+ return supportsEphemeralFromInit
194
+ ? EPHEMERAL_GIFT_WRAP_KIND
195
+ : GIFT_WRAP_KIND;
196
+ }
197
+ }
198
+ //# sourceMappingURL=capability-negotiator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capability-negotiator.js","sourceRoot":"","sources":["../../../src/transport/capability-negotiator.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,wBAAwB,EACxB,cAAc,GACf,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAGrE,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEnD,MAAM,uBAAuB,GAAG,IAAI,GAAG,CAAS,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;AAuB5D,SAAS,QAAQ,CAAC,GAAsB;IACtC,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAC1B,IAAoC,EACpC,GAAW;IAEX,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;AAC1D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CACzB,KAA6B,EAC7B,GAAW;IAEX,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,IAAI,CAAC,IAAI,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AACrE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAyB;IACxD,OAAO,IAAI;SACR,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE;QACd,MAAM,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QACvB,OAAO,CACL,OAAO,OAAO,KAAK,QAAQ,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,OAAO,CAAC,CACrE,CAAC;IACJ,CAAC,CAAC;SACD,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;AACjC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,+BAA+B,CAC7C,IAAyB;IAEzB,MAAM,aAAa,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,YAAY,GAAG,qBAAqB,CAAC,aAAa,CAAC,CAAC;IAE1D,OAAO;QACL,aAAa;QACb,GAAG,YAAY;KAChB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CACnC,SAAyC;IAEzC,OAAO;QACL,kBAAkB,EAAE,YAAY,CAAC,SAAS,EAAE,UAAU,CAAC,kBAAkB,CAAC;QAC1E,2BAA2B,EAAE,YAAY,CACvC,SAAS,EACT,UAAU,CAAC,4BAA4B,CACxC;QACD,yBAAyB,EAAE,YAAY,CACrC,SAAS,EACT,UAAU,CAAC,0BAA0B,CACtC;QACD,kBAAkB,EAAE,YAAY,CAAC,SAAS,EAAE,UAAU,CAAC,mBAAmB,CAAC;KAC5E,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,OAAO,0BAA0B;IACrC,YACU,IAQP;QARO,SAAI,GAAJ,IAAI,CAQX;IACA,CAAC;IAEJ;;OAEG;IACI,wBAAwB,CAAC,OAAsB;QACpD,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;YAC9B,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;QACjC,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;IACnC,CAAC;IAED;;OAEG;IACI,iBAAiB,CAAC,MAKxB;QACC,MAAM,EACJ,QAAQ,EACR,OAAO,EACP,gBAAgB,GAAG,IAAI,EACvB,eAAe,GAAG,EAAE,GACrB,GAAG,MAAM,CAAC;QACX,OAAO,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC;YACnC,QAAQ;YACR,aAAa,EAAE,gBAAgB;gBAC7B,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,OAAO,CAAC;gBACxC,CAAC,CAAC,EAAE;YACN,eAAe;SAChB,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACI,0BAA0B,CAAC,MAGjC;QACC,MAAM,EAAE,OAAO,EAAE,gBAAgB,EAAE,GAAG,MAAM,CAAC;QAE7C,IAAI,CAAC,OAAO,CAAC,WAAW;YAAE,OAAO,SAAS,CAAC;QAC3C,IAAI,IAAI,CAAC,IAAI,CAAC,YAAY,KAAK,YAAY,CAAC,SAAS;YACnD,OAAO,wBAAwB,CAAC;QAClC,IAAI,IAAI,CAAC,IAAI,CAAC,YAAY,KAAK,YAAY,CAAC,UAAU;YACpD,OAAO,cAAc,CAAC;QACxB,IAAI,OAAO,CAAC,2BAA2B;YAAE,OAAO,wBAAwB,CAAC;QACzE,OAAO,gBAAgB,CAAC;IAC1B,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,0BAA0B;IAMrC,YACU,IAUP;QAVO,SAAI,GAAJ,IAAI,CAUX;QAhBK,yBAAoB,GAAG,KAAK,CAAC;QAE7B,qCAAgC,GAAG,KAAK,CAAC;IAe9C,CAAC;IAEJ;;OAEG;IACI,aAAa,CAAC,IAAuB;QAC1C,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;IACzB,CAAC;IAED;;;OAGG;IACI,uBAAuB,CAAC,UAE9B;QACC,IAAI,CAAC,gCAAgC,KAArC,IAAI,CAAC,gCAAgC,GACnC,UAAU,CAAC,2BAA2B,EAAC;IAC3C,CAAC;IAED;;OAEG;IACI,wBAAwB,CAAC,KAAiB;QAC/C,IAAI,CAAC,sBAAsB,GAAG,KAAK,CAAC;IACtC,CAAC;IAED;;OAEG;IACI,iBAAiB;QACtB,MAAM,IAAI,GAAe,EAAE,CAAC;QAC5B,IAAI,IAAI,CAAC,IAAI,CAAC,cAAc,KAAK,cAAc,CAAC,QAAQ,EAAE,CAAC;YACzD,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC,CAAC;QAC7C,CAAC;QACD,IACE,IAAI,CAAC,IAAI,CAAC,cAAc,KAAK,cAAc,CAAC,QAAQ;YACpD,IAAI,CAAC,IAAI,CAAC,YAAY,KAAK,YAAY,CAAC,UAAU,EAClD,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,4BAA4B,CAAC,CAAC,CAAC;QACvD,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC/B,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,0BAA0B,CAAC,CAAC,CAAC;QACrD,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAChC,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,mBAAmB,CAAC,CAAC,CAAC;QAC9C,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACI,kBAAkB;QACvB,MAAM,IAAI,GAAe,EAAE,CAAC;QAC5B,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;QAC3D,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACI,uBAAuB;QAC5B,OAAO,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;IACnE,CAAC;IAED;;OAEG;IACI,iBAAiB,CAAC,MAGxB;QACC,MAAM,EAAE,QAAQ,EAAE,gBAAgB,EAAE,GAAG,MAAM,CAAC;QAC9C,OAAO,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC;YACnC,QAAQ;YACR,aAAa,EAAE,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,uBAAuB,EAAE,CAAC,CAAC,CAAC,EAAE;YACrE,eAAe,EAAE,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC,EAAE;SACnE,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACI,qBAAqB;QAC1B,IAAI,IAAI,CAAC,uBAAuB,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9C,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC;QACnC,CAAC;IACH,CAAC;IAED;;OAEG;IACI,0BAA0B;QAC/B,IAAI,IAAI,CAAC,IAAI,CAAC,YAAY,KAAK,YAAY,CAAC,UAAU;YACpD,OAAO,cAAc,CAAC;QACxB,IAAI,IAAI,CAAC,IAAI,CAAC,YAAY,KAAK,YAAY,CAAC,SAAS;YACnD,OAAO,wBAAwB,CAAC;QAClC,IAAI,IAAI,CAAC,gCAAgC;YAAE,OAAO,wBAAwB,CAAC;QAC3E,MAAM,yBAAyB,GAAG,SAAS,CACzC,IAAI,CAAC,sBAAsB,EAC3B,UAAU,CAAC,4BAA4B,CACxC,CAAC,MAAM,CAAC;QACT,OAAO,yBAAyB;YAC9B,CAAC,CAAC,wBAAwB;YAC1B,CAAC,CAAC,cAAc,CAAC;IACrB,CAAC;CACF"}
@@ -0,0 +1,9 @@
1
+ import type { JSONRPCMessage } from '@modelcontextprotocol/sdk/types.js';
2
+ /**
3
+ * Inbound middleware hook for server transports.
4
+ */
5
+ export type InboundMiddlewareFn = (message: JSONRPCMessage, ctx: {
6
+ clientPubkey: string;
7
+ clientPmis?: readonly string[];
8
+ }, forward: (message: JSONRPCMessage) => Promise<void>) => Promise<void>;
9
+ //# sourceMappingURL=middleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../../src/transport/middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAEzE;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG,CAChC,OAAO,EAAE,cAAc,EACvB,GAAG,EAAE;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,EAC7D,OAAO,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,KAChD,OAAO,CAAC,IAAI,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../../src/transport/middleware.ts"],"names":[],"mappings":""}
@@ -0,0 +1,29 @@
1
+ import { type NostrEvent } from 'nostr-tools';
2
+ import { type NostrSigner, GiftWrapMode } from '../../core/interfaces.js';
3
+ import { type LruCache } from '../../core/utils/lru-cache.js';
4
+ import { type Logger } from '../../core/utils/logger.js';
5
+ /** Dependencies for the client-side event decryption and verification pipeline. */
6
+ export interface ClientEventPipelineDeps {
7
+ signer: NostrSigner;
8
+ seenEventIds: LruCache<true>;
9
+ serverPubkey: string;
10
+ giftWrapMode: GiftWrapMode;
11
+ logger: Logger;
12
+ onerror?: (error: Error) => void;
13
+ }
14
+ /** Result of successfully unwrapping an inbound Nostr event on the client. */
15
+ export interface UnwrappedClientEvent {
16
+ event: NostrEvent;
17
+ }
18
+ /** Handles gift-wrap decryption, signature verification, and server-pubkey gating for the client transport. */
19
+ export declare class ClientEventPipeline {
20
+ private deps;
21
+ constructor(deps: ClientEventPipelineDeps);
22
+ /**
23
+ * Decrypts and verifies an inbound event, checking against the expected server pubkey.
24
+ * Returns the inner event or null if invalid/duplicate.
25
+ */
26
+ unwrap(event: NostrEvent): Promise<UnwrappedClientEvent | null>;
27
+ private isGiftWrapKindAllowed;
28
+ }
29
+ //# sourceMappingURL=event-pipeline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-pipeline.d.ts","sourceRoot":"","sources":["../../../../src/transport/nostr-client/event-pipeline.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,OAAO,EAAE,KAAK,WAAW,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC1E,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,4BAA4B,CAAC;AASzD,mFAAmF;AACnF,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,WAAW,CAAC;IACpB,YAAY,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,YAAY,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAClC;AAED,8EAA8E;AAC9E,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,UAAU,CAAC;CACnB;AAED,+GAA+G;AAC/G,qBAAa,mBAAmB;IAClB,OAAO,CAAC,IAAI;gBAAJ,IAAI,EAAE,uBAAuB;IAEjD;;;OAGG;IACU,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;IAoH5E,OAAO,CAAC,qBAAqB;CAS9B"}
@@ -0,0 +1,109 @@
1
+ import { verifyEvent } from 'nostr-tools/pure';
2
+ import { GiftWrapMode } from '../../core/interfaces.js';
3
+ import { decryptMessage, DEFAULT_TIMEOUT_MS, EPHEMERAL_GIFT_WRAP_KIND, GIFT_WRAP_KIND, } from '../../core/index.js';
4
+ import { withTimeout } from '../../core/utils/utils.js';
5
+ /** Handles gift-wrap decryption, signature verification, and server-pubkey gating for the client transport. */
6
+ export class ClientEventPipeline {
7
+ constructor(deps) {
8
+ this.deps = deps;
9
+ }
10
+ /**
11
+ * Decrypts and verifies an inbound event, checking against the expected server pubkey.
12
+ * Returns the inner event or null if invalid/duplicate.
13
+ */
14
+ async unwrap(event) {
15
+ var _a, _b, _c, _d;
16
+ try {
17
+ let nostrEvent = event;
18
+ if (event.kind === GIFT_WRAP_KIND ||
19
+ event.kind === EPHEMERAL_GIFT_WRAP_KIND) {
20
+ if (!this.isGiftWrapKindAllowed(event.kind)) {
21
+ this.deps.logger.debug('Skipping gift wrap due to GiftWrapMode policy', {
22
+ eventId: event.id,
23
+ kind: event.kind,
24
+ });
25
+ return null;
26
+ }
27
+ // Deduplicate gift-wrap envelopes before any expensive decryption.
28
+ if (this.deps.seenEventIds.has(event.id)) {
29
+ this.deps.logger.debug('Skipping duplicate gift-wrapped event', {
30
+ eventId: event.id,
31
+ });
32
+ return null;
33
+ }
34
+ this.deps.seenEventIds.set(event.id, true);
35
+ try {
36
+ const decryptedContent = await withTimeout(decryptMessage(event, this.deps.signer), DEFAULT_TIMEOUT_MS, 'Decrypt message timed out');
37
+ nostrEvent = JSON.parse(decryptedContent);
38
+ // Verify the inner event's cryptographic signature to prevent
39
+ // identity forgery. Without this check an attacker can place the
40
+ // server's pubkey inside the plaintext and spoof responses. (Fixes #64)
41
+ if (!verifyEvent(nostrEvent)) {
42
+ this.deps.logger.error('Rejecting decrypted inner event with invalid signature', {
43
+ innerEventId: nostrEvent.id,
44
+ innerPubkey: nostrEvent.pubkey,
45
+ outerEventId: event.id,
46
+ });
47
+ return null;
48
+ }
49
+ }
50
+ catch (decryptError) {
51
+ this.deps.logger.error('Failed to decrypt gift-wrapped event', {
52
+ error: decryptError instanceof Error
53
+ ? decryptError.message
54
+ : String(decryptError),
55
+ stack: decryptError instanceof Error ? decryptError.stack : undefined,
56
+ eventId: event.id,
57
+ pubkey: event.pubkey,
58
+ });
59
+ (_b = (_a = this.deps).onerror) === null || _b === void 0 ? void 0 : _b.call(_a, decryptError instanceof Error
60
+ ? decryptError
61
+ : new Error('Failed to decrypt gift-wrapped event'));
62
+ return null;
63
+ }
64
+ }
65
+ if (nostrEvent.pubkey !== this.deps.serverPubkey) {
66
+ this.deps.logger.debug('Skipping event from unexpected server pubkey:', {
67
+ receivedPubkey: nostrEvent.pubkey,
68
+ expectedPubkey: this.deps.serverPubkey,
69
+ eventId: nostrEvent.id,
70
+ });
71
+ return null;
72
+ }
73
+ if (event.kind !== GIFT_WRAP_KIND &&
74
+ event.kind !== EPHEMERAL_GIFT_WRAP_KIND) {
75
+ if (!verifyEvent(nostrEvent)) {
76
+ this.deps.logger.error('Rejecting unencrypted event with invalid signature', {
77
+ eventId: nostrEvent.id,
78
+ pubkey: nostrEvent.pubkey,
79
+ });
80
+ return null;
81
+ }
82
+ }
83
+ return { event: nostrEvent };
84
+ }
85
+ catch (error) {
86
+ this.deps.logger.error('Error in event pipeline unwrap (client)', {
87
+ error: error instanceof Error ? error.message : String(error),
88
+ stack: error instanceof Error ? error.stack : undefined,
89
+ eventId: event.id,
90
+ pubkey: event.pubkey,
91
+ kind: event.kind,
92
+ });
93
+ (_d = (_c = this.deps).onerror) === null || _d === void 0 ? void 0 : _d.call(_c, error instanceof Error
94
+ ? error
95
+ : new Error('Failed to handle incoming Nostr event'));
96
+ return null;
97
+ }
98
+ }
99
+ isGiftWrapKindAllowed(kind) {
100
+ if (this.deps.giftWrapMode === GiftWrapMode.PERSISTENT) {
101
+ return kind === GIFT_WRAP_KIND;
102
+ }
103
+ if (this.deps.giftWrapMode === GiftWrapMode.EPHEMERAL) {
104
+ return kind === EPHEMERAL_GIFT_WRAP_KIND;
105
+ }
106
+ return true;
107
+ }
108
+ }
109
+ //# sourceMappingURL=event-pipeline.js.map