neozip-blockchain 0.5.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 (127) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +189 -0
  3. package/dist/browser/TokenVerifierBrowser.d.ts +63 -0
  4. package/dist/browser/TokenVerifierBrowser.d.ts.map +1 -0
  5. package/dist/browser/TokenVerifierBrowser.js +358 -0
  6. package/dist/browser/TokenVerifierBrowser.js.map +1 -0
  7. package/dist/browser/WalletManagerBrowser.d.ts +99 -0
  8. package/dist/browser/WalletManagerBrowser.d.ts.map +1 -0
  9. package/dist/browser/WalletManagerBrowser.js +434 -0
  10. package/dist/browser/WalletManagerBrowser.js.map +1 -0
  11. package/dist/browser/ZipkitMinterBrowser.d.ts +59 -0
  12. package/dist/browser/ZipkitMinterBrowser.d.ts.map +1 -0
  13. package/dist/browser/ZipkitMinterBrowser.js +337 -0
  14. package/dist/browser/ZipkitMinterBrowser.js.map +1 -0
  15. package/dist/browser/index.d.ts +12 -0
  16. package/dist/browser/index.d.ts.map +1 -0
  17. package/dist/browser/index.js +19 -0
  18. package/dist/browser/index.js.map +1 -0
  19. package/dist/constants/index.d.ts +5 -0
  20. package/dist/constants/index.d.ts.map +1 -0
  21. package/dist/constants/index.js +21 -0
  22. package/dist/constants/index.js.map +1 -0
  23. package/dist/constants/metadata.d.ts +18 -0
  24. package/dist/constants/metadata.d.ts.map +1 -0
  25. package/dist/constants/metadata.js +33 -0
  26. package/dist/constants/metadata.js.map +1 -0
  27. package/dist/constants/servers.d.ts +38 -0
  28. package/dist/constants/servers.d.ts.map +1 -0
  29. package/dist/constants/servers.js +54 -0
  30. package/dist/constants/servers.js.map +1 -0
  31. package/dist/core/ContractVersionRegistry.d.ts +63 -0
  32. package/dist/core/ContractVersionRegistry.d.ts.map +1 -0
  33. package/dist/core/ContractVersionRegistry.js +128 -0
  34. package/dist/core/ContractVersionRegistry.js.map +1 -0
  35. package/dist/core/WalletManager.d.ts +123 -0
  36. package/dist/core/WalletManager.d.ts.map +1 -0
  37. package/dist/core/WalletManager.js +360 -0
  38. package/dist/core/WalletManager.js.map +1 -0
  39. package/dist/core/ZipkitMinter.d.ts +155 -0
  40. package/dist/core/ZipkitMinter.d.ts.map +1 -0
  41. package/dist/core/ZipkitMinter.js +625 -0
  42. package/dist/core/ZipkitMinter.js.map +1 -0
  43. package/dist/core/ZipkitVerifier.d.ts +252 -0
  44. package/dist/core/ZipkitVerifier.d.ts.map +1 -0
  45. package/dist/core/ZipkitVerifier.js +1370 -0
  46. package/dist/core/ZipkitVerifier.js.map +1 -0
  47. package/dist/core/adapters/AdapterFactory.d.ts +22 -0
  48. package/dist/core/adapters/AdapterFactory.d.ts.map +1 -0
  49. package/dist/core/adapters/AdapterFactory.js +62 -0
  50. package/dist/core/adapters/AdapterFactory.js.map +1 -0
  51. package/dist/core/adapters/ContractVersionAdapter.d.ts +96 -0
  52. package/dist/core/adapters/ContractVersionAdapter.d.ts.map +1 -0
  53. package/dist/core/adapters/ContractVersionAdapter.js +9 -0
  54. package/dist/core/adapters/ContractVersionAdapter.js.map +1 -0
  55. package/dist/core/adapters/V2_10Adapter.d.ts +24 -0
  56. package/dist/core/adapters/V2_10Adapter.d.ts.map +1 -0
  57. package/dist/core/adapters/V2_10Adapter.js +87 -0
  58. package/dist/core/adapters/V2_10Adapter.js.map +1 -0
  59. package/dist/core/adapters/V2_11Adapter.d.ts +24 -0
  60. package/dist/core/adapters/V2_11Adapter.d.ts.map +1 -0
  61. package/dist/core/adapters/V2_11Adapter.js +87 -0
  62. package/dist/core/adapters/V2_11Adapter.js.map +1 -0
  63. package/dist/core/adapters/V2_50Adapter.d.ts +105 -0
  64. package/dist/core/adapters/V2_50Adapter.d.ts.map +1 -0
  65. package/dist/core/adapters/V2_50Adapter.js +263 -0
  66. package/dist/core/adapters/V2_50Adapter.js.map +1 -0
  67. package/dist/core/contracts.d.ts +169 -0
  68. package/dist/core/contracts.d.ts.map +1 -0
  69. package/dist/core/contracts.js +731 -0
  70. package/dist/core/contracts.js.map +1 -0
  71. package/dist/core/index.d.ts +24 -0
  72. package/dist/core/index.d.ts.map +1 -0
  73. package/dist/core/index.js +82 -0
  74. package/dist/core/index.js.map +1 -0
  75. package/dist/index.d.ts +15 -0
  76. package/dist/index.d.ts.map +1 -0
  77. package/dist/index.js +40 -0
  78. package/dist/index.js.map +1 -0
  79. package/dist/node/WalletManagerNode.d.ts +47 -0
  80. package/dist/node/WalletManagerNode.d.ts.map +1 -0
  81. package/dist/node/WalletManagerNode.js +203 -0
  82. package/dist/node/WalletManagerNode.js.map +1 -0
  83. package/dist/node/index.d.ts +12 -0
  84. package/dist/node/index.d.ts.map +1 -0
  85. package/dist/node/index.js +21 -0
  86. package/dist/node/index.js.map +1 -0
  87. package/dist/ots/ZipkitOTS.d.ts +152 -0
  88. package/dist/ots/ZipkitOTS.d.ts.map +1 -0
  89. package/dist/ots/ZipkitOTS.js +544 -0
  90. package/dist/ots/ZipkitOTS.js.map +1 -0
  91. package/dist/ots/index.d.ts +9 -0
  92. package/dist/ots/index.d.ts.map +1 -0
  93. package/dist/ots/index.js +25 -0
  94. package/dist/ots/index.js.map +1 -0
  95. package/dist/types/index.d.ts +84 -0
  96. package/dist/types/index.d.ts.map +1 -0
  97. package/dist/types/index.js +37 -0
  98. package/dist/types/index.js.map +1 -0
  99. package/dist/utils/Logger.d.ts +73 -0
  100. package/dist/utils/Logger.d.ts.map +1 -0
  101. package/dist/utils/Logger.js +156 -0
  102. package/dist/utils/Logger.js.map +1 -0
  103. package/dist/utils/crc32.d.ts +6 -0
  104. package/dist/utils/crc32.d.ts.map +1 -0
  105. package/dist/utils/crc32.js +23 -0
  106. package/dist/utils/crc32.js.map +1 -0
  107. package/dist/zipstamp-server/CalendarManager.d.ts +238 -0
  108. package/dist/zipstamp-server/CalendarManager.d.ts.map +1 -0
  109. package/dist/zipstamp-server/CalendarManager.js +364 -0
  110. package/dist/zipstamp-server/CalendarManager.js.map +1 -0
  111. package/dist/zipstamp-server/ZipstampServerAPI.d.ts +427 -0
  112. package/dist/zipstamp-server/ZipstampServerAPI.d.ts.map +1 -0
  113. package/dist/zipstamp-server/ZipstampServerAPI.js +696 -0
  114. package/dist/zipstamp-server/ZipstampServerAPI.js.map +1 -0
  115. package/dist/zipstamp-server/ZipstampServerClient.d.ts +590 -0
  116. package/dist/zipstamp-server/ZipstampServerClient.d.ts.map +1 -0
  117. package/dist/zipstamp-server/ZipstampServerClient.js +433 -0
  118. package/dist/zipstamp-server/ZipstampServerClient.js.map +1 -0
  119. package/dist/zipstamp-server/ZipstampServerHelpers.d.ts +430 -0
  120. package/dist/zipstamp-server/ZipstampServerHelpers.d.ts.map +1 -0
  121. package/dist/zipstamp-server/ZipstampServerHelpers.js +503 -0
  122. package/dist/zipstamp-server/ZipstampServerHelpers.js.map +1 -0
  123. package/dist/zipstamp-server/index.d.ts +24 -0
  124. package/dist/zipstamp-server/index.d.ts.map +1 -0
  125. package/dist/zipstamp-server/index.js +67 -0
  126. package/dist/zipstamp-server/index.js.map +1 -0
  127. package/package.json +117 -0
