@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.
Files changed (81) hide show
  1. package/LICENSE +11 -0
  2. package/README.md +8 -5
  3. package/dist/db/db.d.ts +4 -0
  4. package/dist/db/db.d.ts.map +1 -1
  5. package/dist/db/db.js +103 -121
  6. package/dist/db/db.js.map +1 -1
  7. package/dist/db/queries.d.ts +9 -14
  8. package/dist/db/queries.d.ts.map +1 -1
  9. package/dist/db/queries.js +85 -179
  10. package/dist/db/queries.js.map +1 -1
  11. package/dist/index.d.ts +0 -19
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js +0 -14
  14. package/dist/index.js.map +1 -1
  15. package/dist/sync/watcher.d.ts +38 -8
  16. package/dist/sync/watcher.d.ts.map +1 -1
  17. package/dist/sync/watcher.js +158 -43
  18. package/dist/sync/watcher.js.map +1 -1
  19. package/dist/types.d.ts +8 -18
  20. package/dist/types.d.ts.map +1 -1
  21. package/package.json +3 -10
  22. package/dist/connectors/capabilities/cookies-chrome.d.ts +0 -19
  23. package/dist/connectors/capabilities/cookies-chrome.d.ts.map +0 -1
  24. package/dist/connectors/capabilities/cookies-chrome.js +0 -199
  25. package/dist/connectors/capabilities/cookies-chrome.js.map +0 -1
  26. package/dist/connectors/capabilities/exec-impl.d.ts +0 -3
  27. package/dist/connectors/capabilities/exec-impl.d.ts.map +0 -1
  28. package/dist/connectors/capabilities/exec-impl.js +0 -108
  29. package/dist/connectors/capabilities/exec-impl.js.map +0 -1
  30. package/dist/connectors/capabilities/fetch-impl.d.ts +0 -3
  31. package/dist/connectors/capabilities/fetch-impl.d.ts.map +0 -1
  32. package/dist/connectors/capabilities/fetch-impl.js +0 -4
  33. package/dist/connectors/capabilities/fetch-impl.js.map +0 -1
  34. package/dist/connectors/capabilities/index.d.ts +0 -6
  35. package/dist/connectors/capabilities/index.d.ts.map +0 -1
  36. package/dist/connectors/capabilities/index.js +0 -6
  37. package/dist/connectors/capabilities/index.js.map +0 -1
  38. package/dist/connectors/capabilities/log-impl.d.ts +0 -3
  39. package/dist/connectors/capabilities/log-impl.d.ts.map +0 -1
  40. package/dist/connectors/capabilities/log-impl.js +0 -26
  41. package/dist/connectors/capabilities/log-impl.js.map +0 -1
  42. package/dist/connectors/capabilities/sqlite-impl.d.ts +0 -3
  43. package/dist/connectors/capabilities/sqlite-impl.d.ts.map +0 -1
  44. package/dist/connectors/capabilities/sqlite-impl.js +0 -19
  45. package/dist/connectors/capabilities/sqlite-impl.js.map +0 -1
  46. package/dist/connectors/loader.d.ts +0 -47
  47. package/dist/connectors/loader.d.ts.map +0 -1
  48. package/dist/connectors/loader.js +0 -328
  49. package/dist/connectors/loader.js.map +0 -1
  50. package/dist/connectors/npm-install.d.ts +0 -26
  51. package/dist/connectors/npm-install.d.ts.map +0 -1
  52. package/dist/connectors/npm-install.js +0 -71
  53. package/dist/connectors/npm-install.js.map +0 -1
  54. package/dist/connectors/prerequisites.d.ts +0 -14
  55. package/dist/connectors/prerequisites.d.ts.map +0 -1
  56. package/dist/connectors/prerequisites.js +0 -109
  57. package/dist/connectors/prerequisites.js.map +0 -1
  58. package/dist/connectors/registry-fetch.d.ts +0 -22
  59. package/dist/connectors/registry-fetch.d.ts.map +0 -1
  60. package/dist/connectors/registry-fetch.js +0 -54
  61. package/dist/connectors/registry-fetch.js.map +0 -1
  62. package/dist/connectors/registry.d.ts +0 -23
  63. package/dist/connectors/registry.d.ts.map +0 -1
  64. package/dist/connectors/registry.js +0 -59
  65. package/dist/connectors/registry.js.map +0 -1
  66. package/dist/connectors/sync-engine.d.ts +0 -30
  67. package/dist/connectors/sync-engine.d.ts.map +0 -1
  68. package/dist/connectors/sync-engine.js +0 -589
  69. package/dist/connectors/sync-engine.js.map +0 -1
  70. package/dist/connectors/sync-scheduler.d.ts +0 -56
  71. package/dist/connectors/sync-scheduler.d.ts.map +0 -1
  72. package/dist/connectors/sync-scheduler.js +0 -238
  73. package/dist/connectors/sync-scheduler.js.map +0 -1
  74. package/dist/connectors/trust-store.d.ts +0 -13
  75. package/dist/connectors/trust-store.d.ts.map +0 -1
  76. package/dist/connectors/trust-store.js +0 -48
  77. package/dist/connectors/trust-store.js.map +0 -1
  78. package/dist/connectors/types.d.ts +0 -111
  79. package/dist/connectors/types.d.ts.map +0 -1
  80. package/dist/connectors/types.js +0 -50
  81. 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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"}
@@ -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"}