@bsv/overlay 2.3.1 → 2.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (201) hide show
  1. package/README.md +166 -0
  2. package/dist/cjs/mod.d.ts +3 -0
  3. package/dist/cjs/mod.d.ts.map +1 -1
  4. package/dist/cjs/mod.js +8 -1
  5. package/dist/cjs/mod.js.map +1 -1
  6. package/dist/cjs/package.json +10 -4
  7. package/dist/cjs/src/BASM.d.ts +6 -0
  8. package/dist/cjs/src/BASM.d.ts.map +1 -1
  9. package/dist/cjs/src/BASM.js +21 -8
  10. package/dist/cjs/src/BASM.js.map +1 -1
  11. package/dist/cjs/src/BASMRemote.d.ts +8 -1
  12. package/dist/cjs/src/BASMRemote.d.ts.map +1 -1
  13. package/dist/cjs/src/BASMRemote.js +179 -13
  14. package/dist/cjs/src/BASMRemote.js.map +1 -1
  15. package/dist/cjs/src/BASMValidation.d.ts +27 -0
  16. package/dist/cjs/src/BASMValidation.d.ts.map +1 -0
  17. package/dist/cjs/src/BASMValidation.js +108 -0
  18. package/dist/cjs/src/BASMValidation.js.map +1 -0
  19. package/dist/cjs/src/DiscoveryAdvertisementValidation.d.ts +11 -0
  20. package/dist/cjs/src/DiscoveryAdvertisementValidation.d.ts.map +1 -0
  21. package/dist/cjs/src/DiscoveryAdvertisementValidation.js +60 -0
  22. package/dist/cjs/src/DiscoveryAdvertisementValidation.js.map +1 -0
  23. package/dist/cjs/src/Engine.d.ts +37 -13
  24. package/dist/cjs/src/Engine.d.ts.map +1 -1
  25. package/dist/cjs/src/Engine.js +1713 -336
  26. package/dist/cjs/src/Engine.js.map +1 -1
  27. package/dist/cjs/src/EngineAdmission.d.ts +70 -0
  28. package/dist/cjs/src/EngineAdmission.d.ts.map +1 -0
  29. package/dist/cjs/src/EngineAdmission.js +297 -0
  30. package/dist/cjs/src/EngineAdmission.js.map +1 -0
  31. package/dist/cjs/src/GASP/OverlayGASPRemote.d.ts +4 -3
  32. package/dist/cjs/src/GASP/OverlayGASPRemote.d.ts.map +1 -1
  33. package/dist/cjs/src/GASP/OverlayGASPRemote.js +27 -43
  34. package/dist/cjs/src/GASP/OverlayGASPRemote.js.map +1 -1
  35. package/dist/cjs/src/GASP/OverlayGASPStorage.d.ts +22 -16
  36. package/dist/cjs/src/GASP/OverlayGASPStorage.d.ts.map +1 -1
  37. package/dist/cjs/src/GASP/OverlayGASPStorage.js +206 -57
  38. package/dist/cjs/src/GASP/OverlayGASPStorage.js.map +1 -1
  39. package/dist/cjs/src/RemoteSecurity.d.ts +50 -0
  40. package/dist/cjs/src/RemoteSecurity.d.ts.map +1 -0
  41. package/dist/cjs/src/RemoteSecurity.js +301 -0
  42. package/dist/cjs/src/RemoteSecurity.js.map +1 -0
  43. package/dist/cjs/src/storage/AdmissionStorage.d.ts +185 -0
  44. package/dist/cjs/src/storage/AdmissionStorage.d.ts.map +1 -0
  45. package/dist/cjs/src/storage/AdmissionStorage.js +93 -0
  46. package/dist/cjs/src/storage/AdmissionStorage.js.map +1 -0
  47. package/dist/cjs/src/storage/RecoveryContract.d.ts +50 -0
  48. package/dist/cjs/src/storage/RecoveryContract.d.ts.map +1 -0
  49. package/dist/cjs/src/storage/RecoveryContract.js +35 -0
  50. package/dist/cjs/src/storage/RecoveryContract.js.map +1 -0
  51. package/dist/cjs/src/storage/Storage.d.ts +32 -19
  52. package/dist/cjs/src/storage/Storage.d.ts.map +1 -1
  53. package/dist/cjs/src/storage/Storage.js +5 -0
  54. package/dist/cjs/src/storage/Storage.js.map +1 -1
  55. package/dist/cjs/src/storage/knex/KnexStorage.d.ts +8 -8
  56. package/dist/cjs/src/storage/knex/KnexStorage.d.ts.map +1 -1
  57. package/dist/cjs/src/storage/knex/KnexStorage.js +98 -61
  58. package/dist/cjs/src/storage/knex/KnexStorage.js.map +1 -1
  59. package/dist/cjs/src/storage/knex/all-migrations.d.ts.map +1 -1
  60. package/dist/cjs/src/storage/knex/all-migrations.js +5 -1
  61. package/dist/cjs/src/storage/knex/all-migrations.js.map +1 -1
  62. package/dist/cjs/src/storage/knex/migrations/2026-09-17-001-topical-uniqueness.d.ts +4 -0
  63. package/dist/cjs/src/storage/knex/migrations/2026-09-17-001-topical-uniqueness.d.ts.map +1 -0
  64. package/dist/cjs/src/storage/knex/migrations/2026-09-17-001-topical-uniqueness.js +36 -0
  65. package/dist/cjs/src/storage/knex/migrations/2026-09-17-001-topical-uniqueness.js.map +1 -0
  66. package/dist/cjs/src/storage/knex/migrations/2026-09-20-001-spent-by.d.ts +5 -0
  67. package/dist/cjs/src/storage/knex/migrations/2026-09-20-001-spent-by.d.ts.map +1 -0
  68. package/dist/cjs/src/storage/knex/migrations/2026-09-20-001-spent-by.js +16 -0
  69. package/dist/cjs/src/storage/knex/migrations/2026-09-20-001-spent-by.js.map +1 -0
  70. package/dist/cjs/src/storage/mongo/MongoAdmissionPlan.d.ts +18 -0
  71. package/dist/cjs/src/storage/mongo/MongoAdmissionPlan.d.ts.map +1 -0
  72. package/dist/cjs/src/storage/mongo/MongoAdmissionPlan.js +229 -0
  73. package/dist/cjs/src/storage/mongo/MongoAdmissionPlan.js.map +1 -0
  74. package/dist/cjs/src/storage/mongo/MongoAdmissionStorage.d.ts +112 -0
  75. package/dist/cjs/src/storage/mongo/MongoAdmissionStorage.d.ts.map +1 -0
  76. package/dist/cjs/src/storage/mongo/MongoAdmissionStorage.js +675 -0
  77. package/dist/cjs/src/storage/mongo/MongoAdmissionStorage.js.map +1 -0
  78. package/dist/cjs/src/storage/mongo/MongoOverlayStorage.d.ts +71 -0
  79. package/dist/cjs/src/storage/mongo/MongoOverlayStorage.d.ts.map +1 -0
  80. package/dist/cjs/src/storage/mongo/MongoOverlayStorage.js +453 -0
  81. package/dist/cjs/src/storage/mongo/MongoOverlayStorage.js.map +1 -0
  82. package/dist/cjs/src/storage/mongo/MongoPayloadStore.d.ts +134 -0
  83. package/dist/cjs/src/storage/mongo/MongoPayloadStore.d.ts.map +1 -0
  84. package/dist/cjs/src/storage/mongo/MongoPayloadStore.js +756 -0
  85. package/dist/cjs/src/storage/mongo/MongoPayloadStore.js.map +1 -0
  86. package/dist/cjs/src/storage/mongo/MongoReadGuards.d.ts +44 -0
  87. package/dist/cjs/src/storage/mongo/MongoReadGuards.d.ts.map +1 -0
  88. package/dist/cjs/src/storage/mongo/MongoReadGuards.js +135 -0
  89. package/dist/cjs/src/storage/mongo/MongoReadGuards.js.map +1 -0
  90. package/dist/cjs/src/storage/mongo/MongoSchema.d.ts +67 -0
  91. package/dist/cjs/src/storage/mongo/MongoSchema.d.ts.map +1 -0
  92. package/dist/cjs/src/storage/mongo/MongoSchema.js +743 -0
  93. package/dist/cjs/src/storage/mongo/MongoSchema.js.map +1 -0
  94. package/dist/cjs/src/storage/mongo/MongoTransactionRunner.d.ts +69 -0
  95. package/dist/cjs/src/storage/mongo/MongoTransactionRunner.d.ts.map +1 -0
  96. package/dist/cjs/src/storage/mongo/MongoTransactionRunner.js +368 -0
  97. package/dist/cjs/src/storage/mongo/MongoTransactionRunner.js.map +1 -0
  98. package/dist/cjs/src/storage/mongo.d.ts +9 -0
  99. package/dist/cjs/src/storage/mongo.d.ts.map +1 -0
  100. package/dist/cjs/src/storage/mongo.js +25 -0
  101. package/dist/cjs/src/storage/mongo.js.map +1 -0
  102. package/dist/esm/mod.js +3 -0
  103. package/dist/esm/mod.js.map +1 -1
  104. package/dist/esm/src/BASM.js +21 -8
  105. package/dist/esm/src/BASM.js.map +1 -1
  106. package/dist/esm/src/BASMRemote.js +176 -12
  107. package/dist/esm/src/BASMRemote.js.map +1 -1
  108. package/dist/esm/src/BASMValidation.js +95 -0
  109. package/dist/esm/src/BASMValidation.js.map +1 -0
  110. package/dist/esm/src/DiscoveryAdvertisementValidation.js +57 -0
  111. package/dist/esm/src/DiscoveryAdvertisementValidation.js.map +1 -0
  112. package/dist/esm/src/Engine.js +1698 -326
  113. package/dist/esm/src/Engine.js.map +1 -1
  114. package/dist/esm/src/EngineAdmission.js +280 -0
  115. package/dist/esm/src/EngineAdmission.js.map +1 -0
  116. package/dist/esm/src/GASP/OverlayGASPRemote.js +27 -43
  117. package/dist/esm/src/GASP/OverlayGASPRemote.js.map +1 -1
  118. package/dist/esm/src/GASP/OverlayGASPStorage.js +200 -56
  119. package/dist/esm/src/GASP/OverlayGASPStorage.js.map +1 -1
  120. package/dist/esm/src/RemoteSecurity.js +279 -0
  121. package/dist/esm/src/RemoteSecurity.js.map +1 -0
  122. package/dist/esm/src/storage/AdmissionStorage.js +85 -0
  123. package/dist/esm/src/storage/AdmissionStorage.js.map +1 -0
  124. package/dist/esm/src/storage/RecoveryContract.js +31 -0
  125. package/dist/esm/src/storage/RecoveryContract.js.map +1 -0
  126. package/dist/esm/src/storage/Storage.js +4 -1
  127. package/dist/esm/src/storage/Storage.js.map +1 -1
  128. package/dist/esm/src/storage/knex/KnexStorage.js +98 -61
  129. package/dist/esm/src/storage/knex/KnexStorage.js.map +1 -1
  130. package/dist/esm/src/storage/knex/all-migrations.js +5 -1
  131. package/dist/esm/src/storage/knex/all-migrations.js.map +1 -1
  132. package/dist/esm/src/storage/knex/migrations/2026-09-17-001-topical-uniqueness.js +32 -0
  133. package/dist/esm/src/storage/knex/migrations/2026-09-17-001-topical-uniqueness.js.map +1 -0
  134. package/dist/esm/src/storage/knex/migrations/2026-09-20-001-spent-by.js +12 -0
  135. package/dist/esm/src/storage/knex/migrations/2026-09-20-001-spent-by.js.map +1 -0
  136. package/dist/esm/src/storage/mongo/MongoAdmissionPlan.js +217 -0
  137. package/dist/esm/src/storage/mongo/MongoAdmissionPlan.js.map +1 -0
  138. package/dist/esm/src/storage/mongo/MongoAdmissionStorage.js +673 -0
  139. package/dist/esm/src/storage/mongo/MongoAdmissionStorage.js.map +1 -0
  140. package/dist/esm/src/storage/mongo/MongoOverlayStorage.js +451 -0
  141. package/dist/esm/src/storage/mongo/MongoOverlayStorage.js.map +1 -0
  142. package/dist/esm/src/storage/mongo/MongoPayloadStore.js +747 -0
  143. package/dist/esm/src/storage/mongo/MongoPayloadStore.js.map +1 -0
  144. package/dist/esm/src/storage/mongo/MongoReadGuards.js +129 -0
  145. package/dist/esm/src/storage/mongo/MongoReadGuards.js.map +1 -0
  146. package/dist/esm/src/storage/mongo/MongoSchema.js +730 -0
  147. package/dist/esm/src/storage/mongo/MongoSchema.js.map +1 -0
  148. package/dist/esm/src/storage/mongo/MongoTransactionRunner.js +371 -0
  149. package/dist/esm/src/storage/mongo/MongoTransactionRunner.js.map +1 -0
  150. package/dist/esm/src/storage/mongo.js +9 -0
  151. package/dist/esm/src/storage/mongo.js.map +1 -0
  152. package/dist/types/mod.d.ts +3 -0
  153. package/dist/types/mod.d.ts.map +1 -1
  154. package/dist/types/src/BASM.d.ts +6 -0
  155. package/dist/types/src/BASM.d.ts.map +1 -1
  156. package/dist/types/src/BASMRemote.d.ts +8 -1
  157. package/dist/types/src/BASMRemote.d.ts.map +1 -1
  158. package/dist/types/src/BASMValidation.d.ts +27 -0
  159. package/dist/types/src/BASMValidation.d.ts.map +1 -0
  160. package/dist/types/src/DiscoveryAdvertisementValidation.d.ts +11 -0
  161. package/dist/types/src/DiscoveryAdvertisementValidation.d.ts.map +1 -0
  162. package/dist/types/src/Engine.d.ts +37 -13
  163. package/dist/types/src/Engine.d.ts.map +1 -1
  164. package/dist/types/src/EngineAdmission.d.ts +70 -0
  165. package/dist/types/src/EngineAdmission.d.ts.map +1 -0
  166. package/dist/types/src/GASP/OverlayGASPRemote.d.ts +4 -3
  167. package/dist/types/src/GASP/OverlayGASPRemote.d.ts.map +1 -1
  168. package/dist/types/src/GASP/OverlayGASPStorage.d.ts +22 -16
  169. package/dist/types/src/GASP/OverlayGASPStorage.d.ts.map +1 -1
  170. package/dist/types/src/RemoteSecurity.d.ts +50 -0
  171. package/dist/types/src/RemoteSecurity.d.ts.map +1 -0
  172. package/dist/types/src/storage/AdmissionStorage.d.ts +185 -0
  173. package/dist/types/src/storage/AdmissionStorage.d.ts.map +1 -0
  174. package/dist/types/src/storage/RecoveryContract.d.ts +50 -0
  175. package/dist/types/src/storage/RecoveryContract.d.ts.map +1 -0
  176. package/dist/types/src/storage/Storage.d.ts +32 -19
  177. package/dist/types/src/storage/Storage.d.ts.map +1 -1
  178. package/dist/types/src/storage/knex/KnexStorage.d.ts +8 -8
  179. package/dist/types/src/storage/knex/KnexStorage.d.ts.map +1 -1
  180. package/dist/types/src/storage/knex/all-migrations.d.ts.map +1 -1
  181. package/dist/types/src/storage/knex/migrations/2026-09-17-001-topical-uniqueness.d.ts +4 -0
  182. package/dist/types/src/storage/knex/migrations/2026-09-17-001-topical-uniqueness.d.ts.map +1 -0
  183. package/dist/types/src/storage/knex/migrations/2026-09-20-001-spent-by.d.ts +5 -0
  184. package/dist/types/src/storage/knex/migrations/2026-09-20-001-spent-by.d.ts.map +1 -0
  185. package/dist/types/src/storage/mongo/MongoAdmissionPlan.d.ts +18 -0
  186. package/dist/types/src/storage/mongo/MongoAdmissionPlan.d.ts.map +1 -0
  187. package/dist/types/src/storage/mongo/MongoAdmissionStorage.d.ts +112 -0
  188. package/dist/types/src/storage/mongo/MongoAdmissionStorage.d.ts.map +1 -0
  189. package/dist/types/src/storage/mongo/MongoOverlayStorage.d.ts +71 -0
  190. package/dist/types/src/storage/mongo/MongoOverlayStorage.d.ts.map +1 -0
  191. package/dist/types/src/storage/mongo/MongoPayloadStore.d.ts +134 -0
  192. package/dist/types/src/storage/mongo/MongoPayloadStore.d.ts.map +1 -0
  193. package/dist/types/src/storage/mongo/MongoReadGuards.d.ts +44 -0
  194. package/dist/types/src/storage/mongo/MongoReadGuards.d.ts.map +1 -0
  195. package/dist/types/src/storage/mongo/MongoSchema.d.ts +67 -0
  196. package/dist/types/src/storage/mongo/MongoSchema.d.ts.map +1 -0
  197. package/dist/types/src/storage/mongo/MongoTransactionRunner.d.ts +69 -0
  198. package/dist/types/src/storage/mongo/MongoTransactionRunner.d.ts.map +1 -0
  199. package/dist/types/src/storage/mongo.d.ts +9 -0
  200. package/dist/types/src/storage/mongo.d.ts.map +1 -0
  201. package/package.json +11 -5