@@ -0,0 +1,364 @@
1
+ "use strict";
2
+ /**
3
+ * CalendarManager - Multi-calendar support for redundancy
4
+ *
5
+ * Similar to OpenTimestamps' approach of submitting to multiple calendars,
6
+ * this class manages multiple Zipstamp server calendars for reliability.
7
+ *
8
+ * **Use Cases:**
9
+ * - Submit timestamps to multiple calendars for redundancy
10
+ * - Verify from any available calendar (failover)
11
+ * - Monitor calendar health and availability
12
+ * - Automatic failover when calendars are unavailable
13
+ *
14
+ * @example
15
+ * ```typescript
16
+ * // Create manager with multiple calendars
17
+ * const manager = new CalendarManager([
18
+ * { url: 'https://alpha.timestamp.neozip.io', priority: 1 },
19
+ * { url: 'https://beta.timestamp.neozip.io', priority: 2 },
20
+ * ]);
21
+ *
22
+ * // Check health of all calendars
23
+ * await manager.checkAllHealth();
24
+ *
25
+ * // Submit to multiple calendars for redundancy
26
+ * const results = await manager.submitToMultiple(digest, chainId);
27
+ * console.log(`Submitted to ${results.successes.length} calendars`);
28
+ *
29
+ * // Verify from any available calendar
30
+ * const verification = await manager.verifyFromAny(digest, chainId, batchId);
31
+ * ```
32
+ */
33
+ Object.defineProperty(exports, "__esModule", { value: true });
34
+ exports.CalendarManager = void 0;
35
+ const ZipstampServerClient_1 = require("./ZipstampServerClient");
36
+ // ============================================================================
37
+ // CalendarManager Class
38
+ // ============================================================================
39
+ class CalendarManager {
40
+ /**
41
+ * Create a new CalendarManager
42
+ *
43
+ * @param calendars - Optional initial list of calendar configurations
44
+ */
45
+ constructor(calendars) {
46
+ this.calendars = [];
47
+ this.statusCache = new Map();
48
+ if (calendars) {
49
+ this.calendars = [...calendars].sort((a, b) => (a.priority ?? 100) - (b.priority ?? 100));
50
+ }
51
+ }
52
+ // ==========================================================================
53
+ // Calendar Management
54
+ // ==========================================================================
55
+ /**
56
+ * Add a calendar server to the manager
57
+ *
58
+ * @param config - Calendar configuration
59
+ */
60
+ addCalendar(config) {
61
+ // Check for duplicate
62
+ if (this.calendars.some(c => c.url === config.url)) {
63
+ throw new Error(`Calendar already exists: ${config.url}`);
64
+ }
65
+ this.calendars.push(config);
66
+ // Re-sort by priority
67
+ this.calendars.sort((a, b) => (a.priority ?? 100) - (b.priority ?? 100));
68
+ }
69
+ /**
70
+ * Remove a calendar server from the manager
71
+ *
72
+ * @param url - URL of the calendar to remove
73
+ * @returns true if removed, false if not found
74
+ */
75
+ removeCalendar(url) {
76
+ const index = this.calendars.findIndex(c => c.url === url);
77
+ if (index === -1)
78
+ return false;
79
+ this.calendars.splice(index, 1);
80
+ this.statusCache.delete(url);
81
+ return true;
82
+ }
83
+ /**
84
+ * Get all configured calendars
85
+ *
86
+ * @returns Copy of the calendar configurations array
87
+ */
88
+ getCalendars() {
89
+ return [...this.calendars];
90
+ }
91
+ /**
92
+ * Get the number of configured calendars
93
+ */
94
+ get count() {
95
+ return this.calendars.length;
96
+ }
97
+ // ==========================================================================
98
+ // Health Checking
99
+ // ==========================================================================
100
+ /**
101
+ * Check health of all configured calendars
102
+ *
103
+ * Updates the internal status cache with results.
104
+ *
105
+ * @returns Array of calendar statuses
106
+ */
107
+ async checkAllHealth() {
108
+ const results = await Promise.all(this.calendars.map(cal => this.checkHealth(cal.url)));
109
+ return results;
110
+ }
111
+ /**
112
+ * Check health of a specific calendar
113
+ *
114
+ * @param url - URL of the calendar to check
115
+ * @returns Calendar status
116
+ */
117
+ async checkHealth(url) {
118
+ const start = Date.now();
119
+ const client = new ZipstampServerClient_1.ZipstampServerClient({
120
+ serverUrl: url,
121
+ timeout: 10000, // 10 second timeout for health checks
122
+ retries: 0, // No retries for health checks
123
+ });
124
+ try {
125
+ const [identity, health] = await Promise.all([
126
+ client.getCalendar().catch(() => undefined),
127
+ client.healthCheck().catch(() => undefined),
128
+ ]);
129
+ const status = {
130
+ url,
131
+ identity,
132
+ health,
133
+ lastChecked: new Date(),
134
+ available: health?.status === 'healthy' || health?.status === 'degraded',
135
+ latencyMs: Date.now() - start,
136
+ };
137
+ this.statusCache.set(url, status);
138
+ return status;
139
+ }
140
+ catch (error) {
141
+ const status = {
142
+ url,
143
+ lastChecked: new Date(),
144
+ available: false,
145
+ latencyMs: Date.now() - start,
146
+ error: error instanceof Error ? error.message : String(error),
147
+ };
148
+ this.statusCache.set(url, status);
149
+ return status;
150
+ }
151
+ }
152
+ /**
153
+ * Get cached status for a calendar
154
+ *
155
+ * @param url - URL of the calendar
156
+ * @returns Cached status or undefined if not checked
157
+ */
158
+ getStatus(url) {
159
+ return this.statusCache.get(url);
160
+ }
161
+ /**
162
+ * Get all cached statuses
163
+ *
164
+ * @returns Map of URL to status
165
+ */
166
+ getAllStatuses() {
167
+ return new Map(this.statusCache);
168
+ }
169
+ /**
170
+ * Get calendars that are currently healthy
171
+ *
172
+ * Returns calendars sorted by priority. If a calendar hasn't been
173
+ * checked yet, it's assumed to be available.
174
+ *
175
+ * @returns Array of healthy calendar configurations
176
+ */
177
+ getHealthyCalendars() {
178
+ return this.calendars.filter(cal => {
179
+ const status = this.statusCache.get(cal.url);
180
+ // If not checked, assume available
181
+ return status?.available ?? true;
182
+ });
183
+ }
184
+ /**
185
+ * Get calendars that are currently unavailable
186
+ *
187
+ * @returns Array of unavailable calendar configurations
188
+ */
189
+ getUnhealthyCalendars() {
190
+ return this.calendars.filter(cal => {
191
+ const status = this.statusCache.get(cal.url);
192
+ return status && !status.available;
193
+ });
194
+ }
195
+ // ==========================================================================
196
+ // Multi-Calendar Operations
197
+ // ==========================================================================
198
+ /**
199
+ * Submit digest to multiple calendars for redundancy
200
+ *
201
+ * Submits to all healthy calendars in parallel. Useful for ensuring
202
+ * your timestamp is recorded by multiple independent servers.
203
+ * Stamping requires a verified email (pass email in the request).
204
+ *
205
+ * @param digest - SHA-256 digest to timestamp
206
+ * @param chainId - Optional chain ID hint
207
+ * @param email - Email address (must be verified on each server)
208
+ * @param options - Multi-calendar options
209
+ * @returns Results from all submission attempts
210
+ * @throws Error if fewer than minSuccess calendars succeed
211
+ */
212
+ async submitToMultiple(digest, chainId, email, options) {
213
+ const healthy = this.getHealthyCalendars();
214
+ const minSuccess = options?.minSuccess ?? 1;
215
+ if (healthy.length === 0) {
216
+ throw new Error('No healthy calendars available');
217
+ }
218
+ const results = await Promise.allSettled(healthy.map(async (cal) => {
219
+ const client = new ZipstampServerClient_1.ZipstampServerClient({
220
+ serverUrl: cal.url,
221
+ timeout: options?.timeout ?? 30000,
222
+ });
223
+ const result = await client.stamp({ digest, chainId, email });
224
+ if (!result.success) {
225
+ throw new Error(result.error || 'Stamp failed');
226
+ }
227
+ return { calendar: cal.url, result };
228
+ }));
229
+ const successes = [];
230
+ const failures = [];
231
+ results.forEach((result, index) => {
232
+ const cal = healthy[index];
233
+ if (result.status === 'fulfilled') {
234
+ successes.push(result.value);
235
+ }
236
+ else {
237
+ failures.push({
238
+ calendar: cal.url,
239
+ error: result.reason instanceof Error ? result.reason.message : String(result.reason),
240
+ });
241
+ }
242
+ });
243
+ if (successes.length < minSuccess) {
244
+ throw new Error(`Failed to submit to minimum ${minSuccess} calendar(s). ` +
245
+ `Successes: ${successes.length}, Failures: ${failures.length}. ` +
246
+ `Errors: ${failures.map(f => f.error).join('; ')}`);
247
+ }
248
+ return { successes, failures };
249
+ }
250
+ /**
251
+ * Verify digest by trying calendars until one succeeds
252
+ *
253
+ * Tries each healthy calendar in priority order until verification
254
+ * succeeds. Useful for failover when a calendar is temporarily unavailable.
255
+ *
256
+ * **Note:** Verification is PUBLIC - no API key required.
257
+ *
258
+ * @param digest - SHA-256 digest to verify
259
+ * @param chainId - Optional chain ID hint
260
+ * @param batchId - Optional batch ID hint
261
+ * @returns Verification result from the first successful calendar
262
+ * @throws Error if no calendar can verify the digest
263
+ */
264
+ async verifyFromAny(digest, chainId, batchId) {
265
+ const healthy = this.getHealthyCalendars();
266
+ const errors = [];
267
+ if (healthy.length === 0) {
268
+ throw new Error('No healthy calendars available');
269
+ }
270
+ for (const cal of healthy) {
271
+ try {
272
+ const client = new ZipstampServerClient_1.ZipstampServerClient({ serverUrl: cal.url });
273
+ const result = await client.verify({ digest, chainId, batchId });
274
+ if (result.success) {
275
+ return { calendar: cal.url, result };
276
+ }
277
+ errors.push(`${cal.url}: ${result.error || 'Verification failed'}`);
278
+ }
279
+ catch (error) {
280
+ const msg = error instanceof Error ? error.message : String(error);
281
+ errors.push(`${cal.url}: ${msg}`);
282
+ // Mark calendar as unhealthy and continue
283
+ const status = this.statusCache.get(cal.url);
284
+ if (status) {
285
+ status.available = false;
286
+ status.error = msg;
287
+ }
288
+ }
289
+ }
290
+ throw new Error(`Failed to verify from any calendar. Errors: ${errors.join('; ')}`);
291
+ }
292
+ /**
293
+ * Poll for confirmation from any calendar
294
+ *
295
+ * Polls healthy calendars until the digest is confirmed or timeout
296
+ * is reached. Returns as soon as any calendar reports confirmation.
297
+ *
298
+ * @param digest - SHA-256 digest to check
299
+ * @param chainId - Optional chain ID hint
300
+ * @param batchId - Optional batch ID hint
301
+ * @param timeout - Maximum time to poll in milliseconds (default: 300000 = 5 minutes)
302
+ * @param interval - Time between polling attempts in milliseconds (default: 10000 = 10 seconds)
303
+ * @returns Verification result if confirmed, null if timeout
304
+ */
305
+ async pollForConfirmation(digest, chainId, batchId, timeout = 300000, interval = 10000) {
306
+ const startTime = Date.now();
307
+ const deadline = startTime + timeout;
308
+ while (Date.now() < deadline) {
309
+ try {
310
+ const result = await this.verifyFromAny(digest, chainId, batchId);
311
+ if (result.result.verified) {
312
+ return result;
313
+ }
314
+ }
315
+ catch {
316
+ // Continue polling
317
+ }
318
+ // Wait before next attempt
319
+ const remaining = deadline - Date.now();
320
+ if (remaining <= 0)
321
+ break;
322
+ await new Promise(resolve => setTimeout(resolve, Math.min(interval, remaining)));
323
+ }
324
+ return null;
325
+ }
326
+ // ==========================================================================
327
+ // Utility Methods
328
+ // ==========================================================================
329
+ /**
330
+ * Create a client for a specific calendar
331
+ *
332
+ * @param url - URL of the calendar (must be configured)
333
+ * @returns ZipstampServerClient instance
334
+ * @throws Error if calendar is not configured
335
+ */
336
+ getClient(url) {
337
+ const config = this.calendars.find(c => c.url === url);
338
+ if (!config) {
339
+ throw new Error(`Calendar not configured: ${url}`);
340
+ }
341
+ return new ZipstampServerClient_1.ZipstampServerClient({
342
+ serverUrl: config.url,
343
+ });
344
+ }
345
+ /**
346
+ * Get client for the highest priority healthy calendar
347
+ *
348
+ * @returns ZipstampServerClient instance or null if no healthy calendars
349
+ */
350
+ getBestClient() {
351
+ const healthy = this.getHealthyCalendars();
352
+ if (healthy.length === 0)
353
+ return null;
354
+ return this.getClient(healthy[0].url);
355
+ }
356
+ /**
357
+ * Clear all cached health statuses
358
+ */
359
+ clearCache() {
360
+ this.statusCache.clear();
361
+ }
362
+ }
363
+ exports.CalendarManager = CalendarManager;
364
+ //# sourceMappingURL=CalendarManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CalendarManager.js","sourceRoot":"","sources":["../../src/zipstamp-server/CalendarManager.ts"],"names":[],"mappings":"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"}