@bsv/overlay 2.0.2 → 2.0.4

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 (82) hide show
  1. package/dist/cjs/mod.js +6 -1
  2. package/dist/cjs/mod.js.map +1 -1
  3. package/dist/cjs/package.json +13 -11
  4. package/dist/cjs/src/BASM.js +92 -0
  5. package/dist/cjs/src/BASM.js.map +1 -0
  6. package/dist/cjs/src/BASMRemote.js +43 -0
  7. package/dist/cjs/src/BASMRemote.js.map +1 -0
  8. package/dist/cjs/src/Engine.js +649 -47
  9. package/dist/cjs/src/Engine.js.map +1 -1
  10. package/dist/cjs/src/GASP/OverlayGASPRemote.js +2 -2
  11. package/dist/cjs/src/GASP/OverlayGASPRemote.js.map +1 -1
  12. package/dist/cjs/src/GASP/OverlayGASPStorage.js +18 -25
  13. package/dist/cjs/src/GASP/OverlayGASPStorage.js.map +1 -1
  14. package/dist/cjs/src/storage/knex/KnexStorage.js +329 -12
  15. package/dist/cjs/src/storage/knex/KnexStorage.js.map +1 -1
  16. package/dist/cjs/src/storage/knex/all-migrations.js +3 -1
  17. package/dist/cjs/src/storage/knex/all-migrations.js.map +1 -1
  18. package/dist/cjs/src/storage/knex/migrations/2025-05-28-001-enlarge.js +2 -24
  19. package/dist/cjs/src/storage/knex/migrations/2025-05-28-001-enlarge.js.map +1 -1
  20. package/dist/cjs/src/storage/knex/migrations/2026-05-29-001-brc136-basm.js +114 -0
  21. package/dist/cjs/src/storage/knex/migrations/2026-05-29-001-brc136-basm.js.map +1 -0
  22. package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
  23. package/dist/esm/mod.js +1 -0
  24. package/dist/esm/mod.js.map +1 -1
  25. package/dist/esm/src/BASM.js +85 -0
  26. package/dist/esm/src/BASM.js.map +1 -0
  27. package/dist/esm/src/BASMRemote.js +42 -0
  28. package/dist/esm/src/BASMRemote.js.map +1 -0
  29. package/dist/esm/src/Engine.js +637 -46
  30. package/dist/esm/src/Engine.js.map +1 -1
  31. package/dist/esm/src/GASP/OverlayGASPRemote.js +2 -2
  32. package/dist/esm/src/GASP/OverlayGASPRemote.js.map +1 -1
  33. package/dist/esm/src/GASP/OverlayGASPStorage.js +18 -25
  34. package/dist/esm/src/GASP/OverlayGASPStorage.js.map +1 -1
  35. package/dist/esm/src/storage/knex/KnexStorage.js +323 -12
  36. package/dist/esm/src/storage/knex/KnexStorage.js.map +1 -1
  37. package/dist/esm/src/storage/knex/all-migrations.js +3 -1
  38. package/dist/esm/src/storage/knex/all-migrations.js.map +1 -1
  39. package/dist/esm/src/storage/knex/migrations/2025-05-28-001-enlarge.js +2 -24
  40. package/dist/esm/src/storage/knex/migrations/2025-05-28-001-enlarge.js.map +1 -1
  41. package/dist/esm/src/storage/knex/migrations/2026-05-29-001-brc136-basm.js +109 -0
  42. package/dist/esm/src/storage/knex/migrations/2026-05-29-001-brc136-basm.js.map +1 -0
  43. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
  44. package/dist/types/mod.d.ts +2 -0
  45. package/dist/types/mod.d.ts.map +1 -1
  46. package/dist/types/src/BASM.d.ts +110 -0
  47. package/dist/types/src/BASM.d.ts.map +1 -0
  48. package/dist/types/src/BASMRemote.d.ts +14 -0
  49. package/dist/types/src/BASMRemote.d.ts.map +1 -0
  50. package/dist/types/src/Engine.d.ts +78 -1
  51. package/dist/types/src/Engine.d.ts.map +1 -1
  52. package/dist/types/src/GASP/OverlayGASPStorage.d.ts +1 -1
  53. package/dist/types/src/GASP/OverlayGASPStorage.d.ts.map +1 -1
  54. package/dist/types/src/LookupService.d.ts.map +1 -1
  55. package/dist/types/src/storage/Storage.d.ts +118 -0
  56. package/dist/types/src/storage/Storage.d.ts.map +1 -1
  57. package/dist/types/src/storage/knex/KnexStorage.d.ts +38 -6
  58. package/dist/types/src/storage/knex/KnexStorage.d.ts.map +1 -1
  59. package/dist/types/src/storage/knex/all-migrations.d.ts.map +1 -1
  60. package/dist/types/src/storage/knex/migrations/2025-05-28-001-enlarge.d.ts.map +1 -1
  61. package/dist/types/src/storage/knex/migrations/2026-05-29-001-brc136-basm.d.ts +4 -0
  62. package/dist/types/src/storage/knex/migrations/2026-05-29-001-brc136-basm.d.ts.map +1 -0
  63. package/dist/types/tsconfig.types.tsbuildinfo +1 -1
  64. package/docs/BRC-136-BASM.md +285 -0
  65. package/docs/README.md +2 -0
  66. package/docs/Synchronization.md +10 -1
  67. package/mod.ts +25 -1
  68. package/package.json +25 -23
  69. package/src/BASM.ts +208 -0
  70. package/src/BASMRemote.ts +54 -0
  71. package/src/Engine.ts +762 -47
  72. package/src/GASP/OverlayGASPRemote.ts +2 -2
  73. package/src/GASP/OverlayGASPStorage.ts +17 -22
  74. package/src/LookupService.ts +2 -1
  75. package/src/__tests/BASM.test.ts +44 -0
  76. package/src/__tests/BASMChain.test.ts +290 -0
  77. package/src/__tests/Engine.test.ts +3 -4
  78. package/src/storage/Storage.ts +127 -0
  79. package/src/storage/knex/KnexStorage.ts +376 -14
  80. package/src/storage/knex/all-migrations.ts +3 -1
  81. package/src/storage/knex/migrations/2025-05-28-001-enlarge.ts +2 -22
  82. package/src/storage/knex/migrations/2026-05-29-001-brc136-basm.ts +123 -0
