@thingd/sdk 0.71.0 → 0.72.0
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/package.json +2 -3
- package/dist/client/http-thing-store.d.ts +0 -55
- package/dist/client/http-thing-store.d.ts.map +0 -1
- package/dist/client/http-thing-store.js +0 -233
- package/dist/client/in-memory-thing-store.d.ts +0 -41
- package/dist/client/in-memory-thing-store.d.ts.map +0 -1
- package/dist/client/in-memory-thing-store.js +0 -292
- package/dist/client/index.d.ts +0 -5
- package/dist/client/index.d.ts.map +0 -1
- package/dist/client/index.js +0 -3
- package/dist/client/thingd.d.ts +0 -24
- package/dist/client/thingd.d.ts.map +0 -1
- package/dist/client/thingd.js +0 -27
- package/dist/constants.d.ts +0 -2
- package/dist/constants.d.ts.map +0 -1
- package/dist/constants.js +0 -1
- package/dist/index.d.ts +0 -13
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -11
- package/dist/mcp/audit.d.ts +0 -27
- package/dist/mcp/audit.d.ts.map +0 -1
- package/dist/mcp/audit.js +0 -36
- package/dist/mcp/config.d.ts +0 -22
- package/dist/mcp/config.d.ts.map +0 -1
- package/dist/mcp/config.js +0 -52
- package/dist/mcp/index.d.ts +0 -6
- package/dist/mcp/index.d.ts.map +0 -1
- package/dist/mcp/index.js +0 -5
- package/dist/mcp/result.d.ts +0 -3
- package/dist/mcp/result.d.ts.map +0 -1
- package/dist/mcp/result.js +0 -10
- package/dist/mcp/server.d.ts +0 -19
- package/dist/mcp/server.d.ts.map +0 -1
- package/dist/mcp/server.js +0 -51
- package/dist/mcp/tools.d.ts +0 -10
- package/dist/mcp/tools.d.ts.map +0 -1
- package/dist/mcp/tools.js +0 -1033
- package/dist/memory/index.d.ts +0 -7
- package/dist/memory/index.d.ts.map +0 -1
- package/dist/memory/index.js +0 -7
- package/dist/rest/helpers.d.ts +0 -17
- package/dist/rest/helpers.d.ts.map +0 -1
- package/dist/rest/helpers.js +0 -60
- package/dist/rest/index.d.ts +0 -3
- package/dist/rest/index.d.ts.map +0 -1
- package/dist/rest/index.js +0 -2
- package/dist/rest/server.d.ts +0 -4
- package/dist/rest/server.d.ts.map +0 -1
- package/dist/rest/server.js +0 -472
- package/dist/scheduler.d.ts +0 -28
- package/dist/scheduler.d.ts.map +0 -1
- package/dist/scheduler.js +0 -451
- package/dist/stores/cloud-thing-store.d.ts +0 -63
- package/dist/stores/cloud-thing-store.d.ts.map +0 -1
- package/dist/stores/cloud-thing-store.js +0 -396
- package/dist/stores/in-memory-thing-store.d.ts +0 -62
- package/dist/stores/in-memory-thing-store.d.ts.map +0 -1
- package/dist/stores/in-memory-thing-store.js +0 -709
- package/dist/stores/native-thing-store.d.ts +0 -62
- package/dist/stores/native-thing-store.d.ts.map +0 -1
- package/dist/stores/native-thing-store.js +0 -374
- package/dist/thingd.d.ts +0 -87
- package/dist/thingd.d.ts.map +0 -1
- package/dist/thingd.js +0 -236
- package/dist/types/index.d.ts +0 -2
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/index.js +0 -1
- package/dist/types.d.ts +0 -435
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -1
- package/dist/version.d.ts +0 -6
- package/dist/version.d.ts.map +0 -1
- package/dist/version.js +0 -5
package/dist/scheduler.js
DELETED
|
@@ -1,451 +0,0 @@
|
|
|
1
|
-
const SCHEDULES_COLLECTION = "_schedules";
|
|
2
|
-
const HEARTBEAT_INTERVAL_MS = 1_000;
|
|
3
|
-
function parseIntervalMs(expression) {
|
|
4
|
-
const match = expression.match(/^(\d+)(s|m|h|d)$/);
|
|
5
|
-
if (!match?.[1] || !match[2]) {
|
|
6
|
-
return null;
|
|
7
|
-
}
|
|
8
|
-
const n = Number.parseInt(match[1], 10);
|
|
9
|
-
switch (match[2]) {
|
|
10
|
-
case "s":
|
|
11
|
-
return n * 1_000;
|
|
12
|
-
case "m":
|
|
13
|
-
return n * 60_000;
|
|
14
|
-
case "h":
|
|
15
|
-
return n * 3_600_000;
|
|
16
|
-
case "d":
|
|
17
|
-
return n * 86_400_000;
|
|
18
|
-
default:
|
|
19
|
-
return null;
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
function computeNextRun(expression, _timezone) {
|
|
23
|
-
const intervalMs = parseIntervalMs(expression);
|
|
24
|
-
if (intervalMs !== null) {
|
|
25
|
-
return new Date(Date.now() + intervalMs);
|
|
26
|
-
}
|
|
27
|
-
// Handle "NNNms" style interval expressions
|
|
28
|
-
const msMatch = expression.match(/^(\d+)ms$/);
|
|
29
|
-
if (msMatch?.[1]) {
|
|
30
|
-
return new Date(Date.now() + Number.parseInt(msMatch[1], 10));
|
|
31
|
-
}
|
|
32
|
-
return computeCronNext(expression);
|
|
33
|
-
}
|
|
34
|
-
function computeCronNext(expression) {
|
|
35
|
-
const parts = expression.trim().split(/\s+/);
|
|
36
|
-
if (parts.length < 5 || parts.length > 6) {
|
|
37
|
-
throw new Error(`Invalid cron expression: "${expression}". Expected 5 or 6 fields.`);
|
|
38
|
-
}
|
|
39
|
-
const now = new Date();
|
|
40
|
-
const next = new Date(now);
|
|
41
|
-
next.setMilliseconds(0);
|
|
42
|
-
next.setSeconds(0, 0);
|
|
43
|
-
let minutePart;
|
|
44
|
-
let hourPart;
|
|
45
|
-
if (parts.length === 6) {
|
|
46
|
-
next.setSeconds(Number.parseInt(parts[0] ?? "0", 10), 0);
|
|
47
|
-
minutePart = parts[1] ?? "*";
|
|
48
|
-
hourPart = parts[2] ?? "*";
|
|
49
|
-
}
|
|
50
|
-
else {
|
|
51
|
-
minutePart = parts[0] ?? "*";
|
|
52
|
-
hourPart = parts[1] ?? "*";
|
|
53
|
-
}
|
|
54
|
-
// Handle minute
|
|
55
|
-
if (minutePart === "*") {
|
|
56
|
-
// Keep current minute, advance if needed
|
|
57
|
-
}
|
|
58
|
-
else if (minutePart.includes("/")) {
|
|
59
|
-
const step = Number.parseInt(minutePart.split("/")[1] ?? "1", 10);
|
|
60
|
-
const currentMin = next.getMinutes();
|
|
61
|
-
const nextMin = Math.ceil((currentMin + 1) / step) * step;
|
|
62
|
-
if (nextMin >= 60) {
|
|
63
|
-
next.setMinutes(0);
|
|
64
|
-
next.setHours(next.getHours() + 1);
|
|
65
|
-
}
|
|
66
|
-
else {
|
|
67
|
-
next.setMinutes(nextMin);
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
else {
|
|
71
|
-
next.setMinutes(Number.parseInt(minutePart, 10));
|
|
72
|
-
}
|
|
73
|
-
// Handle hour
|
|
74
|
-
if (hourPart === "*") {
|
|
75
|
-
// Keep current hour
|
|
76
|
-
}
|
|
77
|
-
else if (hourPart.includes("/")) {
|
|
78
|
-
const step = Number.parseInt(hourPart.split("/")[1] ?? "1", 10);
|
|
79
|
-
const currentHour = next.getHours();
|
|
80
|
-
const nextHour = Math.ceil((currentHour + 1) / step) * step;
|
|
81
|
-
if (nextHour >= 24) {
|
|
82
|
-
next.setHours(0);
|
|
83
|
-
next.setDate(next.getDate() + 1);
|
|
84
|
-
}
|
|
85
|
-
else {
|
|
86
|
-
next.setHours(nextHour);
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
else {
|
|
90
|
-
next.setHours(Number.parseInt(hourPart, 10));
|
|
91
|
-
}
|
|
92
|
-
// If the computed time is in the past, advance by 1 minute
|
|
93
|
-
if (next <= now) {
|
|
94
|
-
next.setTime(next.getTime() + 60_000);
|
|
95
|
-
}
|
|
96
|
-
return next;
|
|
97
|
-
}
|
|
98
|
-
function scheduleToStored(schedule) {
|
|
99
|
-
return {
|
|
100
|
-
id: schedule.id,
|
|
101
|
-
collection: SCHEDULES_COLLECTION,
|
|
102
|
-
createdAt: schedule.createdAt,
|
|
103
|
-
updatedAt: schedule.updatedAt,
|
|
104
|
-
version: 0,
|
|
105
|
-
expression: schedule.expression,
|
|
106
|
-
timezone: schedule.timezone,
|
|
107
|
-
payload: schedule.payload,
|
|
108
|
-
enabled: schedule.enabled,
|
|
109
|
-
nextRunAt: schedule.nextRunAt,
|
|
110
|
-
lastRunAt: schedule.lastRunAt,
|
|
111
|
-
lastStatus: schedule.lastStatus,
|
|
112
|
-
lastError: schedule.lastError,
|
|
113
|
-
lastDurationMs: schedule.lastDurationMs,
|
|
114
|
-
runCount: schedule.runCount,
|
|
115
|
-
failCount: schedule.failCount,
|
|
116
|
-
consecutiveFails: schedule.consecutiveFails,
|
|
117
|
-
maxConsecutiveFails: schedule.maxConsecutiveFails,
|
|
118
|
-
metadata: schedule.metadata,
|
|
119
|
-
};
|
|
120
|
-
}
|
|
121
|
-
function storedToSchedule(stored) {
|
|
122
|
-
return {
|
|
123
|
-
id: stored.id,
|
|
124
|
-
expression: stored.expression,
|
|
125
|
-
timezone: stored.timezone,
|
|
126
|
-
payload: stored.payload ?? {},
|
|
127
|
-
enabled: stored.enabled,
|
|
128
|
-
nextRunAt: stored.nextRunAt,
|
|
129
|
-
lastRunAt: stored.lastRunAt,
|
|
130
|
-
lastStatus: stored.lastStatus,
|
|
131
|
-
lastError: stored.lastError,
|
|
132
|
-
lastDurationMs: stored.lastDurationMs,
|
|
133
|
-
runCount: stored.runCount,
|
|
134
|
-
failCount: stored.failCount,
|
|
135
|
-
consecutiveFails: stored.consecutiveFails,
|
|
136
|
-
maxConsecutiveFails: stored.maxConsecutiveFails ?? 5,
|
|
137
|
-
createdAt: stored.createdAt,
|
|
138
|
-
updatedAt: stored.updatedAt,
|
|
139
|
-
metadata: stored.metadata,
|
|
140
|
-
};
|
|
141
|
-
}
|
|
142
|
-
export class Scheduler {
|
|
143
|
-
store;
|
|
144
|
-
handlers = new Map();
|
|
145
|
-
listeners = new Map();
|
|
146
|
-
heartbeatTimer = null;
|
|
147
|
-
running = new Set();
|
|
148
|
-
started = false;
|
|
149
|
-
constructor(store) {
|
|
150
|
-
this.store = store;
|
|
151
|
-
}
|
|
152
|
-
async schedule(id, options) {
|
|
153
|
-
if (!options.expression && !options.intervalMs) {
|
|
154
|
-
throw new Error("Either expression or intervalMs is required");
|
|
155
|
-
}
|
|
156
|
-
const expression = options.expression ?? `${options.intervalMs}ms`;
|
|
157
|
-
const now = new Date().toISOString();
|
|
158
|
-
const intervalMs = options.intervalMs ?? parseIntervalMs(expression);
|
|
159
|
-
const nextRunAt = intervalMs !== null
|
|
160
|
-
? new Date(Date.now() + intervalMs).toISOString()
|
|
161
|
-
: computeNextRun(expression, options.timezone).toISOString();
|
|
162
|
-
const schedule = {
|
|
163
|
-
id,
|
|
164
|
-
expression,
|
|
165
|
-
timezone: options.timezone,
|
|
166
|
-
payload: options.payload ?? {},
|
|
167
|
-
enabled: options.enabled ?? true,
|
|
168
|
-
nextRunAt,
|
|
169
|
-
runCount: 0,
|
|
170
|
-
failCount: 0,
|
|
171
|
-
consecutiveFails: 0,
|
|
172
|
-
maxConsecutiveFails: options.maxConsecutiveFails ?? 5,
|
|
173
|
-
createdAt: now,
|
|
174
|
-
updatedAt: now,
|
|
175
|
-
metadata: options.metadata,
|
|
176
|
-
};
|
|
177
|
-
this.handlers.set(id, options.handler);
|
|
178
|
-
await this.store.put(SCHEDULES_COLLECTION, scheduleToStored(schedule));
|
|
179
|
-
return schedule;
|
|
180
|
-
}
|
|
181
|
-
async scheduleOnce(id, options) {
|
|
182
|
-
const now = new Date().toISOString();
|
|
183
|
-
const schedule = {
|
|
184
|
-
id,
|
|
185
|
-
expression: `once:${options.runAt}`,
|
|
186
|
-
payload: options.payload ?? {},
|
|
187
|
-
enabled: true,
|
|
188
|
-
nextRunAt: options.runAt,
|
|
189
|
-
runCount: 0,
|
|
190
|
-
failCount: 0,
|
|
191
|
-
consecutiveFails: 0,
|
|
192
|
-
maxConsecutiveFails: 1,
|
|
193
|
-
createdAt: now,
|
|
194
|
-
updatedAt: now,
|
|
195
|
-
metadata: options.metadata,
|
|
196
|
-
};
|
|
197
|
-
this.handlers.set(id, options.handler);
|
|
198
|
-
await this.store.put(SCHEDULES_COLLECTION, scheduleToStored(schedule));
|
|
199
|
-
return schedule;
|
|
200
|
-
}
|
|
201
|
-
async scheduleInterval(id, options) {
|
|
202
|
-
const now = new Date().toISOString();
|
|
203
|
-
const nextRunAt = new Date(Date.now() + options.intervalMs).toISOString();
|
|
204
|
-
const schedule = {
|
|
205
|
-
id,
|
|
206
|
-
expression: `${options.intervalMs}ms`,
|
|
207
|
-
payload: options.payload ?? {},
|
|
208
|
-
enabled: options.enabled ?? true,
|
|
209
|
-
nextRunAt,
|
|
210
|
-
runCount: 0,
|
|
211
|
-
failCount: 0,
|
|
212
|
-
consecutiveFails: 0,
|
|
213
|
-
maxConsecutiveFails: options.maxConsecutiveFails ?? 5,
|
|
214
|
-
createdAt: now,
|
|
215
|
-
updatedAt: now,
|
|
216
|
-
metadata: options.metadata,
|
|
217
|
-
};
|
|
218
|
-
this.handlers.set(id, options.handler);
|
|
219
|
-
await this.store.put(SCHEDULES_COLLECTION, scheduleToStored(schedule));
|
|
220
|
-
return schedule;
|
|
221
|
-
}
|
|
222
|
-
async get(id) {
|
|
223
|
-
const stored = await this.store.get(SCHEDULES_COLLECTION, id);
|
|
224
|
-
return stored ? storedToSchedule(stored) : null;
|
|
225
|
-
}
|
|
226
|
-
async list() {
|
|
227
|
-
const stored = await this.store.listObjects(SCHEDULES_COLLECTION);
|
|
228
|
-
return stored.map(storedToSchedule);
|
|
229
|
-
}
|
|
230
|
-
async pause(id) {
|
|
231
|
-
const schedule = await this.get(id);
|
|
232
|
-
if (!schedule) {
|
|
233
|
-
throw new Error(`Schedule "${id}" not found`);
|
|
234
|
-
}
|
|
235
|
-
schedule.enabled = false;
|
|
236
|
-
schedule.updatedAt = new Date().toISOString();
|
|
237
|
-
await this.store.put(SCHEDULES_COLLECTION, scheduleToStored(schedule));
|
|
238
|
-
return schedule;
|
|
239
|
-
}
|
|
240
|
-
async resume(id) {
|
|
241
|
-
const schedule = await this.get(id);
|
|
242
|
-
if (!schedule) {
|
|
243
|
-
throw new Error(`Schedule "${id}" not found`);
|
|
244
|
-
}
|
|
245
|
-
schedule.enabled = true;
|
|
246
|
-
schedule.nextRunAt = computeNextRun(schedule.expression, schedule.timezone).toISOString();
|
|
247
|
-
schedule.updatedAt = new Date().toISOString();
|
|
248
|
-
await this.store.put(SCHEDULES_COLLECTION, scheduleToStored(schedule));
|
|
249
|
-
return schedule;
|
|
250
|
-
}
|
|
251
|
-
async remove(id) {
|
|
252
|
-
const result = await this.store.delete(SCHEDULES_COLLECTION, id);
|
|
253
|
-
this.handlers.delete(id);
|
|
254
|
-
return result.deleted;
|
|
255
|
-
}
|
|
256
|
-
async run(id) {
|
|
257
|
-
const schedule = await this.get(id);
|
|
258
|
-
if (!schedule) {
|
|
259
|
-
throw new Error(`Schedule "${id}" not found`);
|
|
260
|
-
}
|
|
261
|
-
const handler = this.handlers.get(id);
|
|
262
|
-
if (!handler) {
|
|
263
|
-
throw new Error(`No handler registered for schedule "${id}"`);
|
|
264
|
-
}
|
|
265
|
-
await this.executeSchedule(schedule, handler);
|
|
266
|
-
}
|
|
267
|
-
async stats() {
|
|
268
|
-
const all = await this.list();
|
|
269
|
-
const enabled = all.filter((s) => s.enabled);
|
|
270
|
-
const disabled = all.filter((s) => !s.enabled);
|
|
271
|
-
const now = Date.now();
|
|
272
|
-
const future = enabled
|
|
273
|
-
.filter((s) => new Date(s.nextRunAt).getTime() > now)
|
|
274
|
-
.sort((a, b) => new Date(a.nextRunAt).getTime() - new Date(b.nextRunAt).getTime());
|
|
275
|
-
return {
|
|
276
|
-
total: all.length,
|
|
277
|
-
enabled: enabled.length,
|
|
278
|
-
disabled: disabled.length,
|
|
279
|
-
running: this.running.size,
|
|
280
|
-
nextRun: future.length > 0 && future[0] ? { id: future[0].id, at: future[0].nextRunAt } : null,
|
|
281
|
-
};
|
|
282
|
-
}
|
|
283
|
-
async start() {
|
|
284
|
-
if (this.started) {
|
|
285
|
-
return;
|
|
286
|
-
}
|
|
287
|
-
this.started = true;
|
|
288
|
-
const schedules = await this.list();
|
|
289
|
-
for (const s of schedules) {
|
|
290
|
-
if (s.enabled && s.expression.startsWith("once:")) {
|
|
291
|
-
const runAt = new Date(s.expression.replace("once:", ""));
|
|
292
|
-
if (runAt.getTime() <= Date.now()) {
|
|
293
|
-
const handler = this.handlers.get(s.id);
|
|
294
|
-
if (handler) {
|
|
295
|
-
this.executeSchedule(s, handler);
|
|
296
|
-
}
|
|
297
|
-
}
|
|
298
|
-
}
|
|
299
|
-
}
|
|
300
|
-
this.heartbeatTimer = setInterval(() => {
|
|
301
|
-
this.heartbeat();
|
|
302
|
-
}, HEARTBEAT_INTERVAL_MS);
|
|
303
|
-
}
|
|
304
|
-
async stop() {
|
|
305
|
-
if (this.heartbeatTimer) {
|
|
306
|
-
clearInterval(this.heartbeatTimer);
|
|
307
|
-
this.heartbeatTimer = null;
|
|
308
|
-
}
|
|
309
|
-
this.started = false;
|
|
310
|
-
const maxWait = 10_000;
|
|
311
|
-
const start = Date.now();
|
|
312
|
-
while (this.running.size > 0 && Date.now() - start < maxWait) {
|
|
313
|
-
await new Promise((r) => setTimeout(r, 100));
|
|
314
|
-
}
|
|
315
|
-
}
|
|
316
|
-
on(event, listener) {
|
|
317
|
-
if (!this.listeners.has(event)) {
|
|
318
|
-
this.listeners.set(event, new Set());
|
|
319
|
-
}
|
|
320
|
-
this.listeners.get(event)?.add(listener);
|
|
321
|
-
}
|
|
322
|
-
off(event, listener) {
|
|
323
|
-
this.listeners.get(event)?.delete(listener);
|
|
324
|
-
}
|
|
325
|
-
emit(event) {
|
|
326
|
-
const listeners = this.listeners.get(event.status);
|
|
327
|
-
if (listeners) {
|
|
328
|
-
for (const fn of listeners) {
|
|
329
|
-
fn(event);
|
|
330
|
-
}
|
|
331
|
-
}
|
|
332
|
-
}
|
|
333
|
-
async heartbeat() {
|
|
334
|
-
try {
|
|
335
|
-
const schedules = await this.list();
|
|
336
|
-
const now = Date.now();
|
|
337
|
-
for (const schedule of schedules) {
|
|
338
|
-
if (!schedule.enabled || this.running.has(schedule.id)) {
|
|
339
|
-
continue;
|
|
340
|
-
}
|
|
341
|
-
const nextRunTime = new Date(schedule.nextRunAt).getTime();
|
|
342
|
-
if (nextRunTime <= now) {
|
|
343
|
-
const handler = this.handlers.get(schedule.id);
|
|
344
|
-
if (handler) {
|
|
345
|
-
this.executeSchedule(schedule, handler);
|
|
346
|
-
}
|
|
347
|
-
}
|
|
348
|
-
}
|
|
349
|
-
}
|
|
350
|
-
catch {
|
|
351
|
-
// Heartbeat errors are non-fatal
|
|
352
|
-
}
|
|
353
|
-
}
|
|
354
|
-
async executeSchedule(schedule, handler) {
|
|
355
|
-
if (this.running.has(schedule.id)) {
|
|
356
|
-
return;
|
|
357
|
-
}
|
|
358
|
-
this.running.add(schedule.id);
|
|
359
|
-
const startMs = Date.now();
|
|
360
|
-
let failed = false;
|
|
361
|
-
let errorMsg;
|
|
362
|
-
const context = {
|
|
363
|
-
log: () => { },
|
|
364
|
-
fail: (error) => {
|
|
365
|
-
failed = true;
|
|
366
|
-
errorMsg = error;
|
|
367
|
-
},
|
|
368
|
-
};
|
|
369
|
-
this.emit({
|
|
370
|
-
scheduleId: schedule.id,
|
|
371
|
-
expression: schedule.expression,
|
|
372
|
-
status: "started",
|
|
373
|
-
timestamp: new Date().toISOString(),
|
|
374
|
-
runCount: schedule.runCount,
|
|
375
|
-
failCount: schedule.failCount,
|
|
376
|
-
});
|
|
377
|
-
try {
|
|
378
|
-
await handler(schedule, context);
|
|
379
|
-
}
|
|
380
|
-
catch (err) {
|
|
381
|
-
failed = true;
|
|
382
|
-
errorMsg = err instanceof Error ? err.message : String(err);
|
|
383
|
-
}
|
|
384
|
-
const durationMs = Date.now() - startMs;
|
|
385
|
-
const updated = await this.get(schedule.id);
|
|
386
|
-
if (!updated) {
|
|
387
|
-
this.running.delete(schedule.id);
|
|
388
|
-
return;
|
|
389
|
-
}
|
|
390
|
-
if (failed) {
|
|
391
|
-
updated.failCount += 1;
|
|
392
|
-
updated.consecutiveFails += 1;
|
|
393
|
-
updated.lastStatus = "failed";
|
|
394
|
-
updated.lastError = errorMsg;
|
|
395
|
-
updated.lastRunAt = new Date().toISOString();
|
|
396
|
-
updated.lastDurationMs = durationMs;
|
|
397
|
-
updated.updatedAt = new Date().toISOString();
|
|
398
|
-
if (updated.consecutiveFails >= updated.maxConsecutiveFails) {
|
|
399
|
-
updated.enabled = false;
|
|
400
|
-
this.emit({
|
|
401
|
-
scheduleId: updated.id,
|
|
402
|
-
expression: updated.expression,
|
|
403
|
-
status: "disabled",
|
|
404
|
-
timestamp: new Date().toISOString(),
|
|
405
|
-
durationMs,
|
|
406
|
-
error: errorMsg,
|
|
407
|
-
runCount: updated.runCount,
|
|
408
|
-
failCount: updated.failCount,
|
|
409
|
-
});
|
|
410
|
-
}
|
|
411
|
-
this.emit({
|
|
412
|
-
scheduleId: updated.id,
|
|
413
|
-
expression: updated.expression,
|
|
414
|
-
status: "failed",
|
|
415
|
-
timestamp: new Date().toISOString(),
|
|
416
|
-
durationMs,
|
|
417
|
-
error: errorMsg,
|
|
418
|
-
runCount: updated.runCount,
|
|
419
|
-
failCount: updated.failCount,
|
|
420
|
-
});
|
|
421
|
-
}
|
|
422
|
-
else {
|
|
423
|
-
updated.runCount += 1;
|
|
424
|
-
updated.consecutiveFails = 0;
|
|
425
|
-
updated.lastStatus = "completed";
|
|
426
|
-
updated.lastError = undefined;
|
|
427
|
-
updated.lastRunAt = new Date().toISOString();
|
|
428
|
-
updated.lastDurationMs = durationMs;
|
|
429
|
-
updated.updatedAt = new Date().toISOString();
|
|
430
|
-
this.emit({
|
|
431
|
-
scheduleId: updated.id,
|
|
432
|
-
expression: updated.expression,
|
|
433
|
-
status: "completed",
|
|
434
|
-
timestamp: new Date().toISOString(),
|
|
435
|
-
durationMs,
|
|
436
|
-
runCount: updated.runCount,
|
|
437
|
-
failCount: updated.failCount,
|
|
438
|
-
});
|
|
439
|
-
}
|
|
440
|
-
if (updated.enabled) {
|
|
441
|
-
if (updated.expression.startsWith("once:")) {
|
|
442
|
-
updated.enabled = false;
|
|
443
|
-
}
|
|
444
|
-
else {
|
|
445
|
-
updated.nextRunAt = computeNextRun(updated.expression, updated.timezone).toISOString();
|
|
446
|
-
}
|
|
447
|
-
}
|
|
448
|
-
await this.store.put(SCHEDULES_COLLECTION, scheduleToStored(updated));
|
|
449
|
-
this.running.delete(schedule.id);
|
|
450
|
-
}
|
|
451
|
-
}
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
import type { ListEventsOptions, ListObjectsOptions, MemoryEvent, MemoryObject, MemorySearchOptions, MemorySearchResult, PutOptions, QueueClaimOptions, QueueJob, QueueJobOptions, QueueJobPayload, QueueJobResult, QueueNackOptions, StoredMemoryEvent, StoredMemoryObject, ThingDeleteResult, ThingStore, VectorSearchHit, VectorSearchOptions } from "../types.js";
|
|
2
|
-
export type CloudThingStoreOptions = {
|
|
3
|
-
url: string;
|
|
4
|
-
authToken?: string;
|
|
5
|
-
clientName?: string;
|
|
6
|
-
clientVersion?: string;
|
|
7
|
-
};
|
|
8
|
-
export declare class CloudThingStore implements ThingStore {
|
|
9
|
-
private client;
|
|
10
|
-
private readonly connectOptions;
|
|
11
|
-
static open(urlOrOptions: string | CloudThingStoreOptions): Promise<CloudThingStore>;
|
|
12
|
-
private constructor();
|
|
13
|
-
/**
|
|
14
|
-
* Explicitly reconnect the transport — useful if you detect the connection
|
|
15
|
-
* has dropped and want to recover without recreating the store.
|
|
16
|
-
*/
|
|
17
|
-
reconnect(): Promise<void>;
|
|
18
|
-
put(collection: string, object: MemoryObject, options?: PutOptions): Promise<StoredMemoryObject>;
|
|
19
|
-
get<T = StoredMemoryObject>(collection: string, id: string): Promise<T | null>;
|
|
20
|
-
getBatch<T = StoredMemoryObject>(collection: string, ids: string[]): Promise<(T | null)[]>;
|
|
21
|
-
delete(collection: string, id: string): Promise<ThingDeleteResult>;
|
|
22
|
-
listObjects<T = StoredMemoryObject>(collection: string, options?: ListObjectsOptions): Promise<T[]>;
|
|
23
|
-
appendEvent(stream: string, event: MemoryEvent): Promise<StoredMemoryEvent>;
|
|
24
|
-
listEvents<T = StoredMemoryEvent>(stream?: string, options?: ListEventsOptions): Promise<T[]>;
|
|
25
|
-
pushJob(queue: string, payload: QueueJobPayload, options?: QueueJobOptions): Promise<QueueJob>;
|
|
26
|
-
claimJob(queue: string, options?: QueueClaimOptions): Promise<QueueJob | null>;
|
|
27
|
-
ackJob(queue: string, jobId: string): Promise<QueueJobResult>;
|
|
28
|
-
nackJob(queue: string, jobId: string, options?: QueueNackOptions): Promise<QueueJobResult>;
|
|
29
|
-
listJobs(queue: string): Promise<QueueJob[]>;
|
|
30
|
-
listDeadJobs(queue: string): Promise<QueueJob[]>;
|
|
31
|
-
search(query: string, options?: MemorySearchOptions): Promise<MemorySearchResult[]>;
|
|
32
|
-
vectorSearch(collection: string, queryVector: number[], options?: VectorSearchOptions): Promise<VectorSearchHit[]>;
|
|
33
|
-
countObjects(): Promise<number>;
|
|
34
|
-
countObjectsInCollection(collection: string): Promise<number>;
|
|
35
|
-
countEvents(): Promise<number>;
|
|
36
|
-
countActiveJobs(): Promise<number>;
|
|
37
|
-
countDeadJobs(): Promise<number>;
|
|
38
|
-
countLinks(): Promise<number>;
|
|
39
|
-
putBatch(collection: string, objects: import("../types.js").MemoryObject[]): Promise<import("../types.js").StoredMemoryObject[]>;
|
|
40
|
-
deleteBatch(collection: string, ids: string[]): Promise<number>;
|
|
41
|
-
createLink(fromRef: string, linkType: string, toRef: string, weight?: number, metadataJson?: string): Promise<import("../types.js").Link>;
|
|
42
|
-
deleteLink(id: string): Promise<boolean>;
|
|
43
|
-
getLink(id: string): Promise<import("../types.js").Link | null>;
|
|
44
|
-
getNeighbors(reference: string, direction: import("../types.js").LinkDirection, options: import("../types.js").LinkQueryOptions): Promise<import("../types.js").Link[]>;
|
|
45
|
-
listCollections(): Promise<string[]>;
|
|
46
|
-
listStreams(): Promise<string[]>;
|
|
47
|
-
listQueues(): Promise<string[]>;
|
|
48
|
-
createIndex(collection: string, field: string): Promise<void>;
|
|
49
|
-
listIndexes(): Promise<Array<[string, string]>>;
|
|
50
|
-
close(): Promise<void>;
|
|
51
|
-
walCheckpoint(): {
|
|
52
|
-
framesBefore: number;
|
|
53
|
-
framesAfter: number;
|
|
54
|
-
};
|
|
55
|
-
private callTool;
|
|
56
|
-
private restBaseUrl;
|
|
57
|
-
private authHeaders;
|
|
58
|
-
private restGet;
|
|
59
|
-
private restPost;
|
|
60
|
-
private restDelete;
|
|
61
|
-
private callToolOnce;
|
|
62
|
-
}
|
|
63
|
-
//# sourceMappingURL=cloud-thing-store.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cloud-thing-store.d.ts","sourceRoot":"","sources":["../../src/stores/cloud-thing-store.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,iBAAiB,EACjB,kBAAkB,EAClB,WAAW,EACX,YAAY,EACZ,mBAAmB,EACnB,kBAAkB,EAClB,UAAU,EACV,iBAAiB,EACjB,QAAQ,EACR,eAAe,EACf,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,UAAU,EACV,eAAe,EACf,mBAAmB,EACpB,MAAM,aAAa,CAAC;AAGrB,MAAM,MAAM,sBAAsB,GAAG;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,qBAAa,eAAgB,YAAW,UAAU;IA4B9C,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,QAAQ,CAAC,cAAc;IA5BjC,OAAa,IAAI,CAAC,YAAY,EAAE,MAAM,GAAG,sBAAsB,GAAG,OAAO,CAAC,eAAe,CAAC,CAwBzF;IAED,OAAO,eAGH;IAEJ;;;OAGG;IACG,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAoB/B;IAED,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAQ/F;IAED,GAAG,CAAC,CAAC,GAAG,kBAAkB,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAK7E;IAED,QAAQ,CAAC,CAAC,GAAG,kBAAkB,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,CAEzF;IAED,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAKjE;IAED,WAAW,CAAC,CAAC,GAAG,kBAAkB,EAChC,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,CAAC,EAAE,CAAC,CAYd;IAED,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAK1E;IAED,UAAU,CAAC,CAAC,GAAG,iBAAiB,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAe5F;IAED,OAAO,CACL,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,eAAe,EACxB,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,QAAQ,CAAC,CASnB;IAED,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,iBAAsB,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAKjF;IAED,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAK5D;IAED,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,cAAc,CAAC,CAO7F;IAED,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAI3C;IAED,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAI/C;IAED,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAOtF;IAED,YAAY,CACV,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EAAE,EACrB,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,eAAe,EAAE,CAAC,CAO5B;IAEK,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,CAEpC;IAEK,wBAAwB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAElE;IAEK,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC,CAEnC;IAEK,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC,CAEvC;IAEK,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC,CAErC;IAEK,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,CAGlC;IAEK,QAAQ,CACZ,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,OAAO,aAAa,EAAE,YAAY,EAAE,GAC5C,OAAO,CAAC,OAAO,aAAa,EAAE,kBAAkB,EAAE,CAAC,CAErD;IAEK,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAMpE;IAEK,UAAU,CACd,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,MAAM,EACf,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,OAAO,aAAa,EAAE,IAAI,CAAC,CAUrC;IAEK,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAU7C;IAEK,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,aAAa,EAAE,IAAI,GAAG,IAAI,CAAC,CAYpE;IAEK,YAAY,CAChB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,OAAO,aAAa,EAAE,aAAa,EAC9C,OAAO,EAAE,OAAO,aAAa,EAAE,gBAAgB,GAC9C,OAAO,CAAC,OAAO,aAAa,EAAE,IAAI,EAAE,CAAC,CAYvC;IAEK,eAAe,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAEzC;IAEK,WAAW,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAErC;IAEK,UAAU,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAEpC;IAEK,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAElE;IAEK,WAAW,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAEpD;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAE3B;IAED,aAAa,IAAI;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAE7D;YAEa,QAAQ;IAItB,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,WAAW;YAOL,OAAO;YAkBP,QAAQ;YAoBR,UAAU;YAoBV,YAAY;CAiC3B"}
|