@spool-lab/core 0.4.0 → 0.4.12
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/dist/db/db.d.ts +19 -0
- package/dist/db/db.d.ts.map +1 -1
- package/dist/db/db.js +210 -15
- package/dist/db/db.js.map +1 -1
- package/dist/db/queries.d.ts +36 -10
- package/dist/db/queries.d.ts.map +1 -1
- package/dist/db/queries.js +96 -75
- package/dist/db/queries.js.map +1 -1
- package/dist/db/share-drafts.d.ts +51 -0
- package/dist/db/share-drafts.d.ts.map +1 -0
- package/dist/db/share-drafts.js +47 -0
- package/dist/db/share-drafts.js.map +1 -0
- package/dist/doctor/checks/config.d.ts +3 -0
- package/dist/doctor/checks/config.d.ts.map +1 -0
- package/dist/doctor/checks/config.js +123 -0
- package/dist/doctor/checks/config.js.map +1 -0
- package/dist/doctor/checks/db.d.ts +3 -0
- package/dist/doctor/checks/db.d.ts.map +1 -0
- package/dist/doctor/checks/db.js +225 -0
- package/dist/doctor/checks/db.js.map +1 -0
- package/dist/doctor/checks/env.d.ts +3 -0
- package/dist/doctor/checks/env.d.ts.map +1 -0
- package/dist/doctor/checks/env.js +70 -0
- package/dist/doctor/checks/env.js.map +1 -0
- package/dist/doctor/checks/index.d.ts +3 -0
- package/dist/doctor/checks/index.d.ts.map +1 -0
- package/dist/doctor/checks/index.js +13 -0
- package/dist/doctor/checks/index.js.map +1 -0
- package/dist/doctor/checks/native.d.ts +3 -0
- package/dist/doctor/checks/native.d.ts.map +1 -0
- package/dist/doctor/checks/native.js +42 -0
- package/dist/doctor/checks/native.js.map +1 -0
- package/dist/doctor/checks/versions.d.ts +3 -0
- package/dist/doctor/checks/versions.d.ts.map +1 -0
- package/dist/doctor/checks/versions.js +79 -0
- package/dist/doctor/checks/versions.js.map +1 -0
- package/dist/doctor/index.d.ts +3 -0
- package/dist/doctor/index.d.ts.map +1 -0
- package/dist/doctor/index.js +3 -0
- package/dist/doctor/index.js.map +1 -0
- package/dist/doctor/preflight.d.ts +18 -0
- package/dist/doctor/preflight.d.ts.map +1 -0
- package/dist/doctor/preflight.js +27 -0
- package/dist/doctor/preflight.js.map +1 -0
- package/dist/doctor/runner.d.ts +12 -0
- package/dist/doctor/runner.d.ts.map +1 -0
- package/dist/doctor/runner.js +37 -0
- package/dist/doctor/runner.js.map +1 -0
- package/dist/doctor/types.d.ts +27 -0
- package/dist/doctor/types.d.ts.map +1 -0
- package/dist/doctor/types.js +2 -0
- package/dist/doctor/types.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/migrations/agent-search-cleanup.d.ts +36 -0
- package/dist/migrations/agent-search-cleanup.d.ts.map +1 -0
- package/dist/migrations/agent-search-cleanup.js +182 -0
- package/dist/migrations/agent-search-cleanup.js.map +1 -0
- package/dist/migrations/worktree-identity-upgrade.d.ts +31 -0
- package/dist/migrations/worktree-identity-upgrade.d.ts.map +1 -0
- package/dist/migrations/worktree-identity-upgrade.js +22 -0
- package/dist/migrations/worktree-identity-upgrade.js.map +1 -0
- package/dist/parsers/claude.d.ts.map +1 -1
- package/dist/parsers/claude.js +25 -12
- package/dist/parsers/claude.js.map +1 -1
- package/dist/parsers/codex.d.ts.map +1 -1
- package/dist/parsers/codex.js +32 -5
- package/dist/parsers/codex.js.map +1 -1
- package/dist/parsers/gemini.d.ts.map +1 -1
- package/dist/parsers/gemini.js +5 -5
- package/dist/parsers/gemini.js.map +1 -1
- package/dist/parsers/spool-prelude.d.ts +16 -0
- package/dist/parsers/spool-prelude.d.ts.map +1 -0
- package/dist/parsers/spool-prelude.js +21 -0
- package/dist/parsers/spool-prelude.js.map +1 -0
- package/dist/projects/display-name.d.ts +2 -0
- package/dist/projects/display-name.d.ts.map +1 -0
- package/dist/projects/display-name.js +8 -0
- package/dist/projects/display-name.js.map +1 -0
- package/dist/projects/fs.d.ts +3 -0
- package/dist/projects/fs.d.ts.map +1 -0
- package/dist/projects/fs.js +20 -0
- package/dist/projects/fs.js.map +1 -0
- package/dist/projects/groups.d.ts +4 -0
- package/dist/projects/groups.d.ts.map +1 -0
- package/dist/projects/groups.js +20 -0
- package/dist/projects/groups.js.map +1 -0
- package/dist/projects/identity-synthesizers.d.ts +22 -0
- package/dist/projects/identity-synthesizers.d.ts.map +1 -0
- package/dist/projects/identity-synthesizers.js +29 -0
- package/dist/projects/identity-synthesizers.js.map +1 -0
- package/dist/projects/identity.d.ts +16 -0
- package/dist/projects/identity.d.ts.map +1 -0
- package/dist/projects/identity.js +172 -0
- package/dist/projects/identity.js.map +1 -0
- package/dist/projects/sessions.d.ts +12 -0
- package/dist/projects/sessions.d.ts.map +1 -0
- package/dist/projects/sessions.js +47 -0
- package/dist/projects/sessions.js.map +1 -0
- package/dist/projects/worktree-resolvers.d.ts +19 -0
- package/dist/projects/worktree-resolvers.d.ts.map +1 -0
- package/dist/projects/worktree-resolvers.js +65 -0
- package/dist/projects/worktree-resolvers.js.map +1 -0
- package/dist/sync/syncer.d.ts.map +1 -1
- package/dist/sync/syncer.js +11 -3
- package/dist/sync/syncer.js.map +1 -1
- package/dist/types.d.ts +15 -6
- package/dist/types.d.ts.map +1 -1
- package/package.json +2 -2
- 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 -74
- 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 -31
- package/dist/connectors/sync-engine.d.ts.map +0 -1
- package/dist/connectors/sync-engine.js +0 -604
- 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":"AASA,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAE5D,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAE5D,OAAO,EACL,KAAK,EACL,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,MAAM,EACN,KAAK,EACL,KAAK,EACL,cAAc,EACd,IAAI,EACJ,QAAQ,GACT,MAAM,QAAQ,CAAA;AAYf,MAAM,OAAO,aAAa;IAcd;IACA;IAdF,MAAM,CAAY;IAClB,MAAM,CAAgB;IACtB,KAAK,GAAc,EAAE,CAAA;IAC7B,sEAAsE;IACtE,2EAA2E;IACnE,OAAO,GAAG,IAAI,GAAG,EAAmC,CAAA;IACpD,SAAS,GAA2C,IAAI,CAAA;IACxD,aAAa,GAA4B,EAAE,CAAA;IACnD,+EAA+E;IACvE,OAAO,CAA6C;IACpD,SAAS,CAAkB;IAEnC,YACU,EAAqB,EACrB,QAA2B,EACnC,MAAgC,EAChC,OAAqD;QAH7C,OAAE,GAAF,EAAE,CAAmB;QACrB,aAAQ,GAAR,QAAQ,CAAmB;QAInC,IAAI,CAAC,MAAM,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAA;QAChC,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,gBAAgB,EAAE,GAAG,MAAM,EAAE,CAAA;QAChD,IAAI,CAAC,OAAO,GAAG,OAAO,IAAI,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;QAC1D,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAA;IAChF,CAAC;IAED,6EAA6E;IAE7E,KAAK;QACH,IAAI,IAAI,CAAC,SAAS;YAAE,OAAM;QAE1B,uEAAuE;QACvE,wCAAwC;QACxC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;QAEzB,MAAM,WAAW,GAAG,IAAI,CACtB,IAAI,CAAC,cAAc,EAAE,EACrB,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EACpD,MAAM,CAAC,MAAM,EACb,MAAM,CAAC,aAAa,CAAC,CAAC,KAAK,EAAE,EAAE,CAC7B,KAAK,CAAC,iBAAiB,CAAC,KAAK,CAAC;YAC5B,CAAC,CAAC,MAAM,CAAC,IAAI;YACb,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAC3D,CACF,CAAA;QACD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;IACpD,CAAC;IAED,IAAI;QACF,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,wEAAwE;YACxE,oEAAoE;YACpE,0BAA0B;YAC1B,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAA;YACrD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAA;QACvB,CAAC;QACD,KAAK,MAAM,CAAC,EAAE,QAAQ,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACxC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,CAAA;QACpD,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAA;QACpB,IAAI,CAAC,KAAK,GAAG,EAAE,CAAA;IACjB,CAAC;IAED,uEAAuE;IACvE,eAAe,CAAC,WAAmB;QACjC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;QAC5C,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CAAA;YAChD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAAA;QAClC,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,KAAK,WAAW,CAAC,CAAA;IACpE,CAAC;IAED,sDAAsD;IACtD,UAAU,CAAC,WAAmB,EAAE,YAAuB,MAAM;QAC3D,IAAI,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;QAC7E,IAAI,CAAC,IAAI,EAAE,CAAA;IACb,CAAC;IAED,4DAA4D;IAC5D,MAAM;QACJ,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC,CAAA;QAC5B,IAAI,CAAC,IAAI,EAAE,CAAA;IACb,CAAC;IAED,qCAAqC;IACrC,EAAE,CAAC,OAA8B;QAC/B,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAChC,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,OAAO,CAAC,CAAA;QACpE,CAAC,CAAA;IACH,CAAC;IAED,6EAA6E;IAE7E,SAAS;QACP,MAAM,UAAU,GAAsB,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;YACjE,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAA;YAC1C,OAAO;gBACL,EAAE,EAAE,CAAC,CAAC,EAAE;gBACR,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,WAAW,EAAE,CAAC,CAAC,WAAW;gBAC1B,QAAQ,EAAE,CAAC,CAAC,QAAQ;gBACpB,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC/B,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,OAAO;gBAChB,WAAW,EAAE,EAAE;gBACf,KAAK;aACN,CAAA;QACH,CAAC,CAAC,CAAA;QAEF,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE,UAAU,EAAE,CAAA;IACzD,CAAC;IAED,6EAA6E;IAErE,IAAI,CAAC,KAAqB;QAChC,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACzC,IAAI,CAAC;gBAAC,OAAO,CAAC,KAAK,CAAC,CAAA;YAAC,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;QACjC,CAAC;IACH,CAAC;IAEO,IAAI;QACV,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAA;IAC7C,CAAC;IAEO,QAAQ,CAAC,SAAoB,EAAE,QAAyB;QAC9D,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;YAC7C,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,CAAC,EAAE,CAAC,CAAA;YAClD,IAAI,CAAC,KAAK,CAAC,OAAO;gBAAE,SAAQ;YAC5B,IAAI,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;QACxF,CAAC;IACH,CAAC;IAEO,OAAO,CAAC,GAAY;QAC1B,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC;YAAE,OAAM;QAC7C,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,KAAK,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;YAC5D,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAC9B,CAAC,CAAC,WAAW,KAAK,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CACzE,CAAA;YACD,OAAM;QACR,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACpB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAA;IACpD,CAAC;IAEO,cAAc;QACpB,MAAM,IAAI,GAAG,IAAI,CAAA;QACjB,OAAO,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YACzB,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI;gBAAE,OAAM;YAEnC,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAA;YAE1C,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;gBAC7C,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,CAAC,EAAE,CAAC,CAAA;gBAClD,IAAI,CAAC,KAAK,CAAC,OAAO;oBAAE,SAAQ;gBAE5B,IAAI,KAAK,CAAC,iBAAiB,GAAG,CAAC,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;oBACrD,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAA;oBAC5D,IAAI,GAAG,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,OAAO,EAAE,GAAG,SAAS;wBAAE,SAAQ;gBACvE,CAAC;gBAED,IAAI,KAAK,CAAC,aAAa,EAAE,UAAU,CAAC,OAAO,CAAC;oBAAE,SAAQ;gBAEtD,MAAM,WAAW,GAAG,KAAK,CAAC,iBAAiB;oBACzC,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,OAAO,EAAE;oBAC7C,CAAC,CAAC,CAAC,CAAA;gBACL,IAAI,GAAG,GAAG,WAAW,IAAI,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE,CAAC;oBACvD,IAAI,CAAC,OAAO,CAAC;wBACX,WAAW,EAAE,SAAS,CAAC,EAAE;wBACzB,SAAS,EAAE,SAAS;wBACpB,QAAQ,EAAE,EAAE;wBACZ,QAAQ,EAAE,GAAG;qBACd,CAAC,CAAA;gBACJ,CAAC;gBAED,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;oBACxB,MAAM,YAAY,GAAG,KAAK,CAAC,kBAAkB;wBAC3C,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,OAAO,EAAE;wBAC9C,CAAC,CAAC,CAAC,CAAA;oBACL,IAAI,GAAG,GAAG,YAAY,IAAI,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC;wBACzD,IAAI,CAAC,OAAO,CAAC;4BACX,WAAW,EAAE,SAAS,CAAC,EAAE;4BACzB,SAAS,EAAE,UAAU;4BACrB,QAAQ,EAAE,EAAE;4BACZ,QAAQ,EAAE,GAAG;yBACd,CAAC,CAAA;oBACJ,CAAC;gBACH,CAAC;YACH,CAAC;YAED,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAA;QAC7C,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,2EAA2E;IAC3E,mEAAmE;IACnE,2EAA2E;IAC3E,iFAAiF;IACzE,UAAU;QAChB,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;YAC5E,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAG,CAAA;YAC/B,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAA;QAC9C,CAAC;IACH,CAAC;IAEO,YAAY,CAAC,GAAY;QAC/B,MAAM,IAAI,GAAG,IAAI,CAAA;QAEjB,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAC/B,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC;gBAAE,OAAM;YAC/C,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;YAEpD,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAQ,CAAA;YAC3C,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;gBACtB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,CAAA;YAC3C,CAAC,CAAC,CAAA;YAEF,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CACtB,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE,CAAC,CAChE,CAAA;YAED,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,EAAE;gBACtD,SAAS,EAAE,GAAG,CAAC,SAAS;gBACxB,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW;gBAChC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,gBAAgB;gBACxC,MAAM;gBACN,UAAU,EAAE,CAAC,QAAQ,EAAE,EAAE;oBACvB,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,QAAQ,EAAE,CAAC,CAAA;gBAChD,CAAC;aACF,CAAC,CAAA;YAEF,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;gBACtB,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,CAAC,CAAA;gBAC5C,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;oBACjB,IAAI,CAAC,IAAI,CAAC;wBACR,IAAI,EAAE,YAAY;wBAClB,WAAW,EAAE,GAAG,CAAC,WAAW;wBAC5B,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,IAAqB;wBACxC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO;qBAC9B,CAAC,CAAA;gBACJ,CAAC;YACH,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QAEF,OAAO,IAAI,CACT,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EACnC,MAAM,CAAC,QAAQ,CACb,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;YACf,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;YACpC,oEAAoE;YACpE,oEAAoE;YACpE,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;gBACrD,IAAI,CAAC,UAAU,EAAE,CAAA;YACnB,CAAC;QACH,CAAC,CAAC,CACH,EACD,MAAM,CAAC,aAAa,CAAC,CAAC,KAAK,EAAE,EAAE,CAC7B,KAAK,CAAC,iBAAiB,CAAC,KAAK,CAAC;YAC5B,CAAC,CAAC,MAAM,CAAC,IAAI;YACb,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;gBACf,IAAI,CAAC,IAAI,CAAC;oBACR,IAAI,EAAE,YAAY;oBAClB,WAAW,EAAE,GAAG,CAAC,WAAW;oBAC5B,IAAI,EAAE,aAAa,CAAC,eAAe;oBACnC,OAAO,EAAE,kBAAkB,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;iBACjD,CAAC,CAAA;YACJ,CAAC,CAAC,CACP,CACF,CAAA;IACH,CAAC;IAEO,YAAY,CAAC,iBAAyB;QAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,iBAAiB,GAAG,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;QAClF,OAAO,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,CAAA;IACvF,CAAC;CACF"}
|
|
@@ -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":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AACtC,OAAO,KAAK,EACV,SAAS,EAKT,SAAS,EACV,MAAM,0BAA0B,CAAA;AACjC,OAAO,EAAE,aAAa,EAAiC,MAAM,0BAA0B,CAAA;AAGvF,OAAO,EACL,aAAa,EACb,gBAAgB,GACjB,MAAM,0BAA0B,CAAA;AACjC,YAAY,EACV,SAAS,EACT,UAAU,EACV,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,SAAS,GACV,MAAM,0BAA0B,CAAA;;;;AAajC;;;;;GAKG;AACH,qBAAa,SAAU,SAAQ,eAA8B;IAC3D,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAA;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CACzB,CAAC;gBACY,IAAI,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;IAIlE,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,OAAO,GAAG,SAAS;IAYlC,0EAA0E;IAC1E,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED,mEAAmE;IACnE,IAAI,SAAS,IAAI,OAAO,CAEvB;CACF;AAID,MAAM,WAAW,WAAW;IAC1B,gDAAgD;IAChD,SAAS,CAAC,EAAE,SAAS,GAAG,UAAU,GAAG,MAAM,CAAA;IAC3C,uDAAuD;IACvD,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,oEAAoE;IACpE,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,mFAAmF;IACnF,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,kEAAkE;IAClE,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,oCAAoC;IACpC,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB;;;;;OAKG;IACH,MAAM,CAAC,EAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;IAChC,yBAAyB;IACzB,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,KAAK,IAAI,CAAA;CAC9C;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,SAAS,GAAG,UAAU,CAAA;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,OAAO,CAAA;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,SAAS,GAAG,UAAU,GAAG,MAAM,CAAA;IAC1C,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE;QACN,IAAI,EAAE,aAAa,CAAA;QACnB,OAAO,EAAE,MAAM,CAAA;KAChB,CAAA;CACF;AAID,MAAM,WAAW,cAAc;IAC7B,iBAAiB,EAAE,MAAM,CAAA;IACzB,kBAAkB,EAAE,MAAM,CAAA;IAC1B,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,MAAM,CAAA;IACnB,cAAc,EAAE,MAAM,EAAE,CAAA;IACxB,gBAAgB,EAAE,MAAM,CAAA;CACzB;AAED,eAAO,MAAM,gBAAgB,EAAE,cAO9B,CAAA;AAED,MAAM,MAAM,eAAe,GAAG,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAA;AAErD,MAAM,WAAW,OAAO;IACtB,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,SAAS,GAAG,UAAU,GAAG,MAAM,CAAA;IAC1C,QAAQ,EAAE,eAAe,CAAA;IACzB,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAA;IACV,WAAW,EAAE,MAAM,CAAA;IACnB,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,SAAS,EAAE,CAAA;IACvB,aAAa,CAAC,EAAE,OAAO,0BAA0B,EAAE,YAAY,EAAE,CAAA;CAClE;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,OAAO,0BAA0B,EAAE,SAAS,EAAE,CAAA;IACtD,KAAK,EAAE,SAAS,CAAA;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,EAAE,eAAe,EAAE,CAAA;CAC9B"}
|
package/dist/connectors/types.js
DELETED
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
import { Data } from 'effect';
|
|
2
|
-
import { SyncErrorCode, SYNC_ERROR_HINTS, isSyncError } 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 (isSyncError(e)) {
|
|
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,aAAa,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAEvF,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,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;YACnB,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"}
|