@@ -0,0 +1,114 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.up = up;
4
+ exports.down = down;
5
+ function binaryLargeType(knex) {
6
+ var _a;
7
+ const client = String((_a = knex.client.config.client) !== null && _a !== void 0 ? _a : '').toLowerCase();
8
+ if (client.includes('mysql'))
9
+ return 'longblob';
10
+ if (client.includes('pg'))
11
+ return 'bytea';
12
+ return 'blob';
13
+ }
14
+ async function addColumnIfMissing(knex, tableName, columnName, addColumn) {
15
+ const exists = await knex.schema.hasColumn(tableName, columnName);
16
+ if (!exists) {
17
+ await knex.schema.table(tableName, addColumn);
18
+ }
19
+ }
20
+ async function up(knex) {
21
+ await addColumnIfMissing(knex, 'applied_transactions', 'blockHeight', table => {
22
+ table.integer('blockHeight').unsigned().nullable();
23
+ });
24
+ await addColumnIfMissing(knex, 'applied_transactions', 'blockHash', table => {
25
+ table.string('blockHash', 64).nullable();
26
+ });
27
+ await addColumnIfMissing(knex, 'applied_transactions', 'blockIndex', table => {
28
+ table.integer('blockIndex').unsigned().nullable();
29
+ });
30
+ await addColumnIfMissing(knex, 'applied_transactions', 'merkleRoot', table => {
31
+ table.string('merkleRoot', 64).nullable();
32
+ });
33
+ await addColumnIfMissing(knex, 'applied_transactions', 'firstSeenHeight', table => {
34
+ table.integer('firstSeenHeight').unsigned().nullable();
35
+ });
36
+ await addColumnIfMissing(knex, 'applied_transactions', 'proven', table => {
37
+ table.boolean('proven').notNullable().defaultTo(false);
38
+ });
39
+ await addColumnIfMissing(knex, 'transactions', 'rawTx', table => {
40
+ table.specificType('rawTx', binaryLargeType(knex)).nullable();
41
+ });
42
+ await addColumnIfMissing(knex, 'transactions', 'merklePath', table => {
43
+ table.specificType('merklePath', binaryLargeType(knex)).nullable();
44
+ });
45
+ await addColumnIfMissing(knex, 'transactions', 'blockHeight', table => {
46
+ table.integer('blockHeight').unsigned().nullable();
47
+ });
48
+ await addColumnIfMissing(knex, 'transactions', 'blockHash', table => {
49
+ table.string('blockHash', 64).nullable();
50
+ });
51
+ await addColumnIfMissing(knex, 'transactions', 'blockIndex', table => {
52
+ table.integer('blockIndex').unsigned().nullable();
53
+ });
54
+ await addColumnIfMissing(knex, 'transactions', 'merkleRoot', table => {
55
+ table.string('merkleRoot', 64).nullable();
56
+ });
57
+ await addColumnIfMissing(knex, 'transactions', 'updatedAt', table => {
58
+ table.timestamp('updatedAt').nullable();
59
+ });
60
+ const topicBlockAnchorsExists = await knex.schema.hasTable('topic_block_anchors');
61
+ if (!topicBlockAnchorsExists) {
62
+ await knex.schema.createTable('topic_block_anchors', table => {
63
+ table.increments();
64
+ table.string('topic').notNullable();
65
+ table.integer('blockHeight').unsigned().notNullable();
66
+ table.string('blockHash', 64).notNullable();
67
+ table.string('basmRoot', 64).notNullable();
68
+ table.integer('admittedCount').unsigned().notNullable();
69
+ table.string('tac', 64).notNullable();
70
+ table.timestamp('updatedAt').nullable();
71
+ table.unique(['topic', 'blockHeight'], 'idx_topic_block_anchors_topic_height_unique');
72
+ table.index(['topic', 'blockHeight'], 'idx_topic_block_anchors_topic_height');
73
+ table.index(['topic', 'blockHash'], 'idx_topic_block_anchors_topic_hash');
74
+ });
75
+ }
76
+ const syncStateExists = await knex.schema.hasTable('basm_sync_state');
77
+ if (!syncStateExists) {
78
+ await knex.schema.createTable('basm_sync_state', table => {
79
+ table.string('host').notNullable();
80
+ table.string('topic').notNullable();
81
+ table.integer('lastHeight').unsigned().notNullable().defaultTo(0);
82
+ table.timestamp('updatedAt').nullable();
83
+ table.primary(['host', 'topic']);
84
+ table.index('topic');
85
+ });
86
+ }
87
+ const appliedTopicHeightIndex = 'idx_applied_transactions_topic_height';
88
+ const hasAppliedTopicHeightIndex = await knex.schema.hasTable('applied_transactions');
89
+ if (hasAppliedTopicHeightIndex) {
90
+ await knex.schema.table('applied_transactions', table => {
91
+ table.index(['topic', 'blockHeight', 'blockHash', 'blockIndex'], appliedTopicHeightIndex);
92
+ table.index(['topic', 'proven', 'firstSeenHeight'], 'idx_applied_transactions_unproven');
93
+ });
94
+ }
95
+ }
96
+ async function down(knex) {
97
+ await knex.schema.dropTableIfExists('basm_sync_state');
98
+ await knex.schema.dropTableIfExists('topic_block_anchors');
99
+ await knex.schema.table('applied_transactions', table => {
100
+ table.dropIndex(['topic', 'blockHeight', 'blockHash', 'blockIndex'], 'idx_applied_transactions_topic_height');
101
+ table.dropIndex(['topic', 'proven', 'firstSeenHeight'], 'idx_applied_transactions_unproven');
102
+ });
103
+ for (const column of ['updatedAt', 'merkleRoot', 'blockIndex', 'blockHash', 'blockHeight', 'merklePath', 'rawTx']) {
104
+ if (await knex.schema.hasColumn('transactions', column)) {
105
+ await knex.schema.table('transactions', table => table.dropColumn(column));
106
+ }
107
+ }
108
+ for (const column of ['proven', 'firstSeenHeight', 'merkleRoot', 'blockIndex', 'blockHash', 'blockHeight']) {
109
+ if (await knex.schema.hasColumn('applied_transactions', column)) {
110
+ await knex.schema.table('applied_transactions', table => table.dropColumn(column));
111
+ }
112
+ }
113
+ }
114
+ //# sourceMappingURL=2026-05-29-001-brc136-basm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"2026-05-29-001-brc136-basm.js","sourceRoot":"","sources":["../../../../../../src/storage/knex/migrations/2026-05-29-001-brc136-basm.ts"],"names":[],"mappings":"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"}