@@ -1,5 +1,6 @@
1
1
  import { createHash } from 'node:crypto';
2
2
  export const BASM_ZERO_HASH = '0000000000000000000000000000000000000000000000000000000000000000';
3
+ const MAX_BASM_ROOT_LEAVES = 100_000;
3
4
  function sha256d(buffer) {
4
5
  const first = createHash('sha256').update(buffer).digest();
5
6
  return createHash('sha256').update(first).digest();
@@ -17,15 +18,27 @@ function internalToDisplayHex(hash) {
17
18
  return Buffer.from(hash).reverse().toString('hex');
18
19
  }
19
20
  function normalizeAdmittedTxids(admitted) {
20
- return admitted
21
- .map((item, originalIndex) => {
22
- if (typeof item === 'string') {
23
- return { txid: item, blockIndex: originalIndex };
21
+ if (!Array.isArray(admitted) || admitted.length > MAX_BASM_ROOT_LEAVES) {
22
+ throw new TypeError(`BASM admission sets are capped at ${MAX_BASM_ROOT_LEAVES} entries`);
23
+ }
24
+ const normalized = admitted.map((item, originalIndex) => {
25
+ const candidate = typeof item === 'string' ? { txid: item, blockIndex: originalIndex } : item;
26
+ if (typeof candidate !== 'object' ||
27
+ candidate === null ||
28
+ typeof candidate.txid !== 'string' ||
29
+ !Number.isSafeInteger(candidate.blockIndex) ||
30
+ candidate.blockIndex < 0) {
31
+ throw new TypeError(`BASM admission at index ${originalIndex} is invalid`);
24
32
  }
25
- return item;
26
- })
27
- .sort((a, b) => a.blockIndex - b.blockIndex)
28
- .map(item => item.txid.toLowerCase());
33
+ assertHashHex(candidate.txid, `BASM admission at index ${originalIndex}`);
34
+ return { txid: candidate.txid.toLowerCase(), blockIndex: candidate.blockIndex };
35
+ });
36
+ const txids = new Set(normalized.map(item => item.txid));
37
+ const blockIndexes = new Set(normalized.map(item => item.blockIndex));
38
+ if (txids.size !== normalized.length || blockIndexes.size !== normalized.length) {
39
+ throw new TypeError('BASM admission sets must contain unique txids and block indexes');
40
+ }
41
+ return normalized.sort((a, b) => a.blockIndex - b.blockIndex).map(item => item.txid);
29
42
  }
30
43
  /**
31
44
  * Computes a BRC-136 BASM root from admitted topic txids.
@@ -1 +1 @@
1
- {"version":3,"file":"BASM.js","sourceRoot":"","sources":["../../../src/BASM.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"BASM.js","sourceRoot":"","sources":["../../../src/BASM.ts"],"names":[],"mappings":"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"}
@@ -1,28 +1,167 @@
1
+ import { BASMProtocolError, DEFAULT_BASM_REMOTE_LIMITS, basmAdmitted, basmAnchor, basmHash, basmHex, basmInteger, basmObject, basmTip, basmTxids, requireBASM, requireBASMLimit } from './BASMValidation.js';
2
+ import { assertRawTransactionMatches, assertTopic, securePeerFetch } from './RemoteSecurity.js';
3
+ export { BASMProtocolError } from './BASMValidation.js';
1
4
  export class BASMRemote {
5
+ limits;
2
6
  endpoint;
3
7
  topic;
4
8
  fetchImpl;
5
- constructor(endpoint, topic, fetchImpl = fetch.bind(globalThis)) {
6
- this.endpoint = endpoint;
9
+ constructor(endpoint, topic, fetchImpl, limits = {}) {
10
+ assertTopic(topic);
11
+ const secured = securePeerFetch(endpoint, fetchImpl);
12
+ this.endpoint = secured.endpoint;
7
13
  this.topic = topic;
8
- this.fetchImpl = fetchImpl;
14
+ this.fetchImpl = secured.fetchImpl;
15
+ this.limits = Object.freeze({ ...DEFAULT_BASM_REMOTE_LIMITS, ...limits });
16
+ for (const [key, value] of Object.entries(this.limits)) {
17
+ if (!Number.isSafeInteger(value) || value <= 0)
18
+ throw new TypeError(`Invalid BASM limit: ${key}`);
19
+ }
20
+ if (this.limits.timeoutMs > 2147483647)
21
+ throw new TypeError('BASM timeout exceeds timer range');
9
22
  }
10
23
  async requestTopicAnchorTip() {
11
- return await this.post('/requestTopicAnchorTip', {});
24
+ return basmTip(await this.post('/requestTopicAnchorTip', {}), this.topic);
12
25
  }
13
26
  async requestTopicAnchorRange(fromHeight, toHeight) {
14
- return await this.post('/requestTopicAnchorRange', { fromHeight, toHeight });
27
+ basmInteger(fromHeight, 'range start');
28
+ basmInteger(toHeight, 'range end', fromHeight);
29
+ requireBASMLimit(toHeight - fromHeight < this.limits.maxAnchorRange, 'BASM anchor range exceeds limit');
30
+ const obj = basmObject(await this.post('/requestTopicAnchorRange', { fromHeight, toHeight }));
31
+ requireBASM(obj.topic === this.topic && Array.isArray(obj.anchors), 'Invalid BASM anchor range');
32
+ requireBASMLimit(obj.anchors.length <= toHeight - fromHeight + 1, 'BASM anchor count exceeds requested range');
33
+ const anchors = obj.anchors.map(value => basmAnchor(value, this.topic));
34
+ let previousHeight;
35
+ for (const anchor of anchors) {
36
+ requireBASM(anchor.blockHeight >= fromHeight && anchor.blockHeight <= toHeight, 'BASM anchor outside requested range');
37
+ requireBASM(previousHeight === undefined || anchor.blockHeight === previousHeight + 1, 'BASM anchor range has a gap or is unordered');
38
+ previousHeight = anchor.blockHeight;
39
+ }
40
+ return { topic: this.topic, anchors };
15
41
  }
16
42
  async requestAdmittedList(blockHeight, blockHash) {
17
- return await this.post('/requestAdmittedList', { blockHeight, blockHash });
43
+ basmInteger(blockHeight, 'height');
44
+ if (blockHash !== undefined)
45
+ basmHash(blockHash, 'block hash');
46
+ const obj = basmObject(await this.post('/requestAdmittedList', { blockHeight, blockHash }));
47
+ this.requireCoordinate(obj, blockHeight);
48
+ const responseHash = obj.blockHash === undefined ? undefined : basmHash(obj.blockHash, 'block hash');
49
+ requireBASM(blockHash === undefined || responseHash === undefined || responseHash === blockHash, 'BASM admitted block hash mismatch');
50
+ return {
51
+ topic: this.topic,
52
+ blockHeight,
53
+ ...(responseHash === undefined ? {} : { blockHash: responseHash }),
54
+ admitted: basmAdmitted(obj.admitted, this.limits.maxAdmittedTxids)
55
+ };
18
56
  }
19
57
  async requestCompoundMerklePath(blockHeight, txids) {
20
- return await this.post('/requestCompoundMerklePath', { blockHeight, txids });
58
+ basmInteger(blockHeight, 'height');
59
+ const requested = basmTxids(txids, this.limits.maxRequestedTxids);
60
+ requireBASM(requested.length > 0, 'At least one BASM proof txid is required');
61
+ const obj = basmObject(await this.post('/requestCompoundMerklePath', { blockHeight, txids: requested }));
62
+ this.requireCoordinate(obj, blockHeight);
63
+ const returned = basmTxids(obj.txids, requested.length);
64
+ const requestedSet = new Set(requested);
65
+ requireBASM(returned.length === requested.length && returned.every(txid => requestedSet.has(txid)), 'BASM proof txids do not match request');
66
+ return {
67
+ topic: this.topic,
68
+ blockHeight,
69
+ txids: returned,
70
+ merklePath: basmHex(obj.merklePath, 'Merkle path', this.limits.maxProofBytes)
71
+ };
21
72
  }
22
73
  async requestRawTransactions(txids) {
23
- return await this.post('/requestRawTransactions', { txids });
74
+ const requested = new Set(basmTxids(txids, this.limits.maxRequestedTxids));
75
+ const obj = basmObject(await this.post('/requestRawTransactions', { txids: [...requested] }));
76
+ requireBASM(Array.isArray(obj.transactions), 'Invalid BASM raw transactions');
77
+ requireBASMLimit(obj.transactions.length <= requested.size, 'BASM raw transaction count exceeds request');
78
+ const seen = new Set();
79
+ const transactions = obj.transactions.map(value => {
80
+ const record = basmObject(value);
81
+ const txid = basmHash(record.txid, 'txid');
82
+ requireBASM(requested.has(txid) && !seen.has(txid), 'Unexpected or duplicate BASM raw transaction');
83
+ seen.add(txid);
84
+ const rawTx = basmHex(record.rawTx, 'raw transaction', this.limits.maxRawTransactionBytes);
85
+ assertRawTransactionMatches(txid, rawTx);
86
+ return {
87
+ txid,
88
+ rawTx
89
+ };
90
+ });
91
+ const missing = basmTxids(obj.missing, requested.size);
92
+ for (const txid of missing) {
93
+ requireBASM(requested.has(txid) && !seen.has(txid), 'Unexpected or conflicting BASM missing txid');
94
+ seen.add(txid);
95
+ }
96
+ requireBASM(seen.size === requested.size, 'BASM raw response omits requested txids');
97
+ return { transactions, missing };
98
+ }
99
+ requireCoordinate(obj, blockHeight) {
100
+ requireBASM(obj.topic === this.topic && obj.blockHeight === blockHeight, 'BASM response topic or height mismatch');
101
+ }
102
+ async readResponse(response, signal) {
103
+ const advertisedLength = response.headers?.get('content-length');
104
+ if (advertisedLength !== null && advertisedLength !== undefined) {
105
+ if (Number(advertisedLength) > this.limits.maxResponseBytes) {
106
+ void response.body?.cancel().catch(() => { });
107
+ requireBASMLimit(false, 'BASM response exceeds byte limit');
108
+ }
109
+ }
110
+ // Preserve injected fetch implementations that expose only text(). Real HTTP
111
+ // responses are bounded while streaming, including decoded chunked bodies.
112
+ if (response.body === undefined || response.body === null) {
113
+ const text = await response.text();
114
+ requireBASMLimit(Buffer.byteLength(text) <= this.limits.maxResponseBytes, 'BASM response exceeds byte limit');
115
+ return text;
116
+ }
117
+ const reader = response.body.getReader();
118
+ const chunks = [];
119
+ let size = 0;
120
+ const cancel = () => {
121
+ void reader.cancel().catch(() => { });
122
+ };
123
+ signal.addEventListener('abort', cancel, { once: true });
124
+ try {
125
+ while (true) {
126
+ signal.throwIfAborted();
127
+ const { done, value } = await reader.read();
128
+ if (done)
129
+ break;
130
+ size += value.byteLength;
131
+ requireBASMLimit(size <= this.limits.maxResponseBytes, 'BASM response exceeds byte limit');
132
+ chunks.push(value);
133
+ }
134
+ signal.throwIfAborted();
135
+ return Buffer.concat(chunks, size).toString('utf8');
136
+ }
137
+ catch (error) {
138
+ cancel();
139
+ throw error;
140
+ }
141
+ finally {
142
+ signal.removeEventListener('abort', cancel);
143
+ reader.releaseLock();
144
+ }
24
145
  }
25
146
  async post(path, body) {
147
+ const controller = new AbortController();
148
+ let timer;
149
+ const deadline = new Promise((_resolve, reject) => {
150
+ timer = setTimeout(() => {
151
+ const error = new BASMProtocolError('BASM_TIMEOUT', 'BASM request timed out');
152
+ controller.abort(error);
153
+ reject(error);
154
+ }, this.limits.timeoutMs);
155
+ });
156
+ try {
157
+ return await Promise.race([this.postResponse(path, body, controller.signal), deadline]);
158
+ }
159
+ finally {
160
+ clearTimeout(timer);
161
+ controller.abort();
162
+ }
163
+ }
164
+ async postResponse(path, body, signal) {
26
165
  const response = await this.fetchImpl(new URL(path, this.endpoint).toString(), {
27
166
  method: 'POST',
28
167
  headers: {
@@ -30,13 +169,38 @@ export class BASMRemote {
30
169
  'Content-Type': 'application/json',
31
170
  'x-bsv-topic': this.topic
32
171
  },
33
- body: JSON.stringify(body)
172
+ body: JSON.stringify(body),
173
+ signal
34
174
  });
35
- const text = await response.text();
175
+ if (signal.aborted) {
176
+ void response.body?.cancel().catch(() => { });
177
+ signal.throwIfAborted();
178
+ }
179
+ const contentType = response.headers?.get?.('content-type');
180
+ if (contentType !== null &&
181
+ contentType !== undefined &&
182
+ contentType.includes('/') &&
183
+ !/^application\/(?:[\w.-]+\+)?json(?:\s*;|$)/i.test(contentType)) {
184
+ void response.body?.cancel().catch(() => { });
185
+ throw new TypeError('Overlay peer response is not JSON');
186
+ }
187
+ const text = await this.readResponse(response, signal);
188
+ let value;
189
+ try {
190
+ value = JSON.parse(text);
191
+ }
192
+ catch {
193
+ if (response.ok)
194
+ throw new BASMProtocolError('BASM_INVALID_RESPONSE', 'Invalid BASM JSON response');
195
+ }
36
196
  if (!response.ok) {
37
- throw new Error(`BASM peer ${this.endpoint} returned ${response.status}: ${text}`);
197
+ const code = typeof value === 'object' && value !== null && 'code' in value ? value.code : undefined;
198
+ if (response.status === 501 || code === 'BASM_UNSUPPORTED') {
199
+ throw new BASMProtocolError('BASM_UNSUPPORTED', `BASM peer returned HTTP ${response.status}: unsupported BASM capability`);
200
+ }
201
+ throw new BASMProtocolError('BASM_HTTP_ERROR', `BASM peer returned HTTP ${response.status}`);
38
202
  }
39
- return (text.length === 0 ? {} : JSON.parse(text));
203
+ return value;
40
204
  }
41
205
  }
42
206
  //# sourceMappingURL=BASMRemote.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"BASMRemote.js","sourceRoot":"","sources":["../../../src/BASMRemote.ts"],"names":[],"mappings":"AAQA,MAAM,OAAO,UAAU;IAEF,QAAQ;IACR,KAAK;IACL,SAAS;IAH5B,YACmB,QAAgB,EAChB,KAAa,EACb,SAAS,GAAiB,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC;wBAFhD,QAAQ;qBACR,KAAK;yBACL,SAAS;IACxB,CAAC;IAEL,KAAK,CAAC,qBAAqB;QACzB,OAAO,MAAM,IAAI,CAAC,IAAI,CAAiB,wBAAwB,EAAE,EAAE,CAAC,CAAA;IACtE,CAAC;IAED,KAAK,CAAC,uBAAuB,CAAC,UAAkB,EAAE,QAAgB;QAChE,OAAO,MAAM,IAAI,CAAC,IAAI,CAA2B,0BAA0B,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,CAAA;IACxG,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,WAAmB,EAAE,SAAkB;QAC/D,OAAO,MAAM,IAAI,CAAC,IAAI,CAAuB,sBAAsB,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,CAAA;IAClG,CAAC;IAED,KAAK,CAAC,yBAAyB,CAAC,WAAmB,EAAE,KAAe;QAClE,OAAO,MAAM,IAAI,CAAC,IAAI,CAA6B,4BAA4B,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAA;IAC1G,CAAC;IAED,KAAK,CAAC,sBAAsB,CAAC,KAAe;QAC1C,OAAO,MAAM,IAAI,CAAC,IAAI,CAAyB,yBAAyB,EAAE,EAAE,KAAK,EAAE,CAAC,CAAA;IACtF,CAAC;IAEO,KAAK,CAAC,IAAI,CAAI,IAAY,EAAE,IAAa;QAC/C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,QAAQ,EAAE,EAAE;YAC7E,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,MAAM,EAAE,kBAAkB;gBAC1B,cAAc,EAAE,kBAAkB;gBAClC,aAAa,EAAE,IAAI,CAAC,KAAK;aAC1B;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC3B,CAAC,CAAA;QAEF,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;QAClC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,aAAa,IAAI,CAAC,QAAQ,aAAa,QAAQ,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC,CAAA;QACpF,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAM,CAAA;IACzD,CAAC;CACF"}
1
+ {"version":3,"file":"BASMRemote.js","sourceRoot":"","sources":["../../../src/BASMRemote.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,95 @@
1
+ import { BASM_ZERO_HASH } from './BASM.js';
2
+ export const DEFAULT_BASM_REMOTE_LIMITS = Object.freeze({
3
+ maxResponseBytes: 64 * 1024 * 1024,
4
+ maxProofBytes: 8 * 1024 * 1024,
5
+ maxRawTransactionBytes: 32 * 1024 * 1024,
6
+ maxAdmittedTxids: 100000,
7
+ maxRequestedTxids: 1000,
8
+ maxAnchorRange: 1024,
9
+ timeoutMs: 30000
10
+ });
11
+ export class BASMProtocolError extends Error {
12
+ code;
13
+ constructor(code, message) {
14
+ super(message);
15
+ this.code = code;
16
+ this.name = 'BASMProtocolError';
17
+ }
18
+ }
19
+ export function requireBASM(condition, message) {
20
+ if (!condition)
21
+ throw new BASMProtocolError('BASM_INVALID_RESPONSE', message);
22
+ }
23
+ export function requireBASMLimit(condition, message) {
24
+ if (!condition)
25
+ throw new BASMProtocolError('BASM_RESOURCE_LIMIT', message);
26
+ }
27
+ export function basmObject(value) {
28
+ requireBASM(typeof value === 'object' && value !== null && !Array.isArray(value), 'Expected a BASM JSON object');
29
+ return value;
30
+ }
31
+ export function basmInteger(value, label, minimum = 0) {
32
+ requireBASM(typeof value === 'number' && Number.isSafeInteger(value) && value >= minimum, `Invalid BASM ${label}`);
33
+ return value;
34
+ }
35
+ export function basmHash(value, label) {
36
+ requireBASM(typeof value === 'string' && /^[0-9a-f]{64}$/.test(value), `Invalid BASM ${label}`);
37
+ return value;
38
+ }
39
+ export function basmHex(value, label, maxBytes) {
40
+ requireBASM(typeof value === 'string', `Invalid BASM ${label}`);
41
+ requireBASMLimit(value.length <= maxBytes * 2, `BASM ${label} exceeds byte limit`);
42
+ requireBASM(value.length > 0 && value.length % 2 === 0 && /^[0-9a-fA-F]+$/.test(value), `Invalid BASM ${label}`);
43
+ return value;
44
+ }
45
+ export function basmTxids(value, maximum) {
46
+ requireBASM(Array.isArray(value), 'Invalid BASM txids');
47
+ requireBASMLimit(value.length <= maximum, 'BASM txid count exceeds limit');
48
+ const txids = value.map(txid => basmHash(txid, 'txid'));
49
+ requireBASM(new Set(txids).size === txids.length, 'Duplicate BASM txid');
50
+ return txids;
51
+ }
52
+ export function basmTip(value, topic) {
53
+ const obj = basmObject(value);
54
+ requireBASM(obj.topic === topic, 'BASM topic mismatch');
55
+ const blockHeight = basmInteger(obj.blockHeight, 'tip height', -1);
56
+ const tac = basmHash(obj.tac, 'TAC');
57
+ const tip = { topic, blockHeight, tac };
58
+ if (obj.blockHash !== undefined)
59
+ tip.blockHash = basmHash(obj.blockHash, 'block hash');
60
+ if (obj.basmRoot !== undefined)
61
+ tip.basmRoot = basmHash(obj.basmRoot, 'root');
62
+ if (obj.admittedCount !== undefined)
63
+ tip.admittedCount = basmInteger(obj.admittedCount, 'admitted count');
64
+ if (blockHeight === -1)
65
+ requireBASM(tac === BASM_ZERO_HASH, 'Empty BASM tip must have zero TAC');
66
+ return tip;
67
+ }
68
+ export function basmAnchor(value, topic) {
69
+ const obj = basmObject(value);
70
+ const tip = basmTip(value, topic);
71
+ return {
72
+ topic,
73
+ blockHeight: basmInteger(tip.blockHeight, 'anchor height'),
74
+ blockHash: basmHash(obj.blockHash, 'block hash'),
75
+ basmRoot: basmHash(obj.basmRoot, 'root'),
76
+ admittedCount: basmInteger(obj.admittedCount, 'admitted count'),
77
+ tac: tip.tac
78
+ };
79
+ }
80
+ export function basmAdmitted(value, maximum) {
81
+ requireBASM(Array.isArray(value), 'Invalid BASM admitted list');
82
+ requireBASMLimit(value.length <= maximum, 'BASM admitted count exceeds limit');
83
+ let previousIndex = -1;
84
+ const seen = new Set();
85
+ return value.map(item => {
86
+ const obj = basmObject(item);
87
+ const txid = basmHash(obj.txid, 'txid');
88
+ const blockIndex = basmInteger(obj.blockIndex, 'block index');
89
+ requireBASM(blockIndex > previousIndex && !seen.has(txid), 'BASM admitted list must have unique txids in increasing block order');
90
+ previousIndex = blockIndex;
91
+ seen.add(txid);
92
+ return { txid, blockIndex };
93
+ });
94
+ }
95
+ //# sourceMappingURL=BASMValidation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BASMValidation.js","sourceRoot":"","sources":["../../../src/BASMValidation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ import { toHex, toUTF8Strict } from '@bsv/sdk/primitives/utils';
2
+ import { decodeCanonicalPushDrop, ProtoWallet, PublicKey } from '@bsv/sdk';
3
+ const MAX_DISCOVERY_FIELD_BYTES = 4096;
4
+ const MAX_DISCOVERY_PAYLOAD_BYTES = 8192;
5
+ const namePattern = {
6
+ SHIP: /^(?=.{1,50}$)tm_[a-z]+(?:_[a-z]+)*$/,
7
+ SLAP: /^(?=.{1,50}$)ls_[a-z]+(?:_[a-z]+)*$/
8
+ };
9
+ function walletProtocol(protocol) {
10
+ return [2, protocol === 'SHIP' ? 'service host interconnect' : 'service lookup availability'];
11
+ }
12
+ /** Decode and authenticate one canonical SHIP or SLAP PushDrop advertisement. */
13
+ export async function decodeAndVerifyDiscoveryAdvertisement(lockingScript, expectedProtocol) {
14
+ const decoded = decodeCanonicalPushDrop(lockingScript, {
15
+ fieldCount: 5,
16
+ maximumFieldBytes: MAX_DISCOVERY_FIELD_BYTES,
17
+ maximumPayloadBytes: MAX_DISCOVERY_PAYLOAD_BYTES
18
+ });
19
+ const protocol = toUTF8Strict(decoded.fields[0]);
20
+ if (protocol !== expectedProtocol)
21
+ throw new Error('Discovery advertisement protocol mismatch');
22
+ const identityKey = toHex(decoded.fields[1]);
23
+ if (!/^(?:02|03)[0-9a-f]{64}$/.test(identityKey) ||
24
+ PublicKey.fromString(identityKey).toString() !== identityKey) {
25
+ throw new Error('Discovery advertisement identity key is invalid');
26
+ }
27
+ const domain = toUTF8Strict(decoded.fields[2]);
28
+ if (new TextEncoder().encode(domain).byteLength < 1 ||
29
+ new TextEncoder().encode(domain).byteLength > 4096) {
30
+ throw new Error('Discovery advertisement domain is invalid');
31
+ }
32
+ const topicOrService = toUTF8Strict(decoded.fields[3]);
33
+ if (!namePattern[expectedProtocol].test(topicOrService)) {
34
+ throw new Error('Discovery advertisement name is invalid');
35
+ }
36
+ const protocolID = walletProtocol(expectedProtocol);
37
+ const wallet = new ProtoWallet('anyone');
38
+ const { valid } = await wallet.verifySignature({
39
+ data: decoded.fields.slice(0, -1).flat(),
40
+ signature: decoded.fields.at(-1),
41
+ counterparty: identityKey,
42
+ protocolID,
43
+ keyID: '1'
44
+ });
45
+ if (valid !== true)
46
+ throw new Error('Discovery advertisement signature is invalid');
47
+ const { publicKey: expectedLockingKey } = await wallet.getPublicKey({
48
+ counterparty: identityKey,
49
+ protocolID,
50
+ keyID: '1'
51
+ });
52
+ if (expectedLockingKey !== decoded.lockingPublicKey.toString()) {
53
+ throw new Error('Discovery advertisement locking key is not linked to its identity');
54
+ }
55
+ return { protocol: expectedProtocol, identityKey, domain, topicOrService };
56
+ }
57
+ //# sourceMappingURL=DiscoveryAdvertisementValidation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DiscoveryAdvertisementValidation.js","sourceRoot":"","sources":["../../../src/DiscoveryAdvertisementValidation.ts"],"names":[],"mappings":"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"}