@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
@@ -0,0 +1,297 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OVERLAY_ENGINE_POLICY_ID = void 0;
4
+ exports.getOverlayAdmissionHost = getOverlayAdmissionHost;
5
+ exports.overlayAdmissionContextDigest = overlayAdmissionContextDigest;
6
+ exports.overlayAdmissionOperationId = overlayAdmissionOperationId;
7
+ exports.overlayAdmissionMode = overlayAdmissionMode;
8
+ exports.selectNewAdmissionTopics = selectNewAdmissionTopics;
9
+ exports.buildOverlayAdmissionPlan = buildOverlayAdmissionPlan;
10
+ exports.waitForAdmissionReceipt = waitForAdmissionReceipt;
11
+ const node_crypto_1 = require("node:crypto");
12
+ const BASM_js_1 = require("./BASM.js");
13
+ const AdmissionStorage_js_1 = require("./storage/AdmissionStorage.js");
14
+ exports.OVERLAY_ENGINE_POLICY_ID = 'overlay-engine-submit-v1';
15
+ function getOverlayAdmissionHost(storage) {
16
+ var _a, _b, _c;
17
+ const admission = (0, AdmissionStorage_js_1.getAdmissionStorage)(storage);
18
+ if (admission === undefined || typeof storage !== 'object' || storage === null)
19
+ return undefined;
20
+ if (!('admissionScope' in storage))
21
+ return undefined;
22
+ const scope = storage.admissionScope;
23
+ if (scope === undefined ||
24
+ typeof scope.network !== 'string' ||
25
+ typeof scope.genesisHash !== 'string' ||
26
+ typeof scope.nodeId !== 'string' ||
27
+ !/^[0-9a-f]{64}$/.test(scope.genesisHash)) {
28
+ return undefined;
29
+ }
30
+ const host = storage;
31
+ return {
32
+ admission,
33
+ admissionScope: { ...scope },
34
+ // Adapters are class instances whose methods read instance state, so each
35
+ // optional method stays bound to the storage it came from.
36
+ publishAdmissionPayload: (_a = host.publishAdmissionPayload) === null || _a === void 0 ? void 0 : _a.bind(host),
37
+ enlistedIndexTargets: (_b = host.enlistedIndexTargets) === null || _b === void 0 ? void 0 : _b.bind(host),
38
+ getHistoryFence: (_c = host.getHistoryFence) === null || _c === void 0 ? void 0 : _c.bind(host)
39
+ };
40
+ }
41
+ function overlayAdmissionContextDigest(offChainValues) {
42
+ const hash = (0, node_crypto_1.createHash)('sha256');
43
+ if (offChainValues !== undefined)
44
+ hash.update(Buffer.from(offChainValues));
45
+ return hash.digest('hex');
46
+ }
47
+ function overlayAdmissionOperationId(_mode, txid, topics) {
48
+ const topicKey = [...topics].sort((a, b) => a.localeCompare(b, 'en')).join('\n');
49
+ // Historical GASP replay and a later live retry represent the same
50
+ // transaction admission. Keep their id stable so the durable admission
51
+ // record is replayed instead of being submitted a second time.
52
+ const raw = `submit:${txid}:${topicKey}`;
53
+ if (Buffer.byteLength(raw, 'utf8') <= 512 && raw.isWellFormed())
54
+ return raw;
55
+ return `submit:${(0, node_crypto_1.createHash)('sha256').update(raw, 'utf8').digest('hex')}`;
56
+ }
57
+ function overlayAdmissionMode(mode) {
58
+ return mode === 'current-tx' ? 'live' : 'historical';
59
+ }
60
+ async function localPayload(host, kind, bytes, txid) {
61
+ if (host.publishAdmissionPayload !== undefined) {
62
+ return await host.publishAdmissionPayload({ kind, bytes, txid });
63
+ }
64
+ return {
65
+ kind,
66
+ digest: (0, node_crypto_1.createHash)('sha256').update(bytes).digest('hex'),
67
+ byteLength: (0, AdmissionStorage_js_1.asStorageUint64)(String(bytes.byteLength))
68
+ };
69
+ }
70
+ /**
71
+ * Selects the topics that require a new admission decision: topics that did
72
+ * not fail validation, are not already-applied dupes, and actually admit or
73
+ * retain something (or consume a previously-admitted coin). Already-applied
74
+ * (dupe) topics are excluded so that a retry — including a historical GASP
75
+ * replay after a live admit, or a multi-topic resubmit where only some
76
+ * topics were previously applied — never re-submits an admission decision
77
+ * for a topic that MongoAdmissionStorage.assertAppliedAvailable would reject
78
+ * as belonging to a different operation.
79
+ */
80
+ function selectNewAdmissionTopics(validations, failedTopics) {
81
+ return validations.filter(validation => !failedTopics.has(validation.topic) &&
82
+ !validation.isDupe &&
83
+ (validation.admissibleOutputs.outputsToAdmit.length > 0 ||
84
+ validation.admissibleOutputs.coinsToRetain.length > 0 ||
85
+ validation.previousCoins.length > 0));
86
+ }
87
+ async function buildOverlayAdmissionPlan(input) {
88
+ var _a, _b;
89
+ var _c, _d;
90
+ // Only topics with a genuinely new admission get an identity/decision entry
91
+ // and take part in the commit. Dupe topics are still reflected in `steak`
92
+ // below (with their empty admissibleOutputs), matching what the classic
93
+ // storage path already returns for a dupe, but they must never be
94
+ // resubmitted to commitAdmission: MongoAdmissionStorage.assertAppliedAvailable
95
+ // rejects an applied row whose admissionId belongs to a different
96
+ // operation, which a dupe re-included here would trigger on retry.
97
+ const accepted = selectNewAdmissionTopics(input.validations, input.failedTopics);
98
+ const identityTopics = accepted.map(validation => ({
99
+ topic: validation.topic,
100
+ policyId: exports.OVERLAY_ENGINE_POLICY_ID
101
+ }));
102
+ if (identityTopics.length === 0)
103
+ throw new Error('Overlay admission plan has no topics');
104
+ const identity = {
105
+ scope: input.host.admissionScope,
106
+ txid: input.txid,
107
+ mode: input.mode,
108
+ contextDigest: overlayAdmissionContextDigest(input.offChainValues),
109
+ topics: identityTopics
110
+ };
111
+ const raw = await localPayload(input.host, 'raw-transaction', Buffer.from(input.tx.toBinary()), input.txid);
112
+ const payloads = [raw];
113
+ let proof;
114
+ if (input.tx.merklePath !== undefined) {
115
+ proof = await localPayload(input.host, 'merkle-path', Buffer.from(input.tx.merklePath.toBinary()));
116
+ payloads.push(proof);
117
+ }
118
+ const merkle = (0, BASM_js_1.extractMerkleProofMetadata)(input.txid, input.tx.merklePath);
119
+ const decisions = [];
120
+ const steak = {};
121
+ for (const validation of input.validations) {
122
+ steak[validation.topic] = {
123
+ outputsToAdmit: validation.admissibleOutputs.outputsToAdmit,
124
+ coinsToRetain: validation.admissibleOutputs.coinsToRetain,
125
+ coinsRemoved: (_c = validation.admissibleOutputs.coinsRemoved) !== null && _c !== void 0 ? _c : []
126
+ };
127
+ }
128
+ for (const validation of accepted) {
129
+ const { outputsConsumed, outputsToMarkStale } = classifyCoins(input.tx, validation);
130
+ const fence = input.host.getHistoryFence === undefined
131
+ ? { chainEpoch: (0, AdmissionStorage_js_1.asStorageUint64)('0'), topicHistoryGeneration: (0, AdmissionStorage_js_1.asStorageUint64)('0') }
132
+ : await input.host.getHistoryFence(validation.topic);
133
+ const outputs = [];
134
+ for (const outputIndex of validation.admissibleOutputs.outputsToAdmit) {
135
+ const txOut = input.tx.outputs[outputIndex];
136
+ if (typeof (txOut === null || txOut === void 0 ? void 0 : txOut.satoshis) !== 'number' || !Number.isSafeInteger(txOut.satoshis))
137
+ continue;
138
+ const scriptBytes = Buffer.from(txOut.lockingScript.toBinary());
139
+ const script = await localPayload(input.host, 'locking-script', scriptBytes);
140
+ payloads.push(script);
141
+ outputs.push({
142
+ txid: input.txid,
143
+ outputIndex: (0, AdmissionStorage_js_1.asStorageUint64)(String(outputIndex)),
144
+ satoshis: (0, AdmissionStorage_js_1.asStorageUint64)(String(txOut.satoshis)),
145
+ score: (0, AdmissionStorage_js_1.asStorageUint64)(String(Date.now())),
146
+ script: { payload: script, offset: (0, AdmissionStorage_js_1.asStorageUint64)('0'), byteLength: script.byteLength }
147
+ });
148
+ }
149
+ const spends = validation.previousOutputs.flatMap(output => output === null
150
+ ? []
151
+ : [
152
+ {
153
+ outpoint: { txid: output.txid, outputIndex: (0, AdmissionStorage_js_1.asStorageUint64)(String(output.outputIndex)) },
154
+ expectedVersion: '1',
155
+ spender: input.txid
156
+ }
157
+ ]);
158
+ decisions.push({
159
+ topic: validation.topic,
160
+ expectedHistory: fence,
161
+ reads: [],
162
+ spends,
163
+ evictions: outputsToMarkStale.map(item => ({
164
+ txid: item.txid,
165
+ outputIndex: (0, AdmissionStorage_js_1.asStorageUint64)(String(item.previousOutputIndex))
166
+ })),
167
+ outputs,
168
+ edges: outputsConsumed.flatMap(source => outputs.map(output => ({
169
+ source: { txid: source.txid, outputIndex: (0, AdmissionStorage_js_1.asStorageUint64)(String(source.outputIndex)) },
170
+ consumer: { txid: output.txid, outputIndex: output.outputIndex }
171
+ }))),
172
+ applied: appliedRecord(input, proof, merkle)
173
+ });
174
+ steak[validation.topic] = {
175
+ outputsToAdmit: validation.admissibleOutputs.outputsToAdmit,
176
+ coinsToRetain: validation.admissibleOutputs.coinsToRetain,
177
+ coinsRemoved: outputsToMarkStale.map(item => item.inputIndex)
178
+ };
179
+ }
180
+ const enlisted = new Set((_d = (_b = (_a = input.host).enlistedIndexTargets) === null || _b === void 0 ? void 0 : _b.call(_a)) !== null && _d !== void 0 ? _d : []);
181
+ const outbox = Object.keys(input.lookupServices)
182
+ .filter(target => !enlisted.has(target))
183
+ .map(target => ({
184
+ eventId: `${overlayAdmissionOperationId(input.mode, input.txid, input.topics)}:lookup:${target}`,
185
+ kind: 'lookup',
186
+ target,
187
+ payloads: [raw]
188
+ }));
189
+ if (input.includePropagation && input.mode === 'live') {
190
+ outbox.push({
191
+ eventId: `${overlayAdmissionOperationId(input.mode, input.txid, input.topics)}:propagate`,
192
+ kind: 'propagation',
193
+ target: 'ship',
194
+ payloads: [raw]
195
+ });
196
+ }
197
+ return {
198
+ key: {
199
+ scope: input.host.admissionScope,
200
+ operationId: overlayAdmissionOperationId(input.mode, input.txid, input.topics),
201
+ semanticDigest: (0, AdmissionStorage_js_1.admissionSemanticDigest)(identity)
202
+ },
203
+ identity,
204
+ payloads: uniquePayloads(payloads),
205
+ decisions,
206
+ outbox,
207
+ steak: JSON.stringify(steak)
208
+ };
209
+ }
210
+ async function waitForAdmissionReceipt(admission, plan, rebuild) {
211
+ let current = plan;
212
+ for (let attempt = 0; attempt < 8; attempt += 1) {
213
+ const result = await admission.commitAdmission(current);
214
+ if (result.state === 'committed')
215
+ return result;
216
+ if (result.state === 'rejected') {
217
+ if (result.code === 'read-conflict' && attempt < 7) {
218
+ current = await rebuild();
219
+ continue;
220
+ }
221
+ throw new Error(`Overlay admission rejected: ${result.code}`);
222
+ }
223
+ const reconciled = await admission.reconcileAdmission(current.key, result.attemptId);
224
+ if (reconciled.state === 'committed')
225
+ return reconciled;
226
+ if (reconciled.state === 'aborted') {
227
+ current = await rebuild();
228
+ continue;
229
+ }
230
+ if (reconciled.state === 'rejected') {
231
+ throw new Error(`Overlay admission rejected: ${reconciled.code}`);
232
+ }
233
+ }
234
+ throw new Error('Overlay admission commit is pending');
235
+ }
236
+ function appliedRecord(input, proof, merkle) {
237
+ var _a, _b, _c, _d, _e;
238
+ var _f, _g, _h, _j;
239
+ const applied = { txid: input.txid };
240
+ const firstSeen = (_f = (_a = input.applied) === null || _a === void 0 ? void 0 : _a.firstSeenHeight) !== null && _f !== void 0 ? _f : merkle === null || merkle === void 0 ? void 0 : merkle.blockHeight;
241
+ if (firstSeen !== undefined)
242
+ applied.firstSeenHeight = (0, AdmissionStorage_js_1.asStorageUint64)(String(firstSeen));
243
+ if (proof !== undefined)
244
+ applied.proof = proof;
245
+ const blockHash = (_b = input.applied) === null || _b === void 0 ? void 0 : _b.blockHash;
246
+ const height = (_g = (_c = input.applied) === null || _c === void 0 ? void 0 : _c.blockHeight) !== null && _g !== void 0 ? _g : merkle === null || merkle === void 0 ? void 0 : merkle.blockHeight;
247
+ const index = (_h = (_d = input.applied) === null || _d === void 0 ? void 0 : _d.blockIndex) !== null && _h !== void 0 ? _h : merkle === null || merkle === void 0 ? void 0 : merkle.blockIndex;
248
+ const merkleRoot = (_j = (_e = input.applied) === null || _e === void 0 ? void 0 : _e.merkleRoot) !== null && _j !== void 0 ? _j : merkle === null || merkle === void 0 ? void 0 : merkle.merkleRoot;
249
+ if (blockHash !== undefined &&
250
+ height !== undefined &&
251
+ index !== undefined &&
252
+ merkleRoot !== undefined) {
253
+ applied.block = {
254
+ height: (0, AdmissionStorage_js_1.asStorageUint64)(String(height)),
255
+ hash: blockHash,
256
+ index: (0, AdmissionStorage_js_1.asStorageUint64)(String(index)),
257
+ merkleRoot
258
+ };
259
+ }
260
+ return applied;
261
+ }
262
+ function uniquePayloads(payloads) {
263
+ const seen = new Set();
264
+ const result = [];
265
+ for (const payload of payloads) {
266
+ const key = `${payload.kind}:${payload.digest}:${payload.byteLength}`;
267
+ if (seen.has(key))
268
+ continue;
269
+ seen.add(key);
270
+ result.push(payload);
271
+ }
272
+ return result;
273
+ }
274
+ function classifyCoins(tx, validation) {
275
+ var _a;
276
+ var _b;
277
+ const outputsConsumed = [];
278
+ const outputsToMarkStale = [];
279
+ for (const inputIndex of validation.previousCoins) {
280
+ const input = tx.inputs[inputIndex];
281
+ const previousTXID = (_b = input.sourceTXID) !== null && _b !== void 0 ? _b : (_a = input.sourceTransaction) === null || _a === void 0 ? void 0 : _a.id('hex');
282
+ if (typeof previousTXID !== 'string')
283
+ continue;
284
+ if (validation.admissibleOutputs.coinsToRetain.includes(inputIndex)) {
285
+ outputsConsumed.push({ txid: previousTXID, outputIndex: input.sourceOutputIndex });
286
+ }
287
+ else {
288
+ outputsToMarkStale.push({
289
+ txid: previousTXID,
290
+ previousOutputIndex: input.sourceOutputIndex,
291
+ inputIndex
292
+ });
293
+ }
294
+ }
295
+ return { outputsConsumed, outputsToMarkStale };
296
+ }
297
+ //# sourceMappingURL=EngineAdmission.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EngineAdmission.js","sourceRoot":"","sources":["../../../src/EngineAdmission.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,9 @@
1
1
  import { GASPInitialReply, GASPInitialRequest, GASPInitialResponse, GASPNode, GASPNodeResponse, GASPRemote } from '@bsv/gasp';
