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