@spool-lab/core 0.3.5 → 0.4.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 +11 -0
- package/README.md +8 -5
- package/dist/db/db.d.ts +4 -0
- package/dist/db/db.d.ts.map +1 -1
- package/dist/db/db.js +103 -121
- package/dist/db/db.js.map +1 -1
- package/dist/db/queries.d.ts +9 -14
- package/dist/db/queries.d.ts.map +1 -1
- package/dist/db/queries.js +85 -179
- package/dist/db/queries.js.map +1 -1
- package/dist/index.d.ts +0 -19
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -14
- package/dist/index.js.map +1 -1
- package/dist/sync/watcher.d.ts +38 -8
- package/dist/sync/watcher.d.ts.map +1 -1
- package/dist/sync/watcher.js +158 -43
- package/dist/sync/watcher.js.map +1 -1
- package/dist/types.d.ts +8 -18
- package/dist/types.d.ts.map +1 -1
- package/package.json +3 -10
- package/dist/connectors/capabilities/cookies-chrome.d.ts +0 -19
- package/dist/connectors/capabilities/cookies-chrome.d.ts.map +0 -1
- package/dist/connectors/capabilities/cookies-chrome.js +0 -199
- package/dist/connectors/capabilities/cookies-chrome.js.map +0 -1
- package/dist/connectors/capabilities/exec-impl.d.ts +0 -3
- package/dist/connectors/capabilities/exec-impl.d.ts.map +0 -1
- package/dist/connectors/capabilities/exec-impl.js +0 -108
- package/dist/connectors/capabilities/exec-impl.js.map +0 -1
- package/dist/connectors/capabilities/fetch-impl.d.ts +0 -3
- package/dist/connectors/capabilities/fetch-impl.d.ts.map +0 -1
- package/dist/connectors/capabilities/fetch-impl.js +0 -4
- package/dist/connectors/capabilities/fetch-impl.js.map +0 -1
- package/dist/connectors/capabilities/index.d.ts +0 -6
- package/dist/connectors/capabilities/index.d.ts.map +0 -1
- package/dist/connectors/capabilities/index.js +0 -6
- package/dist/connectors/capabilities/index.js.map +0 -1
- package/dist/connectors/capabilities/log-impl.d.ts +0 -3
- package/dist/connectors/capabilities/log-impl.d.ts.map +0 -1
- package/dist/connectors/capabilities/log-impl.js +0 -26
- package/dist/connectors/capabilities/log-impl.js.map +0 -1
- package/dist/connectors/capabilities/sqlite-impl.d.ts +0 -3
- package/dist/connectors/capabilities/sqlite-impl.d.ts.map +0 -1
- package/dist/connectors/capabilities/sqlite-impl.js +0 -19
- package/dist/connectors/capabilities/sqlite-impl.js.map +0 -1
- package/dist/connectors/loader.d.ts +0 -47
- package/dist/connectors/loader.d.ts.map +0 -1
- package/dist/connectors/loader.js +0 -328
- package/dist/connectors/loader.js.map +0 -1
- package/dist/connectors/npm-install.d.ts +0 -26
- package/dist/connectors/npm-install.d.ts.map +0 -1
- package/dist/connectors/npm-install.js +0 -71
- package/dist/connectors/npm-install.js.map +0 -1
- package/dist/connectors/prerequisites.d.ts +0 -14
- package/dist/connectors/prerequisites.d.ts.map +0 -1
- package/dist/connectors/prerequisites.js +0 -109
- package/dist/connectors/prerequisites.js.map +0 -1
- package/dist/connectors/registry-fetch.d.ts +0 -22
- package/dist/connectors/registry-fetch.d.ts.map +0 -1
- package/dist/connectors/registry-fetch.js +0 -54
- package/dist/connectors/registry-fetch.js.map +0 -1
- package/dist/connectors/registry.d.ts +0 -23
- package/dist/connectors/registry.d.ts.map +0 -1
- package/dist/connectors/registry.js +0 -59
- package/dist/connectors/registry.js.map +0 -1
- package/dist/connectors/sync-engine.d.ts +0 -30
- package/dist/connectors/sync-engine.d.ts.map +0 -1
- package/dist/connectors/sync-engine.js +0 -589
- package/dist/connectors/sync-engine.js.map +0 -1
- package/dist/connectors/sync-scheduler.d.ts +0 -56
- package/dist/connectors/sync-scheduler.d.ts.map +0 -1
- package/dist/connectors/sync-scheduler.js +0 -238
- package/dist/connectors/sync-scheduler.js.map +0 -1
- package/dist/connectors/trust-store.d.ts +0 -13
- package/dist/connectors/trust-store.d.ts.map +0 -1
- package/dist/connectors/trust-store.js +0 -48
- package/dist/connectors/trust-store.js.map +0 -1
- package/dist/connectors/types.d.ts +0 -111
- package/dist/connectors/types.d.ts.map +0 -1
- package/dist/connectors/types.js +0 -50
- package/dist/connectors/types.js.map +0 -1
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
import type { ConnectorSyncResult, SyncJob, ScheduleConfig, SchedulerStatus, SyncProgress } from './types.js';
|
|
2
|
-
import { SyncErrorCode } from './types.js';
|
|
3
|
-
import type { ConnectorRegistry } from './registry.js';
|
|
4
|
-
import type Database from 'better-sqlite3';
|
|
5
|
-
import { ManagedRuntime } from 'effect';
|
|
6
|
-
type Direction = SyncJob['direction'];
|
|
7
|
-
export type SchedulerEvent = {
|
|
8
|
-
type: 'sync-start';
|
|
9
|
-
connectorId: string;
|
|
10
|
-
} | {
|
|
11
|
-
type: 'sync-progress';
|
|
12
|
-
progress: SyncProgress;
|
|
13
|
-
} | {
|
|
14
|
-
type: 'sync-complete';
|
|
15
|
-
result: ConnectorSyncResult;
|
|
16
|
-
} | {
|
|
17
|
-
type: 'sync-error';
|
|
18
|
-
connectorId: string;
|
|
19
|
-
code: SyncErrorCode;
|
|
20
|
-
message: string;
|
|
21
|
-
};
|
|
22
|
-
export type SchedulerEventHandler = (event: SchedulerEvent) => void;
|
|
23
|
-
export declare class SyncScheduler {
|
|
24
|
-
private db;
|
|
25
|
-
private registry;
|
|
26
|
-
private engine;
|
|
27
|
-
private config;
|
|
28
|
-
private queue;
|
|
29
|
-
private running;
|
|
30
|
-
private tickFiber;
|
|
31
|
-
private eventHandlers;
|
|
32
|
-
private runtime;
|
|
33
|
-
private semaphore;
|
|
34
|
-
constructor(db: Database.Database, registry: ConnectorRegistry, config?: Partial<ScheduleConfig>, runtime?: ManagedRuntime.ManagedRuntime<never, never>);
|
|
35
|
-
start(): void;
|
|
36
|
-
stop(): void;
|
|
37
|
-
/** Cancel an in-flight sync and remove queued jobs for a connector. */
|
|
38
|
-
cancelIfRunning(connectorId: string): void;
|
|
39
|
-
/** Manually trigger sync for a specific connector. */
|
|
40
|
-
triggerNow(connectorId: string, direction?: Direction): void;
|
|
41
|
-
/** Notify the scheduler that the system woke from sleep. */
|
|
42
|
-
onWake(): void;
|
|
43
|
-
/** Subscribe to scheduler events. */
|
|
44
|
-
on(handler: SchedulerEventHandler): () => void;
|
|
45
|
-
getStatus(): SchedulerStatus;
|
|
46
|
-
private emit;
|
|
47
|
-
private poke;
|
|
48
|
-
private queueAll;
|
|
49
|
-
private enqueue;
|
|
50
|
-
private tickOnceEffect;
|
|
51
|
-
private drainQueue;
|
|
52
|
-
private runJobEffect;
|
|
53
|
-
private getBackoffMs;
|
|
54
|
-
}
|
|
55
|
-
export {};
|
|
56
|
-
//# sourceMappingURL=sync-scheduler.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sync-scheduler.d.ts","sourceRoot":"","sources":["../../src/connectors/sync-scheduler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,mBAAmB,EACnB,OAAO,EAEP,cAAc,EACd,eAAe,EAEf,YAAY,EACb,MAAM,YAAY,CAAA;AACnB,OAAO,EAAoB,aAAa,EAAE,MAAM,YAAY,CAAA;AAC5D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AAEtD,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAA;AAC1C,OAAO,EAQL,cAAc,EAGf,MAAM,QAAQ,CAAA;AAEf,KAAK,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,CAAA;AAErC,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAC3C;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,QAAQ,EAAE,YAAY,CAAA;CAAE,GACjD;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,MAAM,EAAE,mBAAmB,CAAA;CAAE,GACtD;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,aAAa,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAA;AAErF,MAAM,MAAM,qBAAqB,GAAG,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAA;AAEnE,qBAAa,aAAa;IActB,OAAO,CAAC,EAAE;IACV,OAAO,CAAC,QAAQ;IAdlB,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,KAAK,CAAgB;IAG7B,OAAO,CAAC,OAAO,CAA6C;IAC5D,OAAO,CAAC,SAAS,CAA+C;IAChE,OAAO,CAAC,aAAa,CAA8B;IAEnD,OAAO,CAAC,OAAO,CAA6C;IAC5D,OAAO,CAAC,SAAS,CAAkB;gBAGzB,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,QAAQ,EAAE,iBAAiB,EACnC,MAAM,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,EAChC,OAAO,CAAC,EAAE,cAAc,CAAC,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC;IAUvD,KAAK,IAAI,IAAI;IAoBb,IAAI,IAAI,IAAI;IAeZ,uEAAuE;IACvE,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAS1C,sDAAsD;IACtD,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,GAAE,SAAkB,GAAG,IAAI;IAKpE,4DAA4D;IAC5D,MAAM,IAAI,IAAI;IAKd,qCAAqC;IACrC,EAAE,CAAC,OAAO,EAAE,qBAAqB,GAAG,MAAM,IAAI;IAS9C,SAAS,IAAI,eAAe;IAuB5B,OAAO,CAAC,IAAI;IAMZ,OAAO,CAAC,IAAI;IAIZ,OAAO,CAAC,QAAQ;IAQhB,OAAO,CAAC,OAAO;IAYf,OAAO,CAAC,cAAc;IAqDtB,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,YAAY;IAkEpB,OAAO,CAAC,YAAY;CAIrB"}
|
|
@@ -1,238 +0,0 @@
|
|
|
1
|
-
import { DEFAULT_SCHEDULE, SyncErrorCode } from './types.js';
|
|
2
|
-
import { SyncEngine, loadSyncState } from './sync-engine.js';
|
|
3
|
-
import { Cause, Clock, Deferred, Duration, Effect, Fiber, Layer, ManagedRuntime, pipe, Schedule, } from 'effect';
|
|
4
|
-
export class SyncScheduler {
|
|
5
|
-
db;
|
|
6
|
-
registry;
|
|
7
|
-
engine;
|
|
8
|
-
config;
|
|
9
|
-
queue = [];
|
|
10
|
-
// Per-job cancel tokens. Fired by stop() so in-flight syncs wind down
|
|
11
|
-
// cooperatively (engine checks Deferred.isDone at every loop yield point).
|
|
12
|
-
running = new Map();
|
|
13
|
-
tickFiber = null;
|
|
14
|
-
eventHandlers = [];
|
|
15
|
-
// Production: Layer.empty. Tests inject TestContext.TestContext for TestClock.
|
|
16
|
-
runtime;
|
|
17
|
-
semaphore;
|
|
18
|
-
constructor(db, registry, config, runtime) {
|
|
19
|
-
this.db = db;
|
|
20
|
-
this.registry = registry;
|
|
21
|
-
this.engine = new SyncEngine(db);
|
|
22
|
-
this.config = { ...DEFAULT_SCHEDULE, ...config };
|
|
23
|
-
this.runtime = runtime ?? ManagedRuntime.make(Layer.empty);
|
|
24
|
-
this.semaphore = Effect.runSync(Effect.makeSemaphore(this.config.concurrency));
|
|
25
|
-
}
|
|
26
|
-
// ── Lifecycle ─────────────────────────────────────────────────────────────
|
|
27
|
-
start() {
|
|
28
|
-
if (this.tickFiber)
|
|
29
|
-
return;
|
|
30
|
-
// Queue immediate forward sync synchronously so observers of the queue
|
|
31
|
-
// right after start() see it populated.
|
|
32
|
-
this.queueAll('both', 80);
|
|
33
|
-
const tickProgram = pipe(this.tickOnceEffect(), Effect.repeat(Schedule.spaced(Duration.seconds(30))), Effect.asVoid, Effect.catchAllCause((cause) => Cause.isInterruptedOnly(cause)
|
|
34
|
-
? Effect.void
|
|
35
|
-
: Effect.logError('scheduler tick fiber crashed', cause)));
|
|
36
|
-
this.tickFiber = this.runtime.runFork(tickProgram);
|
|
37
|
-
}
|
|
38
|
-
stop() {
|
|
39
|
-
if (this.tickFiber) {
|
|
40
|
-
// Fire-and-forget interrupt. runJob fibers are siblings (not children),
|
|
41
|
-
// so this does NOT cascade to in-flight syncs — they unwind via the
|
|
42
|
-
// per-job Deferred below.
|
|
43
|
-
this.runtime.runFork(Fiber.interrupt(this.tickFiber));
|
|
44
|
-
this.tickFiber = null;
|
|
45
|
-
}
|
|
46
|
-
for (const [, deferred] of this.running) {
|
|
47
|
-
Effect.runSync(Deferred.succeed(deferred, void 0));
|
|
48
|
-
}
|
|
49
|
-
this.running.clear();
|
|
50
|
-
this.queue = [];
|
|
51
|
-
}
|
|
52
|
-
/** Cancel an in-flight sync and remove queued jobs for a connector. */
|
|
53
|
-
cancelIfRunning(connectorId) {
|
|
54
|
-
const cancel = this.running.get(connectorId);
|
|
55
|
-
if (cancel) {
|
|
56
|
-
Effect.runSync(Deferred.succeed(cancel, void 0));
|
|
57
|
-
this.running.delete(connectorId);
|
|
58
|
-
}
|
|
59
|
-
this.queue = this.queue.filter(j => j.connectorId !== connectorId);
|
|
60
|
-
}
|
|
61
|
-
/** Manually trigger sync for a specific connector. */
|
|
62
|
-
triggerNow(connectorId, direction = 'both') {
|
|
63
|
-
this.enqueue({ connectorId, direction, priority: 100, queuedAt: Date.now() });
|
|
64
|
-
this.poke();
|
|
65
|
-
}
|
|
66
|
-
/** Notify the scheduler that the system woke from sleep. */
|
|
67
|
-
onWake() {
|
|
68
|
-
this.queueAll('forward', 60);
|
|
69
|
-
this.poke();
|
|
70
|
-
}
|
|
71
|
-
/** Subscribe to scheduler events. */
|
|
72
|
-
on(handler) {
|
|
73
|
-
this.eventHandlers.push(handler);
|
|
74
|
-
return () => {
|
|
75
|
-
this.eventHandlers = this.eventHandlers.filter(h => h !== handler);
|
|
76
|
-
};
|
|
77
|
-
}
|
|
78
|
-
// ── Status ────────────────────────────────────────────────────────────────
|
|
79
|
-
getStatus() {
|
|
80
|
-
const connectors = this.registry.list().map(c => {
|
|
81
|
-
const state = loadSyncState(this.db, c.id);
|
|
82
|
-
return {
|
|
83
|
-
id: c.id,
|
|
84
|
-
label: c.label,
|
|
85
|
-
description: c.description,
|
|
86
|
-
platform: c.platform,
|
|
87
|
-
color: c.color,
|
|
88
|
-
enabled: state.enabled,
|
|
89
|
-
syncing: this.running.has(c.id),
|
|
90
|
-
bundled: false,
|
|
91
|
-
version: '0.0.0',
|
|
92
|
-
packageName: '',
|
|
93
|
-
state,
|
|
94
|
-
};
|
|
95
|
-
});
|
|
96
|
-
return { running: this.tickFiber !== null, connectors };
|
|
97
|
-
}
|
|
98
|
-
// ── Internal ──────────────────────────────────────────────────────────────
|
|
99
|
-
emit(event) {
|
|
100
|
-
for (const handler of this.eventHandlers) {
|
|
101
|
-
try {
|
|
102
|
-
handler(event);
|
|
103
|
-
}
|
|
104
|
-
catch { }
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
poke() {
|
|
108
|
-
this.runtime.runFork(this.tickOnceEffect());
|
|
109
|
-
}
|
|
110
|
-
queueAll(direction, priority) {
|
|
111
|
-
for (const connector of this.registry.list()) {
|
|
112
|
-
const state = loadSyncState(this.db, connector.id);
|
|
113
|
-
if (!state.enabled)
|
|
114
|
-
continue;
|
|
115
|
-
this.enqueue({ connectorId: connector.id, direction, priority, queuedAt: Date.now() });
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
enqueue(job) {
|
|
119
|
-
if (this.running.has(job.connectorId))
|
|
120
|
-
return;
|
|
121
|
-
if (this.queue.some(j => j.connectorId === job.connectorId)) {
|
|
122
|
-
this.queue = this.queue.map(j => j.connectorId === job.connectorId && job.priority > j.priority ? job : j);
|
|
123
|
-
return;
|
|
124
|
-
}
|
|
125
|
-
this.queue.push(job);
|
|
126
|
-
this.queue.sort((a, b) => b.priority - a.priority);
|
|
127
|
-
}
|
|
128
|
-
tickOnceEffect() {
|
|
129
|
-
const self = this;
|
|
130
|
-
return Effect.gen(function* () {
|
|
131
|
-
if (self.tickFiber === null)
|
|
132
|
-
return;
|
|
133
|
-
const now = yield* Clock.currentTimeMillis;
|
|
134
|
-
for (const connector of self.registry.list()) {
|
|
135
|
-
const state = loadSyncState(self.db, connector.id);
|
|
136
|
-
if (!state.enabled)
|
|
137
|
-
continue;
|
|
138
|
-
if (state.consecutiveErrors > 0 && state.lastErrorAt) {
|
|
139
|
-
const backoffMs = self.getBackoffMs(state.consecutiveErrors);
|
|
140
|
-
if (now - new Date(state.lastErrorAt).getTime() < backoffMs)
|
|
141
|
-
continue;
|
|
142
|
-
}
|
|
143
|
-
if (state.lastErrorCode?.startsWith('AUTH_'))
|
|
144
|
-
continue;
|
|
145
|
-
const lastForward = state.lastForwardSyncAt
|
|
146
|
-
? new Date(state.lastForwardSyncAt).getTime()
|
|
147
|
-
: 0;
|
|
148
|
-
if (now - lastForward >= self.config.forwardIntervalMs) {
|
|
149
|
-
self.enqueue({
|
|
150
|
-
connectorId: connector.id,
|
|
151
|
-
direction: 'forward',
|
|
152
|
-
priority: 40,
|
|
153
|
-
queuedAt: now,
|
|
154
|
-
});
|
|
155
|
-
}
|
|
156
|
-
if (!state.tailComplete) {
|
|
157
|
-
const lastBackfill = state.lastBackfillSyncAt
|
|
158
|
-
? new Date(state.lastBackfillSyncAt).getTime()
|
|
159
|
-
: 0;
|
|
160
|
-
if (now - lastBackfill >= self.config.backfillIntervalMs) {
|
|
161
|
-
self.enqueue({
|
|
162
|
-
connectorId: connector.id,
|
|
163
|
-
direction: 'backfill',
|
|
164
|
-
priority: 20,
|
|
165
|
-
queuedAt: now,
|
|
166
|
-
});
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
yield* Effect.sync(() => self.drainQueue());
|
|
171
|
-
});
|
|
172
|
-
}
|
|
173
|
-
// Drain queued work up to concurrency. The semaphore is the *real* gate on
|
|
174
|
-
// how many jobs run simultaneously; this loop just submits fibers.
|
|
175
|
-
// Fork as siblings of the tick fiber, NOT children — stop()'s interrupt of
|
|
176
|
-
// the tick fiber must not cascade and short-circuit in-flight state persistence.
|
|
177
|
-
drainQueue() {
|
|
178
|
-
while (this.queue.length > 0 && this.running.size < this.config.concurrency) {
|
|
179
|
-
const job = this.queue.shift();
|
|
180
|
-
this.runtime.runFork(this.runJobEffect(job));
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
runJobEffect(job) {
|
|
184
|
-
const self = this;
|
|
185
|
-
const body = Effect.gen(function* () {
|
|
186
|
-
if (!self.registry.has(job.connectorId))
|
|
187
|
-
return;
|
|
188
|
-
const connector = self.registry.get(job.connectorId);
|
|
189
|
-
const cancel = yield* Deferred.make();
|
|
190
|
-
yield* Effect.sync(() => {
|
|
191
|
-
self.running.set(job.connectorId, cancel);
|
|
192
|
-
});
|
|
193
|
-
yield* Effect.sync(() => self.emit({ type: 'sync-start', connectorId: job.connectorId }));
|
|
194
|
-
const result = yield* self.engine.syncEffect(connector, {
|
|
195
|
-
direction: job.direction,
|
|
196
|
-
delayMs: self.config.pageDelayMs,
|
|
197
|
-
maxMinutes: self.config.maxMinutesPerRun,
|
|
198
|
-
cancel,
|
|
199
|
-
onProgress: (progress) => {
|
|
200
|
-
self.emit({ type: 'sync-progress', progress });
|
|
201
|
-
},
|
|
202
|
-
});
|
|
203
|
-
yield* Effect.sync(() => {
|
|
204
|
-
self.emit({ type: 'sync-complete', result });
|
|
205
|
-
if (result.error) {
|
|
206
|
-
self.emit({
|
|
207
|
-
type: 'sync-error',
|
|
208
|
-
connectorId: job.connectorId,
|
|
209
|
-
code: result.error.code,
|
|
210
|
-
message: result.error.message,
|
|
211
|
-
});
|
|
212
|
-
}
|
|
213
|
-
});
|
|
214
|
-
});
|
|
215
|
-
return pipe(this.semaphore.withPermits(1)(body), Effect.ensuring(Effect.sync(() => {
|
|
216
|
-
self.running.delete(job.connectorId);
|
|
217
|
-
// Drain remaining queue immediately rather than waiting 30s for the
|
|
218
|
-
// next periodic tick. Skips the connector rescan in tickOnceEffect.
|
|
219
|
-
if (self.queue.length > 0 && self.tickFiber !== null) {
|
|
220
|
-
self.drainQueue();
|
|
221
|
-
}
|
|
222
|
-
})), Effect.catchAllCause((cause) => Cause.isInterruptedOnly(cause)
|
|
223
|
-
? Effect.void
|
|
224
|
-
: Effect.sync(() => {
|
|
225
|
-
self.emit({
|
|
226
|
-
type: 'sync-error',
|
|
227
|
-
connectorId: job.connectorId,
|
|
228
|
-
code: SyncErrorCode.CONNECTOR_ERROR,
|
|
229
|
-
message: `runJob defect: ${Cause.pretty(cause)}`,
|
|
230
|
-
});
|
|
231
|
-
})));
|
|
232
|
-
}
|
|
233
|
-
getBackoffMs(consecutiveErrors) {
|
|
234
|
-
const idx = Math.min(consecutiveErrors - 1, this.config.retryBackoffMs.length - 1);
|
|
235
|
-
return this.config.retryBackoffMs[idx] ?? this.config.retryBackoffMs.at(-1) ?? 60_000;
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
//# sourceMappingURL=sync-scheduler.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sync-scheduler.js","sourceRoot":"","sources":["../../src/connectors/sync-scheduler.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
export declare class TrustStore {
|
|
2
|
-
private readonly spoolDir;
|
|
3
|
-
private trusted;
|
|
4
|
-
private readonly configPath;
|
|
5
|
-
private configData;
|
|
6
|
-
constructor(spoolDir: string);
|
|
7
|
-
isTrusted(packageName: string): boolean;
|
|
8
|
-
add(packageName: string): void;
|
|
9
|
-
remove(packageName: string): void;
|
|
10
|
-
private save;
|
|
11
|
-
private readConfig;
|
|
12
|
-
}
|
|
13
|
-
//# sourceMappingURL=trust-store.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"trust-store.d.ts","sourceRoot":"","sources":["../../src/connectors/trust-store.ts"],"names":[],"mappings":"AAMA,qBAAa,UAAU;IAKT,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAJrC,OAAO,CAAC,OAAO,CAAa;IAC5B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAQ;IACnC,OAAO,CAAC,UAAU,CAAyB;gBAEd,QAAQ,EAAE,MAAM;IAS7C,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO;IAKvC,GAAG,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAK9B,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAKjC,OAAO,CAAC,IAAI;IAMZ,OAAO,CAAC,UAAU;CAQnB"}
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
2
|
-
import { join } from 'node:path';
|
|
3
|
-
const FIRST_PARTY_SCOPE = '@spool-lab/';
|
|
4
|
-
const CONFIG_FILE = 'config.json';
|
|
5
|
-
export class TrustStore {
|
|
6
|
-
spoolDir;
|
|
7
|
-
trusted;
|
|
8
|
-
configPath;
|
|
9
|
-
configData;
|
|
10
|
-
constructor(spoolDir) {
|
|
11
|
-
this.spoolDir = spoolDir;
|
|
12
|
-
this.configPath = join(spoolDir, CONFIG_FILE);
|
|
13
|
-
this.configData = this.readConfig();
|
|
14
|
-
const list = Array.isArray(this.configData['trustedConnectors'])
|
|
15
|
-
? this.configData['trustedConnectors']
|
|
16
|
-
: [];
|
|
17
|
-
this.trusted = new Set(list);
|
|
18
|
-
}
|
|
19
|
-
isTrusted(packageName) {
|
|
20
|
-
if (packageName.startsWith(FIRST_PARTY_SCOPE))
|
|
21
|
-
return true;
|
|
22
|
-
return this.trusted.has(packageName);
|
|
23
|
-
}
|
|
24
|
-
add(packageName) {
|
|
25
|
-
this.trusted.add(packageName);
|
|
26
|
-
this.save();
|
|
27
|
-
}
|
|
28
|
-
remove(packageName) {
|
|
29
|
-
this.trusted.delete(packageName);
|
|
30
|
-
this.save();
|
|
31
|
-
}
|
|
32
|
-
save() {
|
|
33
|
-
mkdirSync(this.spoolDir, { recursive: true });
|
|
34
|
-
this.configData['trustedConnectors'] = [...this.trusted];
|
|
35
|
-
writeFileSync(this.configPath, JSON.stringify(this.configData, null, 2), 'utf8');
|
|
36
|
-
}
|
|
37
|
-
readConfig() {
|
|
38
|
-
if (!existsSync(this.configPath))
|
|
39
|
-
return {};
|
|
40
|
-
try {
|
|
41
|
-
return JSON.parse(readFileSync(this.configPath, 'utf8'));
|
|
42
|
-
}
|
|
43
|
-
catch {
|
|
44
|
-
return {};
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
//# sourceMappingURL=trust-store.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"trust-store.js","sourceRoot":"","sources":["../../src/connectors/trust-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAC5E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC,MAAM,iBAAiB,GAAG,aAAa,CAAA;AACvC,MAAM,WAAW,GAAG,aAAa,CAAA;AAEjC,MAAM,OAAO,UAAU;IAKQ;IAJrB,OAAO,CAAa;IACX,UAAU,CAAQ;IAC3B,UAAU,CAAyB;IAE3C,YAA6B,QAAgB;QAAhB,aAAQ,GAAR,QAAQ,CAAQ;QAC3C,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAA;QAC7C,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,CAAA;QACnC,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,mBAAmB,CAAC,CAAC;YAC9D,CAAC,CAAE,IAAI,CAAC,UAAU,CAAC,mBAAmB,CAAc;YACpD,CAAC,CAAC,EAAE,CAAA;QACN,IAAI,CAAC,OAAO,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAA;IAC9B,CAAC;IAED,SAAS,CAAC,WAAmB;QAC3B,IAAI,WAAW,CAAC,UAAU,CAAC,iBAAiB,CAAC;YAAE,OAAO,IAAI,CAAA;QAC1D,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;IACtC,CAAC;IAED,GAAG,CAAC,WAAmB;QACrB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;QAC7B,IAAI,CAAC,IAAI,EAAE,CAAA;IACb,CAAC;IAED,MAAM,CAAC,WAAmB;QACxB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAAA;QAChC,IAAI,CAAC,IAAI,EAAE,CAAA;IACb,CAAC;IAEO,IAAI;QACV,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QAC7C,IAAI,CAAC,UAAU,CAAC,mBAAmB,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAA;QACxD,aAAa,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAA;IAClF,CAAC;IAEO,UAAU;QAChB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC;YAAE,OAAO,EAAE,CAAA;QAC3C,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAA;QAC1D,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAA;QACX,CAAC;IACH,CAAC;CACF"}
|
|
@@ -1,111 +0,0 @@
|
|
|
1
|
-
import type { Deferred } from 'effect';
|
|
2
|
-
import type { Connector, SyncState } from '@spool-lab/connector-sdk';
|
|
3
|
-
import { SyncErrorCode } from '@spool-lab/connector-sdk';
|
|
4
|
-
export { SyncErrorCode, SYNC_ERROR_HINTS, } from '@spool-lab/connector-sdk';
|
|
5
|
-
export type { Connector, AuthStatus, PageResult, FetchContext, CapturedItem, SyncState, } from '@spool-lab/connector-sdk';
|
|
6
|
-
declare const SyncError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
|
|
7
|
-
readonly _tag: "SyncError";
|
|
8
|
-
} & Readonly<A>;
|
|
9
|
-
/**
|
|
10
|
-
* Internal Effect-tagged version of SyncError used inside @spool-lab/core for
|
|
11
|
-
* Effect's typed error channel. External callers (connectors) use the plain
|
|
12
|
-
* class exported from @spool-lab/connector-sdk. Translation between the two
|
|
13
|
-
* happens in SyncError.from().
|
|
14
|
-
*/
|
|
15
|
-
export declare class SyncError extends SyncError_base<{
|
|
16
|
-
readonly code: SyncErrorCode;
|
|
17
|
-
readonly message: string;
|
|
18
|
-
readonly cause?: unknown;
|
|
19
|
-
}> {
|
|
20
|
-
constructor(code: SyncErrorCode, message?: string, cause?: unknown);
|
|
21
|
-
static from(e: unknown): SyncError;
|
|
22
|
-
/** Whether this error indicates the connector needs re-authentication. */
|
|
23
|
-
get needsReauth(): boolean;
|
|
24
|
-
/** Whether this error is transient and the sync can be retried. */
|
|
25
|
-
get retryable(): boolean;
|
|
26
|
-
}
|
|
27
|
-
export interface SyncOptions {
|
|
28
|
-
/** Which direction to sync. Default: 'both'. */
|
|
29
|
-
direction?: 'forward' | 'backfill' | 'both';
|
|
30
|
-
/** Delay between page requests in ms. Default: 600. */
|
|
31
|
-
delayMs?: number;
|
|
32
|
-
/** Max runtime in minutes. 0 = unlimited. Default: 0 (no limit). */
|
|
33
|
-
maxMinutes?: number;
|
|
34
|
-
/** Consecutive pages with 0 new items before stopping forward sync. Default: 3. */
|
|
35
|
-
stalePageLimit?: number;
|
|
36
|
-
/** Hard cap on total pages fetched per sync run. Default: 100. */
|
|
37
|
-
maxPages?: number;
|
|
38
|
-
/** AbortSignal for cancellation. */
|
|
39
|
-
signal?: AbortSignal;
|
|
40
|
-
/**
|
|
41
|
-
* Caller-owned cancellation Deferred. When provided, syncEffect uses this
|
|
42
|
-
* instead of creating its own — allowing callers like SyncScheduler to
|
|
43
|
-
* cancel from outside. If `signal` is also set, it is bridged into this
|
|
44
|
-
* Deferred.
|
|
45
|
-
*/
|
|
46
|
-
cancel?: Deferred.Deferred<void>;
|
|
47
|
-
/** Progress callback. */
|
|
48
|
-
onProgress?: (progress: SyncProgress) => void;
|
|
49
|
-
}
|
|
50
|
-
export interface SyncProgress {
|
|
51
|
-
connectorId: string;
|
|
52
|
-
phase: 'forward' | 'backfill';
|
|
53
|
-
page: number;
|
|
54
|
-
fetched: number;
|
|
55
|
-
added: number;
|
|
56
|
-
running: boolean;
|
|
57
|
-
}
|
|
58
|
-
export interface ConnectorSyncResult {
|
|
59
|
-
connectorId: string;
|
|
60
|
-
added: number;
|
|
61
|
-
total: number;
|
|
62
|
-
pages: number;
|
|
63
|
-
direction: 'forward' | 'backfill' | 'both';
|
|
64
|
-
stopReason: string;
|
|
65
|
-
error?: {
|
|
66
|
-
code: SyncErrorCode;
|
|
67
|
-
message: string;
|
|
68
|
-
};
|
|
69
|
-
}
|
|
70
|
-
export interface ScheduleConfig {
|
|
71
|
-
forwardIntervalMs: number;
|
|
72
|
-
backfillIntervalMs: number;
|
|
73
|
-
concurrency: number;
|
|
74
|
-
pageDelayMs: number;
|
|
75
|
-
retryBackoffMs: number[];
|
|
76
|
-
maxMinutesPerRun: number;
|
|
77
|
-
}
|
|
78
|
-
export declare const DEFAULT_SCHEDULE: ScheduleConfig;
|
|
79
|
-
export type SyncJobPriority = 100 | 80 | 60 | 40 | 20;
|
|
80
|
-
export interface SyncJob {
|
|
81
|
-
connectorId: string;
|
|
82
|
-
direction: 'forward' | 'backfill' | 'both';
|
|
83
|
-
priority: SyncJobPriority;
|
|
84
|
-
queuedAt: number;
|
|
85
|
-
}
|
|
86
|
-
export interface ConnectorPackage {
|
|
87
|
-
id: string;
|
|
88
|
-
packageName: string;
|
|
89
|
-
rootDir: string;
|
|
90
|
-
connectors: Connector[];
|
|
91
|
-
prerequisites?: import('@spool-lab/connector-sdk').Prerequisite[];
|
|
92
|
-
}
|
|
93
|
-
export interface ConnectorStatus {
|
|
94
|
-
id: string;
|
|
95
|
-
label: string;
|
|
96
|
-
description: string;
|
|
97
|
-
platform: string;
|
|
98
|
-
color: string;
|
|
99
|
-
enabled: boolean;
|
|
100
|
-
syncing: boolean;
|
|
101
|
-
version: string;
|
|
102
|
-
packageName: string;
|
|
103
|
-
packageId?: string;
|
|
104
|
-
setup?: import('@spool-lab/connector-sdk').SetupStep[];
|
|
105
|
-
state: SyncState;
|
|
106
|
-
}
|
|
107
|
-
export interface SchedulerStatus {
|
|
108
|
-
running: boolean;
|
|
109
|
-
connectors: ConnectorStatus[];
|
|
110
|
-
}
|
|
111
|
-
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/connectors/types.ts"],"names":[],"mappings":"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"}
|
package/dist/connectors/types.js
DELETED
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
import { Data } from 'effect';
|
|
2
|
-
import { SyncError as SdkSyncError, SyncErrorCode, SYNC_ERROR_HINTS } from '@spool-lab/connector-sdk';
|
|
3
|
-
// ── Re-exports from SDK ────────────────────────────────────────────────────
|
|
4
|
-
export { SyncErrorCode, SYNC_ERROR_HINTS, } from '@spool-lab/connector-sdk';
|
|
5
|
-
// ── Internal Effect-tagged SyncError ──────────────────────────────────────
|
|
6
|
-
const RETRYABLE_CODES = new Set([
|
|
7
|
-
SyncErrorCode.API_RATE_LIMITED,
|
|
8
|
-
SyncErrorCode.API_SERVER_ERROR,
|
|
9
|
-
SyncErrorCode.NETWORK_OFFLINE,
|
|
10
|
-
SyncErrorCode.NETWORK_TIMEOUT,
|
|
11
|
-
SyncErrorCode.SYNC_MAX_PAGES,
|
|
12
|
-
SyncErrorCode.SYNC_TIMEOUT,
|
|
13
|
-
SyncErrorCode.SYNC_CANCELLED,
|
|
14
|
-
]);
|
|
15
|
-
/**
|
|
16
|
-
* Internal Effect-tagged version of SyncError used inside @spool-lab/core for
|
|
17
|
-
* Effect's typed error channel. External callers (connectors) use the plain
|
|
18
|
-
* class exported from @spool-lab/connector-sdk. Translation between the two
|
|
19
|
-
* happens in SyncError.from().
|
|
20
|
-
*/
|
|
21
|
-
export class SyncError extends Data.TaggedError('SyncError') {
|
|
22
|
-
constructor(code, message, cause) {
|
|
23
|
-
super({ code, message: message ?? SYNC_ERROR_HINTS[code], cause });
|
|
24
|
-
}
|
|
25
|
-
static from(e) {
|
|
26
|
-
if (e instanceof SyncError)
|
|
27
|
-
return e;
|
|
28
|
-
if (e instanceof SdkSyncError) {
|
|
29
|
-
return new SyncError(e.code, e.message, e.cause);
|
|
30
|
-
}
|
|
31
|
-
return new SyncError(SyncErrorCode.CONNECTOR_ERROR, e instanceof Error ? e.message : String(e), e);
|
|
32
|
-
}
|
|
33
|
-
/** Whether this error indicates the connector needs re-authentication. */
|
|
34
|
-
get needsReauth() {
|
|
35
|
-
return this.code.startsWith('AUTH_');
|
|
36
|
-
}
|
|
37
|
-
/** Whether this error is transient and the sync can be retried. */
|
|
38
|
-
get retryable() {
|
|
39
|
-
return RETRYABLE_CODES.has(this.code);
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
export const DEFAULT_SCHEDULE = {
|
|
43
|
-
forwardIntervalMs: 15 * 60_000,
|
|
44
|
-
backfillIntervalMs: 60 * 60_000,
|
|
45
|
-
concurrency: 1,
|
|
46
|
-
pageDelayMs: 1200,
|
|
47
|
-
retryBackoffMs: [60_000, 300_000, 1_800_000, 7_200_000],
|
|
48
|
-
maxMinutesPerRun: 10,
|
|
49
|
-
};
|
|
50
|
-
//# sourceMappingURL=types.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/connectors/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAU7B,OAAO,EAAE,SAAS,IAAI,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAErG,8EAA8E;AAC9E,OAAO,EACL,aAAa,EACb,gBAAgB,GACjB,MAAM,0BAA0B,CAAA;AAUjC,6EAA6E;AAC7E,MAAM,eAAe,GAAG,IAAI,GAAG,CAAgB;IAC7C,aAAa,CAAC,gBAAgB;IAC9B,aAAa,CAAC,gBAAgB;IAC9B,aAAa,CAAC,eAAe;IAC7B,aAAa,CAAC,eAAe;IAC7B,aAAa,CAAC,cAAc;IAC5B,aAAa,CAAC,YAAY;IAC1B,aAAa,CAAC,cAAc;CAC7B,CAAC,CAAA;AAEF;;;;;GAKG;AACH,MAAM,OAAO,SAAU,SAAQ,IAAI,CAAC,WAAW,CAAC,WAAW,CAIzD;IACA,YAAY,IAAmB,EAAE,OAAgB,EAAE,KAAe;QAChE,KAAK,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,IAAI,gBAAgB,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAA;IACpE,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,CAAU;QACpB,IAAI,CAAC,YAAY,SAAS;YAAE,OAAO,CAAC,CAAA;QACpC,IAAI,CAAC,YAAY,YAAY,EAAE,CAAC;YAC9B,OAAO,IAAI,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAA;QAClD,CAAC;QACD,OAAO,IAAI,SAAS,CAClB,aAAa,CAAC,eAAe,EAC7B,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAC1C,CAAC,CACF,CAAA;IACH,CAAC;IAED,0EAA0E;IAC1E,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAA;IACtC,CAAC;IAED,mEAAmE;IACnE,IAAI,SAAS;QACX,OAAO,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACvC,CAAC;CACF;AA6DD,MAAM,CAAC,MAAM,gBAAgB,GAAmB;IAC9C,iBAAiB,EAAE,EAAE,GAAG,MAAM;IAC9B,kBAAkB,EAAE,EAAE,GAAG,MAAM;IAC/B,WAAW,EAAE,CAAC;IACd,WAAW,EAAE,IAAI;IACjB,cAAc,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,CAAC;IACvD,gBAAgB,EAAE,EAAE;CACrB,CAAA"}
|