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.
- package/LICENSE +22 -0
- package/README.md +189 -0
- package/dist/browser/TokenVerifierBrowser.d.ts +63 -0
- package/dist/browser/TokenVerifierBrowser.d.ts.map +1 -0
- package/dist/browser/TokenVerifierBrowser.js +358 -0
- package/dist/browser/TokenVerifierBrowser.js.map +1 -0
- package/dist/browser/WalletManagerBrowser.d.ts +99 -0
- package/dist/browser/WalletManagerBrowser.d.ts.map +1 -0
- package/dist/browser/WalletManagerBrowser.js +434 -0
- package/dist/browser/WalletManagerBrowser.js.map +1 -0
- package/dist/browser/ZipkitMinterBrowser.d.ts +59 -0
- package/dist/browser/ZipkitMinterBrowser.d.ts.map +1 -0
- package/dist/browser/ZipkitMinterBrowser.js +337 -0
- package/dist/browser/ZipkitMinterBrowser.js.map +1 -0
- package/dist/browser/index.d.ts +12 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +19 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/constants/index.d.ts +5 -0
- package/dist/constants/index.d.ts.map +1 -0
- package/dist/constants/index.js +21 -0
- package/dist/constants/index.js.map +1 -0
- package/dist/constants/metadata.d.ts +18 -0
- package/dist/constants/metadata.d.ts.map +1 -0
- package/dist/constants/metadata.js +33 -0
- package/dist/constants/metadata.js.map +1 -0
- package/dist/constants/servers.d.ts +38 -0
- package/dist/constants/servers.d.ts.map +1 -0
- package/dist/constants/servers.js +54 -0
- package/dist/constants/servers.js.map +1 -0
- package/dist/core/ContractVersionRegistry.d.ts +63 -0
- package/dist/core/ContractVersionRegistry.d.ts.map +1 -0
- package/dist/core/ContractVersionRegistry.js +128 -0
- package/dist/core/ContractVersionRegistry.js.map +1 -0
- package/dist/core/WalletManager.d.ts +123 -0
- package/dist/core/WalletManager.d.ts.map +1 -0
- package/dist/core/WalletManager.js +360 -0
- package/dist/core/WalletManager.js.map +1 -0
- package/dist/core/ZipkitMinter.d.ts +155 -0
- package/dist/core/ZipkitMinter.d.ts.map +1 -0
- package/dist/core/ZipkitMinter.js +625 -0
- package/dist/core/ZipkitMinter.js.map +1 -0
- package/dist/core/ZipkitVerifier.d.ts +252 -0
- package/dist/core/ZipkitVerifier.d.ts.map +1 -0
- package/dist/core/ZipkitVerifier.js +1370 -0
- package/dist/core/ZipkitVerifier.js.map +1 -0
- package/dist/core/adapters/AdapterFactory.d.ts +22 -0
- package/dist/core/adapters/AdapterFactory.d.ts.map +1 -0
- package/dist/core/adapters/AdapterFactory.js +62 -0
- package/dist/core/adapters/AdapterFactory.js.map +1 -0
- package/dist/core/adapters/ContractVersionAdapter.d.ts +96 -0
- package/dist/core/adapters/ContractVersionAdapter.d.ts.map +1 -0
- package/dist/core/adapters/ContractVersionAdapter.js +9 -0
- package/dist/core/adapters/ContractVersionAdapter.js.map +1 -0
- package/dist/core/adapters/V2_10Adapter.d.ts +24 -0
- package/dist/core/adapters/V2_10Adapter.d.ts.map +1 -0
- package/dist/core/adapters/V2_10Adapter.js +87 -0
- package/dist/core/adapters/V2_10Adapter.js.map +1 -0
- package/dist/core/adapters/V2_11Adapter.d.ts +24 -0
- package/dist/core/adapters/V2_11Adapter.d.ts.map +1 -0
- package/dist/core/adapters/V2_11Adapter.js +87 -0
- package/dist/core/adapters/V2_11Adapter.js.map +1 -0
- package/dist/core/adapters/V2_50Adapter.d.ts +105 -0
- package/dist/core/adapters/V2_50Adapter.d.ts.map +1 -0
- package/dist/core/adapters/V2_50Adapter.js +263 -0
- package/dist/core/adapters/V2_50Adapter.js.map +1 -0
- package/dist/core/contracts.d.ts +169 -0
- package/dist/core/contracts.d.ts.map +1 -0
- package/dist/core/contracts.js +731 -0
- package/dist/core/contracts.js.map +1 -0
- package/dist/core/index.d.ts +24 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +82 -0
- package/dist/core/index.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +40 -0
- package/dist/index.js.map +1 -0
- package/dist/node/WalletManagerNode.d.ts +47 -0
- package/dist/node/WalletManagerNode.d.ts.map +1 -0
- package/dist/node/WalletManagerNode.js +203 -0
- package/dist/node/WalletManagerNode.js.map +1 -0
- package/dist/node/index.d.ts +12 -0
- package/dist/node/index.d.ts.map +1 -0
- package/dist/node/index.js +21 -0
- package/dist/node/index.js.map +1 -0
- package/dist/ots/ZipkitOTS.d.ts +152 -0
- package/dist/ots/ZipkitOTS.d.ts.map +1 -0
- package/dist/ots/ZipkitOTS.js +544 -0
- package/dist/ots/ZipkitOTS.js.map +1 -0
- package/dist/ots/index.d.ts +9 -0
- package/dist/ots/index.d.ts.map +1 -0
- package/dist/ots/index.js +25 -0
- package/dist/ots/index.js.map +1 -0
- package/dist/types/index.d.ts +84 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +37 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/Logger.d.ts +73 -0
- package/dist/utils/Logger.d.ts.map +1 -0
- package/dist/utils/Logger.js +156 -0
- package/dist/utils/Logger.js.map +1 -0
- package/dist/utils/crc32.d.ts +6 -0
- package/dist/utils/crc32.d.ts.map +1 -0
- package/dist/utils/crc32.js +23 -0
- package/dist/utils/crc32.js.map +1 -0
- package/dist/zipstamp-server/CalendarManager.d.ts +238 -0
- package/dist/zipstamp-server/CalendarManager.d.ts.map +1 -0
- package/dist/zipstamp-server/CalendarManager.js +364 -0
- package/dist/zipstamp-server/CalendarManager.js.map +1 -0
- package/dist/zipstamp-server/ZipstampServerAPI.d.ts +427 -0
- package/dist/zipstamp-server/ZipstampServerAPI.d.ts.map +1 -0
- package/dist/zipstamp-server/ZipstampServerAPI.js +696 -0
- package/dist/zipstamp-server/ZipstampServerAPI.js.map +1 -0
- package/dist/zipstamp-server/ZipstampServerClient.d.ts +590 -0
- package/dist/zipstamp-server/ZipstampServerClient.d.ts.map +1 -0
- package/dist/zipstamp-server/ZipstampServerClient.js +433 -0
- package/dist/zipstamp-server/ZipstampServerClient.js.map +1 -0
- package/dist/zipstamp-server/ZipstampServerHelpers.d.ts +430 -0
- package/dist/zipstamp-server/ZipstampServerHelpers.d.ts.map +1 -0
- package/dist/zipstamp-server/ZipstampServerHelpers.js +503 -0
- package/dist/zipstamp-server/ZipstampServerHelpers.js.map +1 -0
- package/dist/zipstamp-server/index.d.ts +24 -0
- package/dist/zipstamp-server/index.d.ts.map +1 -0
- package/dist/zipstamp-server/index.js +67 -0
- package/dist/zipstamp-server/index.js.map +1 -0
- 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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"}
|