@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,26 +0,0 @@
|
|
|
1
|
-
export interface NpmPackageInfo {
|
|
2
|
-
name: string;
|
|
3
|
-
version: string;
|
|
4
|
-
tarballUrl: string;
|
|
5
|
-
isConnector: boolean;
|
|
6
|
-
label: string | null;
|
|
7
|
-
description: string | null;
|
|
8
|
-
}
|
|
9
|
-
export interface InstallResult {
|
|
10
|
-
name: string;
|
|
11
|
-
version: string;
|
|
12
|
-
installPath: string;
|
|
13
|
-
}
|
|
14
|
-
export interface UpdateInfo {
|
|
15
|
-
current: string;
|
|
16
|
-
latest: string;
|
|
17
|
-
}
|
|
18
|
-
export declare function registryUrl(packageName: string): string;
|
|
19
|
-
export declare function resolveNpmPackage(packageName: string, fetchFn: typeof globalThis.fetch): Promise<NpmPackageInfo>;
|
|
20
|
-
export declare function downloadAndInstall(packageName: string, connectorsDir: string, fetchFn: typeof globalThis.fetch): Promise<InstallResult>;
|
|
21
|
-
export declare function checkForUpdates(connectors: Array<{
|
|
22
|
-
packageName: string;
|
|
23
|
-
currentVersion: string;
|
|
24
|
-
}>, fetchFn: typeof globalThis.fetch): Promise<Map<string, UpdateInfo>>;
|
|
25
|
-
export declare function uninstallConnector(packageName: string, connectorsDir: string): void;
|
|
26
|
-
//# sourceMappingURL=npm-install.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"npm-install.d.ts","sourceRoot":"","sources":["../../src/connectors/npm-install.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,EAAE,OAAO,CAAA;IACpB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;CAC3B;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;CACf;AAED,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAKvD;AAED,wBAAsB,iBAAiB,CACrC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,OAAO,UAAU,CAAC,KAAK,GAC/B,OAAO,CAAC,cAAc,CAAC,CAkBzB;AAED,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,OAAO,UAAU,CAAC,KAAK,GAC/B,OAAO,CAAC,aAAa,CAAC,CAuBxB;AAED,wBAAsB,eAAe,CACnC,UAAU,EAAE,KAAK,CAAC;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,CAAC,EAClE,OAAO,EAAE,OAAO,UAAU,CAAC,KAAK,GAC/B,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAclC;AAED,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,GACpB,IAAI,CAKN"}
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
import { mkdirSync, createWriteStream, rmSync } from 'node:fs';
|
|
2
|
-
import { join } from 'node:path';
|
|
3
|
-
import { pipeline } from 'node:stream/promises';
|
|
4
|
-
import { tmpdir } from 'node:os';
|
|
5
|
-
import * as tar from 'tar';
|
|
6
|
-
import * as semver from 'semver';
|
|
7
|
-
export function registryUrl(packageName) {
|
|
8
|
-
const encoded = packageName.includes('/')
|
|
9
|
-
? packageName.replace('/', '%2F')
|
|
10
|
-
: packageName;
|
|
11
|
-
return `https://registry.npmjs.org/${encoded}/latest`;
|
|
12
|
-
}
|
|
13
|
-
export async function resolveNpmPackage(packageName, fetchFn) {
|
|
14
|
-
const url = registryUrl(packageName);
|
|
15
|
-
const res = await fetchFn(url);
|
|
16
|
-
if (!res.ok) {
|
|
17
|
-
throw new Error(`npm registry returned ${res.status} for ${packageName}`);
|
|
18
|
-
}
|
|
19
|
-
const data = await res.json();
|
|
20
|
-
const name = data['name'];
|
|
21
|
-
const version = data['version'];
|
|
22
|
-
const dist = data['dist'];
|
|
23
|
-
const tarballUrl = dist['tarball'];
|
|
24
|
-
const spool = data['spool'];
|
|
25
|
-
const isConnector = spool?.['type'] === 'connector';
|
|
26
|
-
const label = typeof spool?.['label'] === 'string' ? spool['label'] : null;
|
|
27
|
-
const description = typeof spool?.['description'] === 'string' ? spool['description'] : null;
|
|
28
|
-
return { name, version, tarballUrl, isConnector, label, description };
|
|
29
|
-
}
|
|
30
|
-
export async function downloadAndInstall(packageName, connectorsDir, fetchFn) {
|
|
31
|
-
const info = await resolveNpmPackage(packageName, fetchFn);
|
|
32
|
-
if (!info.isConnector) {
|
|
33
|
-
throw new Error(`Package "${packageName}" is not a spool connector (missing spool.type: "connector")`);
|
|
34
|
-
}
|
|
35
|
-
// Download tarball to temp file
|
|
36
|
-
const tmpPath = join(tmpdir(), `spool-install-${Date.now()}.tgz`);
|
|
37
|
-
const res = await fetchFn(info.tarballUrl);
|
|
38
|
-
if (!res.ok || !res.body) {
|
|
39
|
-
throw new Error(`Failed to download tarball: ${res.status}`);
|
|
40
|
-
}
|
|
41
|
-
const fileStream = createWriteStream(tmpPath);
|
|
42
|
-
await pipeline(res.body, fileStream);
|
|
43
|
-
// Extract to node_modules
|
|
44
|
-
const nameSegments = info.name.startsWith('@') ? info.name.split('/') : [info.name];
|
|
45
|
-
const installPath = join(connectorsDir, 'node_modules', ...nameSegments);
|
|
46
|
-
mkdirSync(installPath, { recursive: true });
|
|
47
|
-
await tar.extract({ file: tmpPath, cwd: installPath, strip: 1 });
|
|
48
|
-
return { name: info.name, version: info.version, installPath };
|
|
49
|
-
}
|
|
50
|
-
export async function checkForUpdates(connectors, fetchFn) {
|
|
51
|
-
const results = new Map();
|
|
52
|
-
const checks = connectors.map(async ({ packageName, currentVersion }) => {
|
|
53
|
-
try {
|
|
54
|
-
const info = await resolveNpmPackage(packageName, fetchFn);
|
|
55
|
-
if (semver.gt(info.version, currentVersion)) {
|
|
56
|
-
results.set(packageName, { current: currentVersion, latest: info.version });
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
catch {
|
|
60
|
-
// Network error or delisted package — skip silently
|
|
61
|
-
}
|
|
62
|
-
});
|
|
63
|
-
await Promise.all(checks);
|
|
64
|
-
return results;
|
|
65
|
-
}
|
|
66
|
-
export function uninstallConnector(packageName, connectorsDir) {
|
|
67
|
-
const nameSegments = packageName.startsWith('@') ? packageName.split('/') : [packageName];
|
|
68
|
-
const installPath = join(connectorsDir, 'node_modules', ...nameSegments);
|
|
69
|
-
rmSync(installPath, { recursive: true, force: true });
|
|
70
|
-
}
|
|
71
|
-
//# sourceMappingURL=npm-install.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"npm-install.js","sourceRoot":"","sources":["../../src/connectors/npm-install.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import type { SetupStep, ExecCapability } from '@spool-lab/connector-sdk';
|
|
2
|
-
import type { ConnectorPackage } from './types.js';
|
|
3
|
-
export declare class PrerequisiteChecker {
|
|
4
|
-
private exec;
|
|
5
|
-
private cache;
|
|
6
|
-
private inFlight;
|
|
7
|
-
constructor(exec: ExecCapability);
|
|
8
|
-
getCached(packageId: string): SetupStep[] | undefined;
|
|
9
|
-
invalidate(packageId: string): void;
|
|
10
|
-
check(pkg: ConnectorPackage): Promise<SetupStep[]>;
|
|
11
|
-
private runCheck;
|
|
12
|
-
private detectOne;
|
|
13
|
-
}
|
|
14
|
-
//# sourceMappingURL=prerequisites.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"prerequisites.d.ts","sourceRoot":"","sources":["../../src/connectors/prerequisites.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAgB,SAAS,EAAe,cAAc,EAAE,MAAM,0BAA0B,CAAA;AACpG,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAiBlD,qBAAa,mBAAmB;IAIlB,OAAO,CAAC,IAAI;IAHxB,OAAO,CAAC,KAAK,CAAiC;IAC9C,OAAO,CAAC,QAAQ,CAA0C;gBAEtC,IAAI,EAAE,cAAc;IAExC,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,EAAE,GAAG,SAAS;IAIrD,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAI7B,KAAK,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;YAQ1C,QAAQ;YAoBR,SAAS;CAkDxB"}
|
|
@@ -1,109 +0,0 @@
|
|
|
1
|
-
import { valid, gte } from 'semver';
|
|
2
|
-
function baseStep(p, status, extras = {}) {
|
|
3
|
-
const step = {
|
|
4
|
-
id: p.id,
|
|
5
|
-
label: p.name,
|
|
6
|
-
kind: p.kind,
|
|
7
|
-
status,
|
|
8
|
-
install: p.install,
|
|
9
|
-
...extras,
|
|
10
|
-
};
|
|
11
|
-
if (p.docsUrl !== undefined)
|
|
12
|
-
step.docsUrl = p.docsUrl;
|
|
13
|
-
if (p.minVersion !== undefined && step.minVersion === undefined)
|
|
14
|
-
step.minVersion = p.minVersion;
|
|
15
|
-
return step;
|
|
16
|
-
}
|
|
17
|
-
export class PrerequisiteChecker {
|
|
18
|
-
exec;
|
|
19
|
-
cache = new Map();
|
|
20
|
-
inFlight = new Map();
|
|
21
|
-
constructor(exec) {
|
|
22
|
-
this.exec = exec;
|
|
23
|
-
}
|
|
24
|
-
getCached(packageId) {
|
|
25
|
-
return this.cache.get(packageId);
|
|
26
|
-
}
|
|
27
|
-
invalidate(packageId) {
|
|
28
|
-
this.cache.delete(packageId);
|
|
29
|
-
}
|
|
30
|
-
async check(pkg) {
|
|
31
|
-
const existing = this.inFlight.get(pkg.id);
|
|
32
|
-
if (existing)
|
|
33
|
-
return existing;
|
|
34
|
-
const promise = this.runCheck(pkg).finally(() => this.inFlight.delete(pkg.id));
|
|
35
|
-
this.inFlight.set(pkg.id, promise);
|
|
36
|
-
return promise;
|
|
37
|
-
}
|
|
38
|
-
async runCheck(pkg) {
|
|
39
|
-
const prereqs = pkg.prerequisites ?? [];
|
|
40
|
-
const steps = [];
|
|
41
|
-
const okIds = new Set();
|
|
42
|
-
for (const p of prereqs) {
|
|
43
|
-
const unmet = (p.requires ?? []).filter(id => !okIds.has(id));
|
|
44
|
-
if (unmet.length > 0) {
|
|
45
|
-
steps.push(baseStep(p, 'pending'));
|
|
46
|
-
continue;
|
|
47
|
-
}
|
|
48
|
-
const step = await this.detectOne(p);
|
|
49
|
-
steps.push(step);
|
|
50
|
-
if (step.status === 'ok')
|
|
51
|
-
okIds.add(p.id);
|
|
52
|
-
}
|
|
53
|
-
this.cache.set(pkg.id, steps);
|
|
54
|
-
return steps;
|
|
55
|
-
}
|
|
56
|
-
async detectOne(p) {
|
|
57
|
-
if (p.detect.type !== 'exec') {
|
|
58
|
-
return baseStep(p, 'error', { hint: `Unknown detect type: ${p.detect.type}` });
|
|
59
|
-
}
|
|
60
|
-
const timeout = p.detect.timeoutMs ?? 5000;
|
|
61
|
-
let result;
|
|
62
|
-
try {
|
|
63
|
-
result = await this.exec.run(p.detect.command, p.detect.args, { timeout });
|
|
64
|
-
}
|
|
65
|
-
catch (e) {
|
|
66
|
-
const msg = e.message ?? '';
|
|
67
|
-
// TODO: fragile substring sniff — the ExecCapability contract does not
|
|
68
|
-
// define a recognizable timeout signal (no err.code, err.name, or
|
|
69
|
-
// { timedOut } flag). See packages/connector-sdk/src/capabilities.ts
|
|
70
|
-
// near ExecCapability for a proposed fix.
|
|
71
|
-
if (/timeout/i.test(msg))
|
|
72
|
-
return baseStep(p, 'error', { hint: 'Detection timed out' });
|
|
73
|
-
return baseStep(p, 'missing');
|
|
74
|
-
}
|
|
75
|
-
if (p.detect.matchStdout) {
|
|
76
|
-
const re = new RegExp(p.detect.matchStdout);
|
|
77
|
-
return re.test(result.stdout + result.stderr)
|
|
78
|
-
? baseStep(p, 'ok')
|
|
79
|
-
: baseStep(p, 'missing');
|
|
80
|
-
}
|
|
81
|
-
if (p.detect.versionRegex && p.minVersion) {
|
|
82
|
-
const vm = new RegExp(p.detect.versionRegex).exec(result.stdout);
|
|
83
|
-
if (!vm || !vm[1]) {
|
|
84
|
-
return baseStep(p, 'error', { hint: 'Could not parse version' });
|
|
85
|
-
}
|
|
86
|
-
const detectedVersion = vm[1];
|
|
87
|
-
// Normalize for semver: strip leading zeros from numeric segments so
|
|
88
|
-
// zero-padded CalVer (yt-dlp, Ubuntu, Postgres) like `2026.03.17`
|
|
89
|
-
// validates as `2026.3.17`. Ordering is preserved.
|
|
90
|
-
const normalizedDetected = stripLeadingZeros(detectedVersion);
|
|
91
|
-
const normalizedMin = stripLeadingZeros(p.minVersion);
|
|
92
|
-
if (!valid(normalizedDetected)) {
|
|
93
|
-
return baseStep(p, 'error', { hint: 'Could not parse detected version' });
|
|
94
|
-
}
|
|
95
|
-
if (gte(normalizedDetected, normalizedMin)) {
|
|
96
|
-
return baseStep(p, 'ok', { detectedVersion });
|
|
97
|
-
}
|
|
98
|
-
return baseStep(p, 'outdated', {
|
|
99
|
-
detectedVersion,
|
|
100
|
-
hint: `Detected ${detectedVersion}, requires ≥ ${p.minVersion}`,
|
|
101
|
-
});
|
|
102
|
-
}
|
|
103
|
-
return result.exitCode === 0 ? baseStep(p, 'ok') : baseStep(p, 'missing');
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
function stripLeadingZeros(version) {
|
|
107
|
-
return version.replace(/(^|\.)0+(\d)/g, '$1$2');
|
|
108
|
-
}
|
|
109
|
-
//# sourceMappingURL=prerequisites.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"prerequisites.js","sourceRoot":"","sources":["../../src/connectors/prerequisites.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
export interface RegistryConnector {
|
|
2
|
-
name: string;
|
|
3
|
-
id: string;
|
|
4
|
-
platform: string;
|
|
5
|
-
label: string;
|
|
6
|
-
description: string;
|
|
7
|
-
color: string;
|
|
8
|
-
author: string;
|
|
9
|
-
category: string;
|
|
10
|
-
firstParty: boolean;
|
|
11
|
-
bundled: boolean;
|
|
12
|
-
npm: string;
|
|
13
|
-
}
|
|
14
|
-
interface FetchRegistryOpts {
|
|
15
|
-
fetchFn?: typeof fetch;
|
|
16
|
-
cacheDir: string;
|
|
17
|
-
/** Override source. HTTP(S) URL, file:// URL, or absolute filesystem path. */
|
|
18
|
-
url?: string;
|
|
19
|
-
}
|
|
20
|
-
export declare function fetchRegistry(opts: FetchRegistryOpts): Promise<RegistryConnector[]>;
|
|
21
|
-
export {};
|
|
22
|
-
//# sourceMappingURL=registry-fetch.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"registry-fetch.d.ts","sourceRoot":"","sources":["../../src/connectors/registry-fetch.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,MAAM,CAAA;IACV,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,OAAO,CAAA;IACnB,OAAO,EAAE,OAAO,CAAA;IAChB,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,UAAU,iBAAiB;IACzB,OAAO,CAAC,EAAE,OAAO,KAAK,CAAA;IACtB,QAAQ,EAAE,MAAM,CAAA;IAChB,8EAA8E;IAC9E,GAAG,CAAC,EAAE,MAAM,CAAA;CACb;AAaD,wBAAsB,aAAa,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAyBzF"}
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
import { readFileSync, writeFileSync, mkdirSync } from 'node:fs';
|
|
2
|
-
import { join } from 'node:path';
|
|
3
|
-
import { fileURLToPath } from 'node:url';
|
|
4
|
-
const DEFAULT_REGISTRY_URL = 'https://raw.githubusercontent.com/spool-lab/spool/main/packages/landing/public/registry.json';
|
|
5
|
-
const CACHE_FILE = 'registry-cache.json';
|
|
6
|
-
const TIMEOUT_MS = 3_000;
|
|
7
|
-
function isFileSource(url) {
|
|
8
|
-
return url.startsWith('file://') || url.startsWith('/');
|
|
9
|
-
}
|
|
10
|
-
function readLocalRegistry(url) {
|
|
11
|
-
const path = url.startsWith('file://') ? fileURLToPath(url) : url;
|
|
12
|
-
const raw = readFileSync(path, 'utf-8');
|
|
13
|
-
const data = JSON.parse(raw);
|
|
14
|
-
return data.connectors ?? [];
|
|
15
|
-
}
|
|
16
|
-
export async function fetchRegistry(opts) {
|
|
17
|
-
const { fetchFn = globalThis.fetch, cacheDir, url = DEFAULT_REGISTRY_URL } = opts;
|
|
18
|
-
const cachePath = join(cacheDir, CACHE_FILE);
|
|
19
|
-
if (isFileSource(url)) {
|
|
20
|
-
try {
|
|
21
|
-
return readLocalRegistry(url);
|
|
22
|
-
}
|
|
23
|
-
catch {
|
|
24
|
-
return readCachedRegistry(cachePath);
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
try {
|
|
28
|
-
const res = await fetchFn(url, { signal: AbortSignal.timeout(TIMEOUT_MS) });
|
|
29
|
-
if (!res.ok)
|
|
30
|
-
throw new Error(`HTTP ${res.status}`);
|
|
31
|
-
const data = (await res.json());
|
|
32
|
-
const connectors = data.connectors ?? [];
|
|
33
|
-
try {
|
|
34
|
-
mkdirSync(cacheDir, { recursive: true });
|
|
35
|
-
writeFileSync(cachePath, JSON.stringify({ connectors, fetchedAt: Date.now() }));
|
|
36
|
-
}
|
|
37
|
-
catch { }
|
|
38
|
-
return connectors;
|
|
39
|
-
}
|
|
40
|
-
catch {
|
|
41
|
-
return readCachedRegistry(cachePath);
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
function readCachedRegistry(cachePath) {
|
|
45
|
-
try {
|
|
46
|
-
const raw = readFileSync(cachePath, 'utf-8');
|
|
47
|
-
const cached = JSON.parse(raw);
|
|
48
|
-
return cached.connectors ?? [];
|
|
49
|
-
}
|
|
50
|
-
catch {
|
|
51
|
-
return [];
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
//# sourceMappingURL=registry-fetch.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"registry-fetch.js","sourceRoot":"","sources":["../../src/connectors/registry-fetch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAChE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAExC,MAAM,oBAAoB,GACxB,8FAA8F,CAAA;AAChG,MAAM,UAAU,GAAG,qBAAqB,CAAA;AACxC,MAAM,UAAU,GAAG,KAAK,CAAA;AAuBxB,SAAS,YAAY,CAAC,GAAW;IAC/B,OAAO,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAA;AACzD,CAAC;AAED,SAAS,iBAAiB,CAAC,GAAW;IACpC,MAAM,IAAI,GAAG,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAA;IACjE,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IACvC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAyC,CAAA;IACpE,OAAO,IAAI,CAAC,UAAU,IAAI,EAAE,CAAA;AAC9B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAuB;IACzD,MAAM,EAAE,OAAO,GAAG,UAAU,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,GAAG,oBAAoB,EAAE,GAAG,IAAI,CAAA;IACjF,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAA;IAE5C,IAAI,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;QACtB,IAAI,CAAC;YACH,OAAO,iBAAiB,CAAC,GAAG,CAAC,CAAA;QAC/B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,kBAAkB,CAAC,SAAS,CAAC,CAAA;QACtC,CAAC;IACH,CAAC;IAED,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,CAAA;QAC3E,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC,CAAA;QAClD,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAyC,CAAA;QACvE,MAAM,UAAU,GAAwB,IAAI,CAAC,UAAU,IAAI,EAAE,CAAA;QAC7D,IAAI,CAAC;YACH,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;YACxC,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAA;QACjF,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;QACV,OAAO,UAAU,CAAA;IACnB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,kBAAkB,CAAC,SAAS,CAAC,CAAA;IACtC,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,SAAiB;IAC3C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;QAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QAC9B,OAAO,MAAM,CAAC,UAAU,IAAI,EAAE,CAAA;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAA;IACX,CAAC;AACH,CAAC"}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import type { Connector, ConnectorPackage } from './types.js';
|
|
2
|
-
/**
|
|
3
|
-
* In-memory registry of available connectors.
|
|
4
|
-
*
|
|
5
|
-
* Connectors are registered at app startup. The registry is the single source
|
|
6
|
-
* of truth for "what connectors exist" — the scheduler and UI both read from it.
|
|
7
|
-
*/
|
|
8
|
-
export declare class ConnectorRegistry {
|
|
9
|
-
private connectors;
|
|
10
|
-
private packages;
|
|
11
|
-
register(connector: Connector): void;
|
|
12
|
-
registerPackage(pkg: ConnectorPackage): void;
|
|
13
|
-
getPackage(id: string): ConnectorPackage | undefined;
|
|
14
|
-
listPackages(): ConnectorPackage[];
|
|
15
|
-
get(id: string): Connector;
|
|
16
|
-
has(id: string): boolean;
|
|
17
|
-
remove(id: string): boolean;
|
|
18
|
-
clear(): void;
|
|
19
|
-
list(): Connector[];
|
|
20
|
-
/** List connectors for a specific platform. */
|
|
21
|
-
listByPlatform(platform: string): Connector[];
|
|
22
|
-
}
|
|
23
|
-
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/connectors/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAE7D;;;;;GAKG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,UAAU,CAA+B;IACjD,OAAO,CAAC,QAAQ,CAAsC;IAEtD,QAAQ,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI;IAIpC,eAAe,CAAC,GAAG,EAAE,gBAAgB,GAAG,IAAI;IAgB5C,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS;IAIpD,YAAY,IAAI,gBAAgB,EAAE;IAIlC,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS;IAM1B,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAIxB,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAI3B,KAAK,IAAI,IAAI;IAKb,IAAI,IAAI,SAAS,EAAE;IAInB,+CAA+C;IAC/C,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE;CAG9C"}
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* In-memory registry of available connectors.
|
|
3
|
-
*
|
|
4
|
-
* Connectors are registered at app startup. The registry is the single source
|
|
5
|
-
* of truth for "what connectors exist" — the scheduler and UI both read from it.
|
|
6
|
-
*/
|
|
7
|
-
export class ConnectorRegistry {
|
|
8
|
-
connectors = new Map();
|
|
9
|
-
packages = new Map();
|
|
10
|
-
register(connector) {
|
|
11
|
-
this.connectors.set(connector.id, connector);
|
|
12
|
-
}
|
|
13
|
-
registerPackage(pkg) {
|
|
14
|
-
const existing = this.packages.get(pkg.id);
|
|
15
|
-
if (existing) {
|
|
16
|
-
// Multi-connector packages register once per sub-connector — merge the connectors list
|
|
17
|
-
const mergedConnectors = [...existing.connectors];
|
|
18
|
-
for (const c of pkg.connectors) {
|
|
19
|
-
if (!mergedConnectors.some(e => e.id === c.id)) {
|
|
20
|
-
mergedConnectors.push(c);
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
this.packages.set(pkg.id, { ...pkg, connectors: mergedConnectors });
|
|
24
|
-
}
|
|
25
|
-
else {
|
|
26
|
-
this.packages.set(pkg.id, pkg);
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
getPackage(id) {
|
|
30
|
-
return this.packages.get(id);
|
|
31
|
-
}
|
|
32
|
-
listPackages() {
|
|
33
|
-
return Array.from(this.packages.values());
|
|
34
|
-
}
|
|
35
|
-
get(id) {
|
|
36
|
-
const connector = this.connectors.get(id);
|
|
37
|
-
if (!connector)
|
|
38
|
-
throw new Error(`Connector "${id}" not found`);
|
|
39
|
-
return connector;
|
|
40
|
-
}
|
|
41
|
-
has(id) {
|
|
42
|
-
return this.connectors.has(id);
|
|
43
|
-
}
|
|
44
|
-
remove(id) {
|
|
45
|
-
return this.connectors.delete(id);
|
|
46
|
-
}
|
|
47
|
-
clear() {
|
|
48
|
-
this.connectors.clear();
|
|
49
|
-
this.packages.clear();
|
|
50
|
-
}
|
|
51
|
-
list() {
|
|
52
|
-
return Array.from(this.connectors.values());
|
|
53
|
-
}
|
|
54
|
-
/** List connectors for a specific platform. */
|
|
55
|
-
listByPlatform(platform) {
|
|
56
|
-
return this.list().filter(c => c.platform === platform);
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
//# sourceMappingURL=registry.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/connectors/registry.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,MAAM,OAAO,iBAAiB;IACpB,UAAU,GAAG,IAAI,GAAG,EAAqB,CAAA;IACzC,QAAQ,GAAG,IAAI,GAAG,EAA4B,CAAA;IAEtD,QAAQ,CAAC,SAAoB;QAC3B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,EAAE,SAAS,CAAC,CAAA;IAC9C,CAAC;IAED,eAAe,CAAC,GAAqB;QACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QAC1C,IAAI,QAAQ,EAAE,CAAC;YACb,uFAAuF;YACvF,MAAM,gBAAgB,GAAG,CAAC,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAA;YACjD,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC;gBAC/B,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;oBAC/C,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;gBAC1B,CAAC;YACH,CAAC;YACD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,UAAU,EAAE,gBAAgB,EAAE,CAAC,CAAA;QACrE,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAA;QAChC,CAAC;IACH,CAAC;IAED,UAAU,CAAC,EAAU;QACnB,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IAC9B,CAAC;IAED,YAAY;QACV,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAA;IAC3C,CAAC;IAED,GAAG,CAAC,EAAU;QACZ,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACzC,IAAI,CAAC,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,cAAc,EAAE,aAAa,CAAC,CAAA;QAC9D,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,GAAG,CAAC,EAAU;QACZ,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IAChC,CAAC;IAED,MAAM,CAAC,EAAU;QACf,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;IACnC,CAAC;IAED,KAAK;QACH,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAA;QACvB,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAA;IACvB,CAAC;IAED,IAAI;QACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAA;IAC7C,CAAC;IAED,+CAA+C;IAC/C,cAAc,CAAC,QAAgB;QAC7B,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAA;IACzD,CAAC;CACF"}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import type Database from 'better-sqlite3';
|
|
2
|
-
import { Effect } from 'effect';
|
|
3
|
-
import type { Connector, SyncState, SyncOptions, ConnectorSyncResult } from './types.js';
|
|
4
|
-
export declare function loadSyncState(db: Database.Database, connectorId: string): SyncState;
|
|
5
|
-
export declare function saveSyncState(db: Database.Database, state: SyncState): void;
|
|
6
|
-
export declare class SyncEngine {
|
|
7
|
-
private db;
|
|
8
|
-
constructor(db: Database.Database);
|
|
9
|
-
loadState(connectorId: string): SyncState;
|
|
10
|
-
/**
|
|
11
|
-
* Effect-native entry point. Returns an Effect that, when run, executes a
|
|
12
|
-
* full sync cycle (ephemeral or dual-frontier persistent) and records the
|
|
13
|
-
* outcome in connector_sync_state. The Effect is `Effect<ConnectorSyncResult, never>`
|
|
14
|
-
* because all SyncErrors are caught internally and encoded in `result.error`.
|
|
15
|
-
*
|
|
16
|
-
* Preferred by callers that already live in the Effect world (the Scheduler
|
|
17
|
-
* Effect migration, tests that want to inject Logger / Tracer layers via
|
|
18
|
-
* `Effect.provide`). Promise-based callers should use `sync()` instead.
|
|
19
|
-
*/
|
|
20
|
-
syncEffect(connector: Connector, opts?: SyncOptions): Effect.Effect<ConnectorSyncResult>;
|
|
21
|
-
sync(connector: Connector, opts?: SyncOptions): Promise<ConnectorSyncResult>;
|
|
22
|
-
/**
|
|
23
|
-
* Fetch pages in an Effect-based loop until a stop condition is met.
|
|
24
|
-
* Errors are caught internally and returned in the result (never fails).
|
|
25
|
-
*/
|
|
26
|
-
private fetchLoopEffect;
|
|
27
|
-
private syncPersistentEffect;
|
|
28
|
-
private syncEphemeralEffect;
|
|
29
|
-
}
|
|
30
|
-
//# sourceMappingURL=sync-engine.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sync-engine.d.ts","sourceRoot":"","sources":["../../src/connectors/sync-engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAA;AAE1C,OAAO,EAA6B,MAAM,EAAS,MAAM,QAAQ,CAAA;AACjE,OAAO,KAAK,EACV,SAAS,EAET,SAAS,EACT,WAAW,EACX,mBAAmB,EAEpB,MAAM,YAAY,CAAA;AAqEnB,wBAAgB,aAAa,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,WAAW,EAAE,MAAM,GAAG,SAAS,CA0CnF;AAED,wBAAgB,aAAa,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,KAAK,EAAE,SAAS,GAAG,IAAI,CAgC3E;AAmHD,qBAAa,UAAU;IACT,OAAO,CAAC,EAAE;gBAAF,EAAE,EAAE,QAAQ,CAAC,QAAQ;IAEzC,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS;IAIzC;;;;;;;;;OASG;IACH,UAAU,CACR,SAAS,EAAE,SAAS,EACpB,IAAI,GAAE,WAAgB,GACrB,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC;IA0C/B,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IA6BtF;;;OAGG;IACH,OAAO,CAAC,eAAe;IAoMvB,OAAO,CAAC,oBAAoB;IA6G5B,OAAO,CAAC,mBAAmB;CA+G5B"}
|