2
2
  export declare class OverlayGASPRemote implements GASPRemote {
3
- endpointURL: string;
4
- topic: string;
5
- constructor(endpointURL: string, topic: string);
3
+ readonly endpointURL: string;
4
+ readonly topic: string;
5
+ private readonly fetchImpl;
6
+ constructor(endpointURL: string, topic: string, fetchImpl?: typeof fetch);
6
7
  /**
7
8
  * Given an outgoing initial request, sends the request to the foreign instance and obtains their initial response.
8
9
  * @param request
@@ -1 +1 @@
1
- {"version":3,"file":"OverlayGASPRemote.d.ts","sourceRoot":"","sources":["../../../../src/GASP/OverlayGASPRemote.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,QAAQ,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AAE7H,qBAAa,iBAAkB,YAAW,UAAU;IAC9B,WAAW,EAAE,MAAM;IAAS,KAAK,EAAE,MAAM;IAA7D,YAAoB,WAAW,EAAE,MAAM,EAAS,KAAK,EAAE,MAAM,EAAK;IAElE;;;;OAIG;IACG,kBAAkB,CAAE,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAiCnF;IAED;;;;;;;OAOG;IACG,WAAW,CAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAwC3G;IAKK,eAAe,CAAE,SAAS,EAAE,mBAAmB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAEhF;IAIK,UAAU,CAAE,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAExE;CACF"}
1
+ {"version":3,"file":"OverlayGASPRemote.d.ts","sourceRoot":"","sources":["../../../../src/GASP/OverlayGASPRemote.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,QAAQ,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AAe7H,qBAAa,iBAAkB,YAAW,UAAU;IAClD,SAAgB,WAAW,EAAE,MAAM,CAAA;IACnC,SAAgB,KAAK,EAAE,MAAM,CAAA;IAC7B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAc;IAExC,YAAa,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,OAAO,KAAK,EAMxE;IAED;;;;OAIG;IACG,kBAAkB,CAAE,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAmBnF;IAED;;;;;;;OAOG;IACG,WAAW,CAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAyB3G;IAKK,eAAe,CAAE,SAAS,EAAE,mBAAmB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAEhF;IAIK,UAAU,CAAE,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAExE;CACF"}
@@ -1,10 +1,14 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.OverlayGASPRemote = void 0;
4
+ const RemoteSecurity_js_1 = require("../RemoteSecurity.js");
4
5
  class OverlayGASPRemote {
5
- constructor(endpointURL, topic) {
6
- this.endpointURL = endpointURL;
6
+ constructor(endpointURL, topic, fetchImpl) {
7
+ (0, RemoteSecurity_js_1.assertTopic)(topic);
8
+ const secured = (0, RemoteSecurity_js_1.securePeerFetch)(endpointURL, fetchImpl);
9
+ this.endpointURL = secured.endpoint;
7
10
  this.topic = topic;
11
+ this.fetchImpl = secured.fetchImpl;
8
12
  }
9
13
  /**
10
14
  * Given an outgoing initial request, sends the request to the foreign instance and obtains their initial response.
@@ -12,11 +16,14 @@ class OverlayGASPRemote {
12
16
  * @returns
13
17
  */
14
18
  async getInitialResponse(request) {
15
- // Send out an HTTP request to the URL (current host for topic)
16
- // Include the topic in the request
17
- // Parse out response and return correct format
19
+ var _a;
20
+ (0, RemoteSecurity_js_1.assertNonnegativeInteger)(request.since, 'GASP request since');
21
+ const pageLimit = (_a = request.limit) !== null && _a !== void 0 ? _a : RemoteSecurity_js_1.MAX_GASP_PAGE_SIZE;
22
+ if (!Number.isSafeInteger(pageLimit) || pageLimit < 1 || pageLimit > RemoteSecurity_js_1.MAX_GASP_PAGE_SIZE) {
23
+ throw new TypeError(`GASP request limit must be between 1 and ${RemoteSecurity_js_1.MAX_GASP_PAGE_SIZE}`);
24
+ }
18
25
  const url = `${this.endpointURL}/requestSyncResponse`;
19
- const response = await fetch(url, {
26
+ const response = await this.fetchImpl(url, {
20
27
  method: 'POST',
21
28
  headers: {
22
29
  'Content-Type': 'application/json',
@@ -24,22 +31,9 @@ class OverlayGASPRemote {
24
31
  },
25
32
  body: JSON.stringify(request)
26
33
  });
27
- if (!response.ok) {
28
- throw new Error(`HTTP error! Status: ${response.status}`);
29
- }
30
- const result = await response.json();
31
- // Validate and return the response in the correct format
32
- if (!Array.isArray(result.UTXOList) || typeof result.since !== 'number') {
33
- throw new TypeError('Invalid response format');
34
- }
35
- return {
36
- UTXOList: result.UTXOList.map((utxo) => { var _a; return ({
37
- txid: utxo.txid,
38
- outputIndex: utxo.outputIndex,
39
- score: (_a = utxo.score) !== null && _a !== void 0 ? _a : 0
40
- }); }),
41
- since: result.since
42
- };
34
+ const result = await (0, RemoteSecurity_js_1.readPeerJSON)(response);
35
+ (0, RemoteSecurity_js_1.assertGASPInitialResponse)(result, pageLimit);
36
+ return result;
43
37
  }
44
38
  /**
45
39
  * Given an outgoing txid, outputIndex and optional metadata, request the associated GASP node from the foreign instance.
@@ -50,7 +44,11 @@ class OverlayGASPRemote {
50
44
  * @returns
51
45
  */
52
46
  async requestNode(graphID, txid, outputIndex, metadata) {
53
- // Send an HTTP request with the provided info and get back a gaspNode
47
+ (0, RemoteSecurity_js_1.assertOutpoint)(graphID, 'GASP request graphID');
48
+ (0, RemoteSecurity_js_1.assertHash)(txid, 'GASP request txid');
49
+ (0, RemoteSecurity_js_1.assertOutputIndex)(outputIndex, 'GASP request outputIndex');
50
+ if (typeof metadata !== 'boolean')
51
+ throw new TypeError('GASP request metadata flag is invalid');
54
52
  const url = `${this.endpointURL}/requestForeignGASPNode`;
55
53
  const body = {
56
54
  graphID,
@@ -58,31 +56,17 @@ class OverlayGASPRemote {
58
56
  outputIndex,
59
57
  metadata
60
58
  };
61
- const response = await fetch(url, {
59
+ const response = await this.fetchImpl(url, {
62
60
  method: 'POST',
63
61
  headers: {
64
- 'Content-Type': 'application/json'
62
+ 'Content-Type': 'application/json',
63
+ 'X-BSV-Topic': this.topic
65
64
  },
66
65
  body: JSON.stringify(body)
67
66
  });
68
- if (!response.ok) {
69
- throw new Error(`HTTP error! Status: ${response.status}`);
70
- }
71
- const result = await response.json();
72
- // Validate and return the response in the correct format
73
- if (typeof result.graphID !== 'string' || typeof result.rawTx !== 'string' || typeof result.outputIndex !== 'number') {
74
- throw new TypeError('Invalid response format');
75
- }
76
- const gaspNode = {
77
- graphID: result.graphID,
78
- rawTx: result.rawTx,
79
- outputIndex: result.outputIndex,
80
- proof: result.proof,
81
- txMetadata: result.txMetadata,
82
- outputMetadata: result.outputMetadata,
83
- inputs: result.inputs
84
- };
85
- return gaspNode;
67
+ const result = await (0, RemoteSecurity_js_1.readPeerJSON)(response, RemoteSecurity_js_1.MAX_GASP_NODE_JSON_BYTES);
68
+ (0, RemoteSecurity_js_1.assertGASPNode)(result, { graphID, txid, outputIndex });
69
+ return result;
86
70
  }
87
71
  // ---- Now optional methods ----
88
72
  // When are only syncing to them
@@ -1 +1 @@
1
- {"version":3,"file":"OverlayGASPRemote.js","sourceRoot":"","sources":["../../../../src/GASP/OverlayGASPRemote.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"OverlayGASPRemote.js","sourceRoot":"","sources":["../../../../src/GASP/OverlayGASPRemote.ts"],"names":[],"mappings":";;;AACA,4DAY6B;AAE7B;IAKE,YAAa,WAAmB,EAAE,KAAa,EAAE,SAAwB;QACvE,IAAA,+BAAW,EAAC,KAAK,CAAC,CAAA;QAClB,MAAM,OAAO,GAAG,IAAA,mCAAe,EAAC,WAAW,EAAE,SAAS,CAAC,CAAA;QACvD,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAA;QACnC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;QAClB,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAA;IACpC,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,kBAAkB,CAAE,OAA2B;;QACnD,IAAA,4CAAwB,EAAC,OAAO,CAAC,KAAK,EAAE,oBAAoB,CAAC,CAAA;QAC7D,MAAM,SAAS,SAAG,OAAO,CAAC,KAAK,mCAAI,sCAAkB,CAAA;QACrD,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI,SAAS,GAAG,CAAC,IAAI,SAAS,GAAG,sCAAkB,EAAE,CAAC;YACxF,MAAM,IAAI,SAAS,CAAC,4CAA4C,sCAAkB,EAAE,CAAC,CAAA;QACvF,CAAC;QACD,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,WAAW,sBAAsB,CAAA;QACrD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE;YACzC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,aAAa,EAAE,IAAI,CAAC,KAAK;aAC1B;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;SAC9B,CAAC,CAAA;QAEF,MAAM,MAAM,GAAG,MAAM,IAAA,gCAAY,EAAC,QAAQ,CAAC,CAAA;QAC3C,IAAA,6CAAyB,EAAC,MAAM,EAAE,SAAS,CAAC,CAAA;QAC5C,OAAO,MAAM,CAAA;IACf,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,WAAW,CAAE,OAAe,EAAE,IAAY,EAAE,WAAmB,EAAE,QAAiB;QACtF,IAAA,kCAAc,EAAC,OAAO,EAAE,sBAAsB,CAAC,CAAA;QAC/C,IAAA,8BAAU,EAAC,IAAI,EAAE,mBAAmB,CAAC,CAAA;QACrC,IAAA,qCAAiB,EAAC,WAAW,EAAE,0BAA0B,CAAC,CAAA;QAC1D,IAAI,OAAO,QAAQ,KAAK,SAAS;YAAE,MAAM,IAAI,SAAS,CAAC,uCAAuC,CAAC,CAAA;QAC/F,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,WAAW,yBAAyB,CAAA;QACxD,MAAM,IAAI,GAAG;YACX,OAAO;YACP,IAAI;YACJ,WAAW;YACX,QAAQ;SACT,CAAA;QAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE;YACzC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,aAAa,EAAE,IAAI,CAAC,KAAK;aAC1B;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC3B,CAAC,CAAA;QAEF,MAAM,MAAM,GAAG,MAAM,IAAA,gCAAY,EAAC,QAAQ,EAAE,4CAAwB,CAAC,CAAA;QACrE,IAAA,kCAAc,EAAC,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAA;QACtD,OAAO,MAAM,CAAA;IACf,CAAC;IAED,iCAAiC;IAEjC,gCAAgC;IAChC,KAAK,CAAC,eAAe,CAAE,SAA8B;QACnD,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAA;IAC5C,CAAC;IAED,gDAAgD;IAChD,0CAA0C;IAC1C,KAAK,CAAC,UAAU,CAAE,KAAe;QAC/B,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAA;IACnD,CAAC;CACF"}
@@ -22,14 +22,20 @@ export declare class OverlayGASPStorage implements GASPStorage {
22
22
  topic: string;
23
23
  engine: Engine;
24
24
  maxNodesInGraph?: number | undefined;
25
+ maxBytesInGraph: number;
25
26
  readonly temporaryGraphNodeRefs: Record<string, GraphNode>;
27
+ private readonly graphNodeCounts;
28
+ private readonly graphByteCounts;
26
29
  private static activeAnchorValidations;
27
30
  private static readonly anchorValidationQueue;
28
31
  private static activeFinalizations;
29
32
  private static readonly finalizationQueue;
30
33
  private static readonly MAX_CONCURRENT_ANCHOR_VALIDATIONS;
31
34
  private static readonly MAX_CONCURRENT_FINALIZATIONS;
32
- constructor(topic: string, engine: Engine, maxNodesInGraph?: number | undefined);
35
+ constructor(topic: string, engine: Engine, maxNodesInGraph?: number | undefined, maxBytesInGraph?: number);
36
+ private graphNodeKey;
37
+ private graphNode;
38
+ private nodeByteLength;
33
39
  private static acquireAnchorValidationSlot;
34
40
  private static releaseAnchorValidationSlot;
35
41
  private static acquireFinalizationSlot;
@@ -50,10 +56,10 @@ export declare class OverlayGASPStorage implements GASPStorage {
50
56
  */
51
57
  hydrateGASPNode(graphID: string, txid: string, outputIndex: number, _metadata: boolean): Promise<GASPNode>;
52
58
  /**
53
- * For a given node, returns the inputs needed to complete the graph, including whether updated metadata is requested for those inputs.
54
- * @param tx The node for which needed inputs should be found.
55
- * @returns A promise for a mapping of requested input transactions and whether metadata should be provided for each.
56
- */
59
+ * For a given node, returns the inputs needed to complete the graph, including whether updated metadata is requested for those inputs.
60
+ * @param tx The node for which needed inputs should be found.
61
+ * @returns A promise for a mapping of requested input transactions and whether metadata should be provided for each.
62
+ */
57
63
  findNeededInputs(tx: GASPNode): Promise<GASPNodeResponse | undefined>;
58
64
  /**
59
65
  * Ensures that no inputs are requested from foreign nodes before sending any GASP response
@@ -61,21 +67,21 @@ export declare class OverlayGASPStorage implements GASPStorage {
61
67
  */
62
68
  private stripAlreadyKnownInputs;
63
69
  /**
64
- * Appends a new node to a temporary graph.
65
- * @param tx The node to append to this graph.
66
- * @param spentBy Unless this is the same node identified by the graph ID, denotes the TXID and input index for the node which spent this one, in 36-byte format.
67
- * @throws If the node cannot be appended to the graph, either because the graph ID is for a graph the recipient does not want or because the graph has grown to be too large before being finalized.
68
- */
70
+ * Appends a new node to a temporary graph.
71
+ * @param tx The node to append to this graph.
72
+ * @param spentBy Unless this is the same node identified by the graph ID, denotes the TXID and input index for the node which spent this one, in 36-byte format.
73
+ * @throws If the node cannot be appended to the graph, either because the graph ID is for a graph the recipient does not want or because the graph has grown to be too large before being finalized.
74
+ */
69
75
  appendToGraph(tx: GASPNode, spentBy?: string | undefined): Promise<void>;
70
76
  private previousCoinIndexes;
71
77
  private admitHistoricalBEEF;
72
78
  /**
73
- * Checks whether the given graph, in its current state, makes reference only to transactions that are proven in the blockchain, or already known by the recipient to be valid.
74
- * Additionally, in a breadth-first manner (ensuring that all inputs for any given node are processed before nodes that spend them), it ensures that the root node remains valid according to the rules of the overlay's topic manager,
75
- * while considering any coins which the Manager had previously indicated were either valid or invalid.
76
- * @param graphID The TXID and output index (in 36-byte format) for the UTXO at the tip of this graph.
77
- * @throws If the graph is not well-anchored, according to the rules of Bitcoin or the rules of the Overlay Topic Manager.
78
- */
79
+ * Checks whether the given graph, in its current state, makes reference only to transactions that are proven in the blockchain, or already known by the recipient to be valid.
80
+ * Additionally, in a breadth-first manner (ensuring that all inputs for any given node are processed before nodes that spend them), it ensures that the root node remains valid according to the rules of the overlay's topic manager,
81
+ * while considering any coins which the Manager had previously indicated were either valid or invalid.
82
+ * @param graphID The TXID and output index (in 36-byte format) for the UTXO at the tip of this graph.
83
+ * @throws If the graph is not well-anchored, according to the rules of Bitcoin or the rules of the Overlay Topic Manager.
84
+ */
79
85
  validateGraphAnchor(graphID: string): Promise<void>;
80
86
  /**
81
87
  * Deletes all data associated with a temporary graph that has failed to sync, if the graph exists.
@@ -1 +1 @@
1
- {"version":3,"file":"OverlayGASPStorage.d.ts","sourceRoot":"","sources":["../../../../src/GASP/OverlayGASPStorage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AAE/E,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAErC;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;IACnB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACzC,QAAQ,EAAE,SAAS,EAAE,CAAA;IACrB,MAAM,CAAC,EAAE,SAAS,CAAA;CACnB;AAED,qBAAa,kBAAmB,YAAW,WAAW;IAShC,KAAK,EAAE,MAAM;IAAS,MAAM,EAAE,MAAM;IAAS,eAAe,CAAC,EAAE,MAAM;IARzF,QAAQ,CAAC,sBAAsB,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAK;IAC/D,OAAO,CAAC,MAAM,CAAC,uBAAuB,CAAI;IAC1C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAAwB;IACrE,OAAO,CAAC,MAAM,CAAC,mBAAmB,CAAI;IACtC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAwB;IACjE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,iCAAiC,CAAI;IAC7D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,4BAA4B,CAAI;IAExD,YAAoB,KAAK,EAAE,MAAM,EAAS,MAAM,EAAE,MAAM,EAAS,eAAe,CAAC,EAAE,MAAM,YAAA,EAAK;mBAEzE,2BAA2B;IAOhD,OAAO,CAAC,MAAM,CAAC,2BAA2B;mBAQrB,uBAAuB;IAO5C,OAAO,CAAC,MAAM,CAAC,uBAAuB;IAQtC;;;;OAIG;IACG,cAAc,CAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAO1D;IAED;;;;;;;OAOG;IACG,eAAe,CAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAoBhH;IAED;;;;MAIE;IACI,gBAAgB,CAAE,EAAE,EAAE,QAAQ,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CA4C3E;IAED;;;OAGG;YACW,uBAAuB;IAkBrC;;;;;MAKE;IACI,aAAa,CAAE,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAwC9E;IAED,OAAO,CAAC,mBAAmB;YAYb,mBAAmB;IAcjC;;;;;;QAMI;IACE,mBAAmB,CAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAoCzD;IAED;;;OAGG;IACG,YAAY,CAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQlD;IAED;;;OAGG;IACG,aAAa,CAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBnD;IAED;;;;OAIG;IACH,OAAO,CAAC,2BAA2B;IAuBnC;;;;OAIG;IACH,OAAO,CAAC,cAAc;CAsBvB"}
1
+ {"version":3,"file":"OverlayGASPStorage.d.ts","sourceRoot":"","sources":["../../../../src/GASP/OverlayGASPStorage.ts"],"names":[],"mappings":"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"}