@rawdash/adapter-libsql 0.29.0 → 0.29.2

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/index.d.ts CHANGED
@@ -1,6 +1,12 @@
1
1
  import { Client } from '@libsql/client/web';
2
- import { ServerStorage, GetStorageHandleOptions, StorageHandle, ConnectorHealth, SyncState, SyncSchedulingState, MarkConnectorSyncSucceededOptions } from '@rawdash/core';
2
+ import { ServerStorage, GetStorageHandleOptions, StorageHandle, ConnectorHealth, SyncState, SyncSchedulingState, MarkConnectorSyncSucceededOptions, RekeyConnectorResult } from '@rawdash/core';
3
+ import { Generated, ColumnType } from 'kysely';
3
4
 
5
+ declare class SchemaNotInitializedError extends Error {
6
+ constructor(message: string, options?: {
7
+ cause?: unknown;
8
+ });
9
+ }
4
10
  declare function initLibsqlSchema(client: Client): Promise<void>;
5
11
  interface LibsqlStorageOptions {
6
12
  client: Client;
@@ -24,9 +30,105 @@ declare class LibsqlStorage implements ServerStorage {
24
30
  markSyncSucceeded(): Promise<void>;
25
31
  markConnectorSyncSucceeded(connectorId: string, options?: MarkConnectorSyncSucceededOptions): Promise<void>;
26
32
  markSyncFailed(error: string): Promise<void>;
33
+ rekeyConnectorId(fromConnectorId: string, toConnectorId: string): Promise<RekeyConnectorResult>;
27
34
  close(): Promise<void>;
28
35
  }
29
36
 
37
+ type JsonText = ColumnType<string, string, string>;
38
+ interface EventsTable {
39
+ id: Generated<number>;
40
+ connector_id: string;
41
+ name: string;
42
+ start_ts: number;
43
+ end_ts: number | null;
44
+ attributes: JsonText;
45
+ }
46
+ interface EntitiesTable {
47
+ connector_id: string;
48
+ type: string;
49
+ id: string;
50
+ attributes: JsonText;
51
+ updated_at: number;
52
+ }
53
+ interface MetricsTable {
54
+ id: Generated<number>;
55
+ connector_id: string;
56
+ name: string;
57
+ ts: number;
58
+ value: number;
59
+ attributes: JsonText;
60
+ }
61
+ interface EdgesTable {
62
+ connector_id: string;
63
+ from_type: string;
64
+ from_id: string;
65
+ kind: string;
66
+ to_type: string;
67
+ to_id: string;
68
+ attributes: JsonText;
69
+ updated_at: number;
70
+ }
71
+ interface DistributionsTable {
72
+ id: Generated<number>;
73
+ connector_id: string;
74
+ name: string;
75
+ ts: number;
76
+ kind: string;
77
+ data: JsonText;
78
+ attributes: JsonText;
79
+ }
80
+ interface RollupsTable {
81
+ connector_id: string;
82
+ resource: string;
83
+ field: string;
84
+ granularity: string;
85
+ dims_key: string;
86
+ dims: JsonText;
87
+ bucket_start: number;
88
+ partials: JsonText;
89
+ }
90
+ interface RollupWatermarksTable {
91
+ connector_id: string;
92
+ resource: string;
93
+ watermark: number;
94
+ }
95
+ interface SyncStateTable {
96
+ id: number;
97
+ status: string;
98
+ queued_at: string | null;
99
+ started_at: string | null;
100
+ last_sync_at: string | null;
101
+ last_error: string | null;
102
+ }
103
+ interface ConnectorSyncStateTable {
104
+ connector_id: string;
105
+ last_sync_at: string | null;
106
+ last_backfill_at: string | null;
107
+ }
108
+ interface SchemaMigrationsTable {
109
+ version: number;
110
+ tag: string;
111
+ applied_at: number;
112
+ }
113
+ interface Database {
114
+ events: EventsTable;
115
+ entities: EntitiesTable;
116
+ metrics: MetricsTable;
117
+ edges: EdgesTable;
118
+ distributions: DistributionsTable;
119
+ rollups: RollupsTable;
120
+ rollup_watermarks: RollupWatermarksTable;
121
+ sync_state: SyncStateTable;
122
+ connector_sync_state: ConnectorSyncStateTable;
123
+ schema_migrations: SchemaMigrationsTable;
124
+ }
125
+ type ConnectorKeyedTable = {
126
+ [K in keyof Database]: Database[K] extends {
127
+ connector_id: string;
128
+ } ? K : never;
129
+ }[keyof Database];
130
+ declare const CONNECTOR_KEYED_TABLES: readonly ["entities", "events", "metrics", "edges", "distributions", "rollups", "rollup_watermarks", "connector_sync_state"];
131
+
30
132
  interface ApplyMigrationsOptions {
31
133
  assumeLegacyBaselineIfEventsExists?: boolean;
32
134
  }
@@ -39,4 +141,4 @@ interface BundledMigration {
39
141
  }
40
142
  declare const MIGRATIONS: readonly BundledMigration[];
41
143
 
42
- export { type ApplyMigrationsOptions, type BundledMigration, LibsqlStorage, type LibsqlStorageOptions, MIGRATIONS, applyMigrations, initLibsqlSchema, migrateIfNeeded };
144
+ export { type ApplyMigrationsOptions, type BundledMigration, CONNECTOR_KEYED_TABLES, type ConnectorKeyedTable, LibsqlStorage, type LibsqlStorageOptions, MIGRATIONS, SchemaNotInitializedError, applyMigrations, initLibsqlSchema, migrateIfNeeded };
package/dist/index.js CHANGED
@@ -7,6 +7,18 @@ import {
7
7
  import { Kysely, sql } from "kysely";
8
8
  import { LibsqlDialect } from "kysely-libsql";
9
9
 
10
+ // src/db-schema.ts
11
+ var CONNECTOR_KEYED_TABLES = [
12
+ "entities",
13
+ "events",
14
+ "metrics",
15
+ "edges",
16
+ "distributions",
17
+ "rollups",
18
+ "rollup_watermarks",
19
+ "connector_sync_state"
20
+ ];
21
+
10
22
  // src/migrations-bundle.ts
11
23
  var MIGRATIONS = [
12
24
  {
@@ -141,6 +153,29 @@ async function applyMigrations(client, opts = {}) {
141
153
 
142
154
  // src/libsql-storage.ts
143
155
  var SYNC_STATE_ID = 1;
156
+ var MISSING_SCHEMA_PATTERN = /no such (table|column)/i;
157
+ var SchemaNotInitializedError = class extends Error {
158
+ constructor(message, options) {
159
+ super(message, options);
160
+ this.name = "SchemaNotInitializedError";
161
+ }
162
+ };
163
+ function getErrorMessage(err) {
164
+ return err instanceof Error ? err.message : String(err);
165
+ }
166
+ function isMissingSchemaError(err) {
167
+ return MISSING_SCHEMA_PATTERN.test(getErrorMessage(err));
168
+ }
169
+ async function runRead(fn) {
170
+ try {
171
+ return await fn();
172
+ } catch (err) {
173
+ if (isMissingSchemaError(err)) {
174
+ throw new SchemaNotInitializedError(getErrorMessage(err), { cause: err });
175
+ }
176
+ throw err;
177
+ }
178
+ }
144
179
  async function initLibsqlSchema(client) {
145
180
  await applyMigrations(client, { assumeLegacyBaselineIfEventsExists: true });
146
181
  await client.execute({
@@ -166,6 +201,24 @@ function createDb(client) {
166
201
  function toBatchStmt(q) {
167
202
  return { sql: q.sql, args: q.parameters };
168
203
  }
204
+ var DELETE_IDENTITY_CHUNK_SIZE = 200;
205
+ function chunk(items, size) {
206
+ const chunks = [];
207
+ for (let i = 0; i < items.length; i += size) {
208
+ chunks.push(items.slice(i, i + size));
209
+ }
210
+ return chunks;
211
+ }
212
+ function dedupeBy(items, keyOf) {
213
+ const byKey = /* @__PURE__ */ new Map();
214
+ for (const item of items) {
215
+ const key = keyOf(item);
216
+ if (!byKey.has(key)) {
217
+ byKey.set(key, item);
218
+ }
219
+ }
220
+ return [...byKey.values()];
221
+ }
169
222
  var LibsqlStorage = class {
170
223
  client;
171
224
  db;
@@ -434,7 +487,7 @@ var LibsqlStorage = class {
434
487
  if (q.end !== void 0) {
435
488
  qb = qb.where("start_ts", "<=", q.end);
436
489
  }
437
- const rows = await qb.execute();
490
+ const rows = await runRead(() => qb.execute());
438
491
  return rows.map(
439
492
  (r) => ({
440
493
  name: r.name,
@@ -446,7 +499,9 @@ var LibsqlStorage = class {
446
499
  },
447
500
  getEntity: async (type, id) => {
448
501
  await ready;
449
- const r = await db.selectFrom("entities").select(["type", "id", "attributes", "updated_at"]).where("connector_id", "=", connectorId).where("type", "=", type).where("id", "=", id).limit(1).executeTakeFirst();
502
+ const r = await runRead(
503
+ () => db.selectFrom("entities").select(["type", "id", "attributes", "updated_at"]).where("connector_id", "=", connectorId).where("type", "=", type).where("id", "=", id).limit(1).executeTakeFirst()
504
+ );
450
505
  if (!r) {
451
506
  return null;
452
507
  }
@@ -459,7 +514,11 @@ var LibsqlStorage = class {
459
514
  },
460
515
  queryEntities: async (q) => {
461
516
  await ready;
462
- const rows = await db.selectFrom("entities").select(["type", "id", "attributes", "updated_at"]).where("connector_id", "=", connectorId).where("type", "=", q.type).execute();
517
+ let qb = db.selectFrom("entities").select(["type", "id", "attributes", "updated_at"]).where("connector_id", "=", connectorId);
518
+ if (q.type !== void 0) {
519
+ qb = qb.where("type", "=", q.type);
520
+ }
521
+ const rows = await runRead(() => qb.execute());
463
522
  return rows.map(
464
523
  (r) => ({
465
524
  type: r.type,
@@ -481,7 +540,7 @@ var LibsqlStorage = class {
481
540
  if (q.end !== void 0) {
482
541
  qb = qb.where("ts", "<=", q.end);
483
542
  }
484
- const rows = await qb.execute();
543
+ const rows = await runRead(() => qb.execute());
485
544
  return rows.map(
486
545
  (r) => ({
487
546
  name: r.name,
@@ -517,7 +576,7 @@ var LibsqlStorage = class {
517
576
  if (q.toId !== void 0) {
518
577
  qb = qb.where("to_id", "=", q.toId);
519
578
  }
520
- const rows = await qb.execute();
579
+ const rows = await runRead(() => qb.execute());
521
580
  return rows.map(
522
581
  (r) => ({
523
582
  from_type: r.from_type,
@@ -542,7 +601,7 @@ var LibsqlStorage = class {
542
601
  if (q.end !== void 0) {
543
602
  qb = qb.where("ts", "<=", q.end);
544
603
  }
545
- const rows = await qb.execute();
604
+ const rows = await runRead(() => qb.execute());
546
605
  return rows.map((r) => {
547
606
  const base = {
548
607
  name: r.name,
@@ -582,6 +641,99 @@ var LibsqlStorage = class {
582
641
  `Unsupported shape for deleteOlderThan: ${String(shape)}`
583
642
  );
584
643
  },
644
+ deleteByIdentity: async (targets) => {
645
+ await ready;
646
+ const stmts = [];
647
+ const events = dedupeBy(
648
+ targets.events ?? [],
649
+ (e) => `${e.name}\0${e.start_ts}\0${JSON.stringify(e.attributes)}`
650
+ );
651
+ for (const group of chunk(events, DELETE_IDENTITY_CHUNK_SIZE)) {
652
+ stmts.push(
653
+ toBatchStmt(
654
+ db.deleteFrom("events").where("connector_id", "=", connectorId).where(
655
+ (eb) => eb.or(
656
+ group.map(
657
+ (e) => eb.and([
658
+ eb("name", "=", e.name),
659
+ eb("start_ts", "=", e.start_ts),
660
+ eb("attributes", "=", JSON.stringify(e.attributes))
661
+ ])
662
+ )
663
+ )
664
+ ).compile()
665
+ )
666
+ );
667
+ }
668
+ const metrics = dedupeBy(
669
+ targets.metrics ?? [],
670
+ (m) => `${m.name}\0${m.ts}\0${JSON.stringify(m.attributes)}`
671
+ );
672
+ for (const group of chunk(metrics, DELETE_IDENTITY_CHUNK_SIZE)) {
673
+ stmts.push(
674
+ toBatchStmt(
675
+ db.deleteFrom("metrics").where("connector_id", "=", connectorId).where(
676
+ (eb) => eb.or(
677
+ group.map(
678
+ (m) => eb.and([
679
+ eb("name", "=", m.name),
680
+ eb("ts", "=", m.ts),
681
+ eb("attributes", "=", JSON.stringify(m.attributes))
682
+ ])
683
+ )
684
+ )
685
+ ).compile()
686
+ )
687
+ );
688
+ }
689
+ const distributions = dedupeBy(
690
+ targets.distributions ?? [],
691
+ (d) => `${d.name}\0${d.ts}\0${JSON.stringify(d.attributes)}`
692
+ );
693
+ for (const group of chunk(distributions, DELETE_IDENTITY_CHUNK_SIZE)) {
694
+ stmts.push(
695
+ toBatchStmt(
696
+ db.deleteFrom("distributions").where("connector_id", "=", connectorId).where(
697
+ (eb) => eb.or(
698
+ group.map(
699
+ (d) => eb.and([
700
+ eb("name", "=", d.name),
701
+ eb("ts", "=", d.ts),
702
+ eb("attributes", "=", JSON.stringify(d.attributes))
703
+ ])
704
+ )
705
+ )
706
+ ).compile()
707
+ )
708
+ );
709
+ }
710
+ const entities = dedupeBy(
711
+ targets.entities ?? [],
712
+ (e) => `${e.type}\0${e.id}`
713
+ );
714
+ for (const group of chunk(entities, DELETE_IDENTITY_CHUNK_SIZE)) {
715
+ stmts.push(
716
+ toBatchStmt(
717
+ db.deleteFrom("entities").where("connector_id", "=", connectorId).where(
718
+ (eb) => eb.or(
719
+ group.map(
720
+ (e) => eb.and([eb("type", "=", e.type), eb("id", "=", e.id)])
721
+ )
722
+ )
723
+ ).compile()
724
+ )
725
+ );
726
+ }
727
+ if (stmts.length === 0) {
728
+ return { rowsDeleted: 0 };
729
+ }
730
+ const results = await client.batch(stmts, "write");
731
+ const rowsDeleted = results.reduce(
732
+ (sum, r) => sum + Number(r.rowsAffected),
733
+ 0
734
+ );
735
+ return { rowsDeleted };
736
+ },
585
737
  writeRollups: async (buckets) => {
586
738
  await ready;
587
739
  if (buckets.length === 0) {
@@ -628,7 +780,7 @@ var LibsqlStorage = class {
628
780
  if (q.end !== void 0) {
629
781
  qb = qb.where("bucket_start", "<", q.end);
630
782
  }
631
- const rows = await qb.execute();
783
+ const rows = await runRead(() => qb.execute());
632
784
  return rows.map(
633
785
  (r) => ({
634
786
  resource: r.resource,
@@ -652,7 +804,9 @@ var LibsqlStorage = class {
652
804
  },
653
805
  getRollupWatermark: async (resource) => {
654
806
  await ready;
655
- const r = await db.selectFrom("rollup_watermarks").select(["watermark"]).where("connector_id", "=", connectorId).where("resource", "=", resource).limit(1).executeTakeFirst();
807
+ const r = await runRead(
808
+ () => db.selectFrom("rollup_watermarks").select(["watermark"]).where("connector_id", "=", connectorId).where("resource", "=", resource).limit(1).executeTakeFirst()
809
+ );
656
810
  return r ? Number(r.watermark) : null;
657
811
  },
658
812
  setRollupWatermark: async (resource, tsUnixMs) => {
@@ -770,14 +924,34 @@ var LibsqlStorage = class {
770
924
  last_error: error
771
925
  }).where("id", "=", SYNC_STATE_ID).execute();
772
926
  }
927
+ async rekeyConnectorId(fromConnectorId, toConnectorId) {
928
+ if (fromConnectorId === toConnectorId) {
929
+ return { rowsAffected: 0 };
930
+ }
931
+ await this.ready;
932
+ const results = await this.client.batch(
933
+ CONNECTOR_KEYED_TABLES.map((table) => ({
934
+ sql: `UPDATE OR IGNORE ${table} SET connector_id = ? WHERE connector_id = ?`,
935
+ args: [toConnectorId, fromConnectorId]
936
+ })),
937
+ "write"
938
+ );
939
+ const rowsAffected = results.reduce(
940
+ (sum, r) => sum + Number(r.rowsAffected ?? 0),
941
+ 0
942
+ );
943
+ return { rowsAffected };
944
+ }
773
945
  async close() {
774
946
  await this.ready.catch(() => void 0);
775
947
  this.client.close();
776
948
  }
777
949
  };
778
950
  export {
951
+ CONNECTOR_KEYED_TABLES,
779
952
  LibsqlStorage,
780
953
  MIGRATIONS,
954
+ SchemaNotInitializedError,
781
955
  applyMigrations,
782
956
  initLibsqlSchema,
783
957
  migrateIfNeeded
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/libsql-storage.ts","../src/migrations-bundle.ts","../src/migrate.ts"],"sourcesContent":["import type { Client, InValue } from '@libsql/client/web';\nimport type {\n ConnectorHealth,\n Distribution,\n DistributionQuery,\n Edge,\n EdgeQuery,\n Entity,\n EntityQuery,\n Event,\n EventQuery,\n GetStorageHandleOptions,\n Granularity,\n JSONValue,\n MarkConnectorSyncSucceededOptions,\n MetricQuery,\n MetricSample,\n RollupBucket,\n RollupPartials,\n RollupQuery,\n ServerStorage,\n StorageHandle,\n SyncSchedulingState,\n SyncState,\n} from '@rawdash/core';\nimport {\n dimsKey,\n healthStatusFromSyncStatus,\n withAbortSignal,\n} from '@rawdash/core';\nimport { type CompiledQuery, type Insertable, Kysely, sql } from 'kysely';\nimport { LibsqlDialect } from 'kysely-libsql';\n\nimport type {\n Database,\n EdgesTable,\n EntitiesTable,\n EventsTable,\n MetricsTable,\n RollupsTable,\n} from './db-schema';\nimport { applyMigrations } from './migrate';\n\ntype Attrs = Record<string, JSONValue>;\n\nconst SYNC_STATE_ID = 1;\n\nexport async function initLibsqlSchema(client: Client): Promise<void> {\n await applyMigrations(client, { assumeLegacyBaselineIfEventsExists: true });\n await client.execute({\n sql: \"INSERT OR IGNORE INTO sync_state (id, status, queued_at, started_at, last_sync_at, last_error) VALUES (?, 'idle', NULL, NULL, NULL, NULL)\",\n args: [SYNC_STATE_ID],\n });\n}\n\nfunction parseJson<T>(value: unknown, fallback: T): T {\n if (typeof value !== 'string') {\n return fallback;\n }\n try {\n return JSON.parse(value) as T;\n } catch {\n return fallback;\n }\n}\n\nfunction createDb(client: Client): Kysely<Database> {\n return new Kysely<Database>({\n dialect: new LibsqlDialect({ client }),\n });\n}\n\nfunction toBatchStmt(q: CompiledQuery): { sql: string; args: InValue[] } {\n return { sql: q.sql, args: q.parameters as InValue[] };\n}\n\nexport interface LibsqlStorageOptions {\n client: Client;\n initSchema?: boolean;\n}\n\nexport class LibsqlStorage implements ServerStorage {\n private client: Client;\n private db: Kysely<Database>;\n private ready: Promise<void>;\n private initError: string | null = null;\n\n constructor(options: LibsqlStorageOptions) {\n this.client = options.client;\n this.db = createDb(options.client);\n this.ready = options.initSchema === false ? Promise.resolve() : this.init();\n }\n\n private async init(): Promise<void> {\n try {\n await initLibsqlSchema(this.client);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n this.initError = `init failed: ${message}`;\n throw err;\n }\n }\n\n async waitUntilReady(): Promise<void> {\n return this.ready;\n }\n\n getStorageHandle(\n connectorId: string,\n options?: GetStorageHandleOptions,\n ): StorageHandle {\n const handle = this.buildHandle(connectorId);\n return options?.signal ? withAbortSignal(handle, options.signal) : handle;\n }\n\n private buildHandle(connectorId: string): StorageHandle {\n const ready = this.ready;\n const db = this.db;\n const client = this.client;\n\n const eventRow = (e: Event): Insertable<EventsTable> => ({\n connector_id: connectorId,\n name: e.name,\n start_ts: e.start_ts,\n end_ts: e.end_ts,\n attributes: JSON.stringify(e.attributes),\n });\n\n const entityRow = (e: Entity): Insertable<EntitiesTable> => ({\n connector_id: connectorId,\n type: e.type,\n id: e.id,\n attributes: JSON.stringify(e.attributes),\n updated_at: e.updated_at,\n });\n\n const metricRow = (m: MetricSample): Insertable<MetricsTable> => ({\n connector_id: connectorId,\n name: m.name,\n ts: m.ts,\n value: m.value,\n attributes: JSON.stringify(m.attributes),\n });\n\n const edgeRow = (e: Edge): Insertable<EdgesTable> => ({\n connector_id: connectorId,\n from_type: e.from_type,\n from_id: e.from_id,\n kind: e.kind,\n to_type: e.to_type,\n to_id: e.to_id,\n attributes: JSON.stringify(e.attributes),\n updated_at: e.updated_at,\n });\n\n const distributionRow = (d: Distribution) => ({\n connector_id: connectorId,\n name: d.name,\n ts: d.ts,\n kind: d.kind,\n data: JSON.stringify(d.data),\n attributes: JSON.stringify(d.attributes),\n });\n\n const rollupRow = (b: RollupBucket): Insertable<RollupsTable> => ({\n connector_id: connectorId,\n resource: b.resource,\n field: b.field,\n granularity: b.granularity,\n dims_key: dimsKey(b.dims),\n dims: JSON.stringify(b.dims),\n bucket_start: b.bucketStart,\n partials: JSON.stringify(b.partials),\n });\n\n return {\n event: async (e) => {\n await ready;\n await db.insertInto('events').values(eventRow(e)).execute();\n },\n\n entity: async (e) => {\n await ready;\n await db\n .insertInto('entities')\n .values(entityRow(e))\n .onConflict((oc) =>\n oc.columns(['connector_id', 'type', 'id']).doUpdateSet({\n attributes: (eb) => eb.ref('excluded.attributes'),\n updated_at: (eb) => eb.ref('excluded.updated_at'),\n }),\n )\n .execute();\n },\n\n metric: async (m) => {\n await ready;\n await db.insertInto('metrics').values(metricRow(m)).execute();\n },\n\n edge: async (e) => {\n await ready;\n await db\n .insertInto('edges')\n .values(edgeRow(e))\n .onConflict((oc) =>\n oc\n .columns([\n 'connector_id',\n 'from_type',\n 'from_id',\n 'kind',\n 'to_type',\n 'to_id',\n ])\n .doUpdateSet({\n attributes: (eb) => eb.ref('excluded.attributes'),\n updated_at: (eb) => eb.ref('excluded.updated_at'),\n }),\n )\n .execute();\n },\n\n distribution: async (d) => {\n await ready;\n await db\n .insertInto('distributions')\n .values(distributionRow(d))\n .execute();\n },\n\n events: async (es, scope) => {\n await ready;\n const names = Array.from(\n new Set(scope?.names ?? es.map((e) => e.name)),\n );\n const stmts: { sql: string; args: InValue[] }[] = [];\n if (names.length > 0) {\n stmts.push(\n toBatchStmt(\n db\n .deleteFrom('events')\n .where('connector_id', '=', connectorId)\n .where('name', 'in', names)\n .compile(),\n ),\n );\n }\n if (es.length > 0) {\n stmts.push(\n toBatchStmt(\n db.insertInto('events').values(es.map(eventRow)).compile(),\n ),\n );\n }\n if (stmts.length > 0) {\n await client.batch(stmts, 'write');\n }\n },\n\n entities: async (es, scope) => {\n await ready;\n const types = Array.from(\n new Set(scope?.types ?? es.map((e) => e.type)),\n );\n const stmts: { sql: string; args: InValue[] }[] = [];\n if (types.length > 0) {\n stmts.push(\n toBatchStmt(\n db\n .deleteFrom('entities')\n .where('connector_id', '=', connectorId)\n .where('type', 'in', types)\n .compile(),\n ),\n );\n }\n if (es.length > 0) {\n stmts.push(\n toBatchStmt(\n db\n .insertInto('entities')\n .values(es.map(entityRow))\n .onConflict((oc) =>\n oc.columns(['connector_id', 'type', 'id']).doUpdateSet({\n attributes: (eb) => eb.ref('excluded.attributes'),\n updated_at: (eb) => eb.ref('excluded.updated_at'),\n }),\n )\n .compile(),\n ),\n );\n }\n if (stmts.length > 0) {\n await client.batch(stmts, 'write');\n }\n },\n\n metrics: async (ms, scope) => {\n await ready;\n const names = Array.from(\n new Set(scope?.names ?? ms.map((m) => m.name)),\n );\n const window = scope?.replaceWindow;\n const stmts: { sql: string; args: InValue[] }[] = [];\n if (names.length > 0) {\n let del = db\n .deleteFrom('metrics')\n .where('connector_id', '=', connectorId)\n .where('name', 'in', names);\n if (window) {\n del = del\n .where('ts', '>=', window.start)\n .where('ts', '<=', window.end);\n }\n stmts.push(toBatchStmt(del.compile()));\n }\n if (ms.length > 0) {\n stmts.push(\n toBatchStmt(\n db.insertInto('metrics').values(ms.map(metricRow)).compile(),\n ),\n );\n }\n if (stmts.length > 0) {\n await client.batch(stmts, 'write');\n }\n },\n\n edges: async (es, scope) => {\n await ready;\n const kinds = Array.from(\n new Set(scope?.kinds ?? es.map((e) => e.kind)),\n );\n const stmts: { sql: string; args: InValue[] }[] = [];\n if (kinds.length > 0) {\n stmts.push(\n toBatchStmt(\n db\n .deleteFrom('edges')\n .where('connector_id', '=', connectorId)\n .where('kind', 'in', kinds)\n .compile(),\n ),\n );\n }\n if (es.length > 0) {\n stmts.push(\n toBatchStmt(\n db\n .insertInto('edges')\n .values(es.map(edgeRow))\n .onConflict((oc) =>\n oc\n .columns([\n 'connector_id',\n 'from_type',\n 'from_id',\n 'kind',\n 'to_type',\n 'to_id',\n ])\n .doUpdateSet({\n attributes: (eb) => eb.ref('excluded.attributes'),\n updated_at: (eb) => eb.ref('excluded.updated_at'),\n }),\n )\n .compile(),\n ),\n );\n }\n if (stmts.length > 0) {\n await client.batch(stmts, 'write');\n }\n },\n\n distributions: async (ds, scope) => {\n await ready;\n const names = Array.from(\n new Set(scope?.names ?? ds.map((d) => d.name)),\n );\n const window = scope?.replaceWindow;\n const stmts: { sql: string; args: InValue[] }[] = [];\n if (names.length > 0) {\n let del = db\n .deleteFrom('distributions')\n .where('connector_id', '=', connectorId)\n .where('name', 'in', names);\n if (window) {\n del = del\n .where('ts', '>=', window.start)\n .where('ts', '<=', window.end);\n }\n stmts.push(toBatchStmt(del.compile()));\n }\n if (ds.length > 0) {\n stmts.push(\n toBatchStmt(\n db\n .insertInto('distributions')\n .values(ds.map(distributionRow))\n .compile(),\n ),\n );\n }\n if (stmts.length > 0) {\n await client.batch(stmts, 'write');\n }\n },\n\n queryEvents: async (q: EventQuery) => {\n await ready;\n let qb = db\n .selectFrom('events')\n .select(['name', 'start_ts', 'end_ts', 'attributes'])\n .where('connector_id', '=', connectorId);\n if (q.name !== undefined) {\n qb = qb.where('name', '=', q.name);\n }\n if (q.start !== undefined) {\n qb = qb.where('start_ts', '>=', q.start);\n }\n if (q.end !== undefined) {\n qb = qb.where('start_ts', '<=', q.end);\n }\n const rows = await qb.execute();\n return rows.map(\n (r): Event => ({\n name: r.name,\n start_ts: Number(r.start_ts),\n end_ts: r.end_ts === null ? null : Number(r.end_ts),\n attributes: parseJson<Attrs>(r.attributes, {}),\n }),\n );\n },\n\n getEntity: async (type, id) => {\n await ready;\n const r = await db\n .selectFrom('entities')\n .select(['type', 'id', 'attributes', 'updated_at'])\n .where('connector_id', '=', connectorId)\n .where('type', '=', type)\n .where('id', '=', id)\n .limit(1)\n .executeTakeFirst();\n if (!r) {\n return null;\n }\n return {\n type: r.type,\n id: r.id,\n attributes: parseJson<Attrs>(r.attributes, {}),\n updated_at: Number(r.updated_at),\n };\n },\n\n queryEntities: async (q: EntityQuery) => {\n await ready;\n const rows = await db\n .selectFrom('entities')\n .select(['type', 'id', 'attributes', 'updated_at'])\n .where('connector_id', '=', connectorId)\n .where('type', '=', q.type)\n .execute();\n return rows.map(\n (r): Entity => ({\n type: r.type,\n id: r.id,\n attributes: parseJson<Attrs>(r.attributes, {}),\n updated_at: Number(r.updated_at),\n }),\n );\n },\n\n queryMetrics: async (q: MetricQuery) => {\n await ready;\n let qb = db\n .selectFrom('metrics')\n .select(['name', 'ts', 'value', 'attributes'])\n .where('connector_id', '=', connectorId);\n if (q.name !== undefined) {\n qb = qb.where('name', '=', q.name);\n }\n if (q.start !== undefined) {\n qb = qb.where('ts', '>=', q.start);\n }\n if (q.end !== undefined) {\n qb = qb.where('ts', '<=', q.end);\n }\n const rows = await qb.execute();\n return rows.map(\n (r): MetricSample => ({\n name: r.name,\n ts: Number(r.ts),\n value: Number(r.value),\n attributes: parseJson<Attrs>(r.attributes, {}),\n }),\n );\n },\n\n traverse: async (q: EdgeQuery) => {\n await ready;\n let qb = db\n .selectFrom('edges')\n .select([\n 'from_type',\n 'from_id',\n 'kind',\n 'to_type',\n 'to_id',\n 'attributes',\n 'updated_at',\n ])\n .where('connector_id', '=', connectorId);\n if (q.fromType !== undefined) {\n qb = qb.where('from_type', '=', q.fromType);\n }\n if (q.fromId !== undefined) {\n qb = qb.where('from_id', '=', q.fromId);\n }\n if (q.kind !== undefined) {\n qb = qb.where('kind', '=', q.kind);\n }\n if (q.toType !== undefined) {\n qb = qb.where('to_type', '=', q.toType);\n }\n if (q.toId !== undefined) {\n qb = qb.where('to_id', '=', q.toId);\n }\n const rows = await qb.execute();\n return rows.map(\n (r): Edge => ({\n from_type: r.from_type,\n from_id: r.from_id,\n kind: r.kind,\n to_type: r.to_type,\n to_id: r.to_id,\n attributes: parseJson<Attrs>(r.attributes, {}),\n updated_at: Number(r.updated_at),\n }),\n );\n },\n\n queryDistributions: async (q: DistributionQuery) => {\n await ready;\n let qb = db\n .selectFrom('distributions')\n .select(['name', 'ts', 'kind', 'data', 'attributes'])\n .where('connector_id', '=', connectorId);\n if (q.name !== undefined) {\n qb = qb.where('name', '=', q.name);\n }\n if (q.start !== undefined) {\n qb = qb.where('ts', '>=', q.start);\n }\n if (q.end !== undefined) {\n qb = qb.where('ts', '<=', q.end);\n }\n const rows = await qb.execute();\n return rows.map((r) => {\n const base = {\n name: r.name,\n ts: Number(r.ts),\n attributes: parseJson<Attrs>(r.attributes, {}),\n };\n const data = parseJson<Distribution['data']>(r.data, {\n count: 0,\n sum: 0,\n } as unknown as Distribution['data']);\n if (r.kind === 'histogram') {\n return { ...base, kind: 'histogram', data } as Distribution;\n }\n if (r.kind === 'summary') {\n return { ...base, kind: 'summary', data } as Distribution;\n }\n throw new Error(\n `Unknown distribution kind: ${r.kind} (name=${base.name})`,\n );\n });\n },\n\n deleteOlderThan: async (shape, tsUnixMs) => {\n await ready;\n if (shape === 'events') {\n const r = await db\n .deleteFrom('events')\n .where('connector_id', '=', connectorId)\n .where('start_ts', '<', tsUnixMs)\n .executeTakeFirst();\n return { rowsDeleted: Number(r.numDeletedRows) };\n }\n if (shape === 'metrics') {\n const r = await db\n .deleteFrom('metrics')\n .where('connector_id', '=', connectorId)\n .where('ts', '<', tsUnixMs)\n .executeTakeFirst();\n return { rowsDeleted: Number(r.numDeletedRows) };\n }\n if (shape === 'distributions') {\n const r = await db\n .deleteFrom('distributions')\n .where('connector_id', '=', connectorId)\n .where('ts', '<', tsUnixMs)\n .executeTakeFirst();\n return { rowsDeleted: Number(r.numDeletedRows) };\n }\n throw new Error(\n `Unsupported shape for deleteOlderThan: ${String(shape)}`,\n );\n },\n\n writeRollups: async (buckets) => {\n await ready;\n if (buckets.length === 0) {\n return;\n }\n const stmts = buckets.map((b) =>\n toBatchStmt(\n db\n .insertInto('rollups')\n .values(rollupRow(b))\n .onConflict((oc) =>\n oc\n .columns([\n 'connector_id',\n 'resource',\n 'field',\n 'granularity',\n 'dims_key',\n 'bucket_start',\n ])\n .doUpdateSet({\n dims: (eb) => eb.ref('excluded.dims'),\n partials: (eb) => eb.ref('excluded.partials'),\n }),\n )\n .compile(),\n ),\n );\n await client.batch(stmts, 'write');\n },\n\n queryRollups: async (q: RollupQuery) => {\n await ready;\n let qb = db\n .selectFrom('rollups')\n .select([\n 'resource',\n 'field',\n 'granularity',\n 'dims',\n 'bucket_start',\n 'partials',\n ])\n .where('connector_id', '=', connectorId)\n .where('resource', '=', q.resource);\n if (q.field !== undefined) {\n qb = qb.where('field', '=', q.field);\n }\n if (q.granularity !== undefined) {\n qb = qb.where('granularity', '=', q.granularity);\n }\n if (q.start !== undefined) {\n qb = qb.where('bucket_start', '>=', q.start);\n }\n if (q.end !== undefined) {\n qb = qb.where('bucket_start', '<', q.end);\n }\n const rows = await qb.execute();\n return rows.map(\n (r): RollupBucket => ({\n resource: r.resource,\n field: r.field,\n granularity: r.granularity as Granularity,\n dims: parseJson<Record<string, JSONValue>>(r.dims, {}),\n bucketStart: Number(r.bucket_start),\n partials: parseJson<RollupPartials>(r.partials, {\n count: 0,\n numericCount: 0,\n sum: 0,\n min: null,\n max: null,\n firstTs: null,\n firstValue: null,\n latestTs: null,\n latestValue: null,\n }),\n }),\n );\n },\n\n getRollupWatermark: async (resource: string) => {\n await ready;\n const r = await db\n .selectFrom('rollup_watermarks')\n .select(['watermark'])\n .where('connector_id', '=', connectorId)\n .where('resource', '=', resource)\n .limit(1)\n .executeTakeFirst();\n return r ? Number(r.watermark) : null;\n },\n\n setRollupWatermark: async (resource: string, tsUnixMs: number) => {\n await ready;\n await db\n .insertInto('rollup_watermarks')\n .values({ connector_id: connectorId, resource, watermark: tsUnixMs })\n .onConflict((oc) =>\n oc.columns(['connector_id', 'resource']).doUpdateSet({\n watermark: sql<number>`max(rollup_watermarks.watermark, excluded.watermark)`,\n }),\n )\n .execute();\n },\n };\n }\n\n async getHealth(_connectorId: string): Promise<ConnectorHealth | null> {\n const sync = await this.getSyncState();\n if (sync.status !== 'failed') {\n return null;\n }\n return {\n status: healthStatusFromSyncStatus(sync.status),\n lastSyncAt: sync.lastSyncAt,\n lastError: sync.lastError,\n syncIntervalSeconds: 0,\n };\n }\n\n async getSyncState(): Promise<SyncState> {\n if (this.initError !== null) {\n return {\n status: 'failed',\n queuedAt: null,\n startedAt: null,\n lastSyncAt: null,\n lastError: this.initError,\n };\n }\n await this.ready;\n const r = await this.db\n .selectFrom('sync_state')\n .select([\n 'status',\n 'queued_at',\n 'started_at',\n 'last_sync_at',\n 'last_error',\n ])\n .where('id', '=', SYNC_STATE_ID)\n .limit(1)\n .executeTakeFirst();\n if (!r) {\n return {\n status: 'idle',\n queuedAt: null,\n startedAt: null,\n lastSyncAt: null,\n lastError: null,\n };\n }\n return {\n status: r.status as SyncState['status'],\n queuedAt: r.queued_at,\n startedAt: r.started_at,\n lastSyncAt: r.last_sync_at,\n lastError: r.last_error,\n };\n }\n\n async getConnectorSyncState(\n connectorId: string,\n ): Promise<SyncSchedulingState> {\n if (this.initError !== null) {\n return { lastSyncAt: null, lastBackfillAt: null };\n }\n await this.ready;\n const r = await this.db\n .selectFrom('connector_sync_state')\n .select(['last_sync_at', 'last_backfill_at'])\n .where('connector_id', '=', connectorId)\n .limit(1)\n .executeTakeFirst();\n return {\n lastSyncAt: r?.last_sync_at ?? null,\n lastBackfillAt: r?.last_backfill_at ?? null,\n };\n }\n\n async markSyncQueued(): Promise<boolean> {\n await this.ready;\n const r = await this.db\n .updateTable('sync_state')\n .set({\n status: 'queued',\n queued_at: new Date().toISOString(),\n started_at: null,\n })\n .where('id', '=', SYNC_STATE_ID)\n .where('status', 'not in', ['queued', 'running'])\n .executeTakeFirst();\n return Number(r.numUpdatedRows) > 0;\n }\n\n async markSyncRunning(): Promise<boolean> {\n await this.ready;\n const r = await this.db\n .updateTable('sync_state')\n .set({ status: 'running', started_at: new Date().toISOString() })\n .where('id', '=', SYNC_STATE_ID)\n .where('status', '=', 'queued')\n .executeTakeFirst();\n return Number(r.numUpdatedRows) > 0;\n }\n\n async markSyncSucceeded(): Promise<void> {\n await this.ready;\n await this.db\n .updateTable('sync_state')\n .set({\n status: 'succeeded',\n queued_at: null,\n started_at: null,\n last_sync_at: new Date().toISOString(),\n last_error: null,\n })\n .where('id', '=', SYNC_STATE_ID)\n .execute();\n }\n\n async markConnectorSyncSucceeded(\n connectorId: string,\n options?: MarkConnectorSyncSucceededOptions,\n ): Promise<void> {\n await this.ready;\n const now = new Date().toISOString();\n await this.db\n .insertInto('connector_sync_state')\n .values({\n connector_id: connectorId,\n last_sync_at: now,\n last_backfill_at: options?.backfillDue ? now : null,\n })\n .onConflict((oc) =>\n oc.column('connector_id').doUpdateSet({\n last_sync_at: now,\n ...(options?.backfillDue ? { last_backfill_at: now } : {}),\n }),\n )\n .execute();\n }\n\n async markSyncFailed(error: string): Promise<void> {\n await this.ready;\n await this.db\n .updateTable('sync_state')\n .set({\n status: 'failed',\n queued_at: null,\n started_at: null,\n last_error: error,\n })\n .where('id', '=', SYNC_STATE_ID)\n .execute();\n }\n\n async close(): Promise<void> {\n await this.ready.catch(() => undefined);\n this.client.close();\n }\n}\n","// AUTO-GENERATED by scripts/bundle-migrations.ts — do not edit by hand.\n// Regenerate with: pnpm db:bundle (or pnpm db:generate).\n\nexport interface BundledMigration {\n tag: string;\n statements: string[];\n}\n\nexport const MIGRATIONS: readonly BundledMigration[] = [\n {\n tag: '0000_nosy_wendell_vaughn',\n statements: [\n \"CREATE TABLE `distributions` (\\n\\t`id` integer PRIMARY KEY AUTOINCREMENT NOT NULL,\\n\\t`connector_id` text NOT NULL,\\n\\t`name` text NOT NULL,\\n\\t`ts` integer NOT NULL,\\n\\t`kind` text NOT NULL,\\n\\t`data` text NOT NULL,\\n\\t`attributes` text DEFAULT '{}' NOT NULL\\n);\",\n 'CREATE INDEX `distributions_conn_name_ts` ON `distributions` (`connector_id`,`name`,`ts`);',\n \"CREATE TABLE `edges` (\\n\\t`connector_id` text NOT NULL,\\n\\t`from_type` text NOT NULL,\\n\\t`from_id` text NOT NULL,\\n\\t`kind` text NOT NULL,\\n\\t`to_type` text NOT NULL,\\n\\t`to_id` text NOT NULL,\\n\\t`attributes` text DEFAULT '{}' NOT NULL,\\n\\t`updated_at` integer NOT NULL,\\n\\tPRIMARY KEY(`connector_id`, `from_type`, `from_id`, `kind`, `to_type`, `to_id`)\\n);\",\n 'CREATE INDEX `edges_conn_kind` ON `edges` (`connector_id`,`kind`);',\n 'CREATE INDEX `edges_conn_from` ON `edges` (`connector_id`,`from_type`,`from_id`);',\n \"CREATE TABLE `entities` (\\n\\t`connector_id` text NOT NULL,\\n\\t`type` text NOT NULL,\\n\\t`id` text NOT NULL,\\n\\t`attributes` text DEFAULT '{}' NOT NULL,\\n\\t`updated_at` integer NOT NULL,\\n\\tPRIMARY KEY(`connector_id`, `type`, `id`)\\n);\",\n 'CREATE INDEX `entities_conn_type` ON `entities` (`connector_id`,`type`);',\n \"CREATE TABLE `events` (\\n\\t`id` integer PRIMARY KEY AUTOINCREMENT NOT NULL,\\n\\t`connector_id` text NOT NULL,\\n\\t`name` text NOT NULL,\\n\\t`start_ts` integer NOT NULL,\\n\\t`end_ts` integer,\\n\\t`attributes` text DEFAULT '{}' NOT NULL\\n);\",\n 'CREATE INDEX `events_conn_name_start` ON `events` (`connector_id`,`name`,`start_ts`);',\n \"CREATE TABLE `metrics` (\\n\\t`id` integer PRIMARY KEY AUTOINCREMENT NOT NULL,\\n\\t`connector_id` text NOT NULL,\\n\\t`name` text NOT NULL,\\n\\t`ts` integer NOT NULL,\\n\\t`value` real NOT NULL,\\n\\t`attributes` text DEFAULT '{}' NOT NULL\\n);\",\n 'CREATE INDEX `metrics_conn_name_ts` ON `metrics` (`connector_id`,`name`,`ts`);',\n ],\n },\n {\n tag: '0001_clumsy_siren',\n statements: [\n 'CREATE TABLE `sync_state` (\\n\\t`id` integer PRIMARY KEY NOT NULL,\\n\\t`status` text NOT NULL,\\n\\t`last_sync_at` text,\\n\\t`last_error` text\\n);',\n ],\n },\n {\n tag: '0002_milky_echo',\n statements: [\n 'ALTER TABLE `sync_state` ADD `queued_at` text;',\n 'ALTER TABLE `sync_state` ADD `started_at` text;',\n ],\n },\n {\n tag: '0003_milky_morbius',\n statements: [\n 'CREATE TABLE `rollup_watermarks` (\\n\\t`connector_id` text NOT NULL,\\n\\t`resource` text NOT NULL,\\n\\t`watermark` integer NOT NULL,\\n\\tPRIMARY KEY(`connector_id`, `resource`)\\n);',\n \"CREATE TABLE `rollups` (\\n\\t`connector_id` text NOT NULL,\\n\\t`resource` text NOT NULL,\\n\\t`field` text DEFAULT '' NOT NULL,\\n\\t`granularity` text NOT NULL,\\n\\t`dims_key` text DEFAULT '' NOT NULL,\\n\\t`dims` text DEFAULT '{}' NOT NULL,\\n\\t`bucket_start` integer NOT NULL,\\n\\t`partials` text NOT NULL,\\n\\tPRIMARY KEY(`connector_id`, `resource`, `field`, `granularity`, `dims_key`, `bucket_start`)\\n);\",\n 'CREATE INDEX `rollups_conn_resource_field` ON `rollups` (`connector_id`,`resource`,`field`);',\n ],\n },\n {\n tag: '0004_neat_swarm',\n statements: [\n 'CREATE TABLE `connector_sync_state` (\\n\\t`connector_id` text PRIMARY KEY NOT NULL,\\n\\t`last_sync_at` text,\\n\\t`last_backfill_at` text\\n);',\n ],\n },\n] as const;\n","import type { Client, InStatement } from '@libsql/client/web';\n\nimport { MIGRATIONS } from './migrations-bundle';\n\nconst SCHEMA_MIGRATIONS_TABLE = 'schema_migrations';\n\nconst LEGACY_BASELINE_TABLE = 'events';\n\nconst LEGACY_BASELINE_TAGS: ReadonlySet<string> = new Set([\n '0000_nosy_wendell_vaughn',\n '0001_clumsy_siren',\n '0002_milky_echo',\n '0003_milky_morbius',\n]);\n\nasync function tableExists(client: Client, name: string): Promise<boolean> {\n const result = await client.execute({\n sql: \"SELECT name FROM sqlite_master WHERE type = 'table' AND name = ? LIMIT 1\",\n args: [name],\n });\n return result.rows.length > 0;\n}\n\nasync function readAppliedTags(client: Client): Promise<Set<string>> {\n const result = await client.execute(\n `SELECT tag FROM ${SCHEMA_MIGRATIONS_TABLE}`,\n );\n return new Set(result.rows.map((r) => String(r['tag'])));\n}\n\nexport interface ApplyMigrationsOptions {\n assumeLegacyBaselineIfEventsExists?: boolean;\n}\n\nexport async function migrateIfNeeded(\n client: Client,\n opts: ApplyMigrationsOptions = {},\n): Promise<void> {\n const latest = MIGRATIONS[MIGRATIONS.length - 1];\n if (latest === undefined) {\n return;\n }\n try {\n const result = await client.execute({\n sql: `SELECT 1 FROM ${SCHEMA_MIGRATIONS_TABLE} WHERE tag = ? LIMIT 1`,\n args: [latest.tag],\n });\n if (result.rows.length > 0) {\n return;\n }\n } catch {\n // schema_migrations table doesn't exist yet — fall through to apply.\n }\n await applyMigrations(client, opts);\n}\n\nexport async function applyMigrations(\n client: Client,\n opts: ApplyMigrationsOptions = {},\n): Promise<void> {\n const hadSchemaTable = await tableExists(client, SCHEMA_MIGRATIONS_TABLE);\n\n await client.execute(\n `CREATE TABLE IF NOT EXISTS ${SCHEMA_MIGRATIONS_TABLE} (\n tag TEXT PRIMARY KEY,\n applied_at INTEGER NOT NULL\n )`,\n );\n\n if (!hadSchemaTable && opts.assumeLegacyBaselineIfEventsExists === true) {\n const hasLegacySchema = await tableExists(client, LEGACY_BASELINE_TABLE);\n if (hasLegacySchema) {\n const now = Date.now();\n for (const migration of MIGRATIONS) {\n if (!LEGACY_BASELINE_TAGS.has(migration.tag)) {\n continue;\n }\n await client.execute({\n sql: `INSERT OR IGNORE INTO ${SCHEMA_MIGRATIONS_TABLE} (tag, applied_at) VALUES (?, ?)`,\n args: [migration.tag, now],\n });\n }\n }\n }\n\n let applied = await readAppliedTags(client);\n\n for (const migration of MIGRATIONS) {\n if (applied.has(migration.tag)) {\n continue;\n }\n const batch: InStatement[] = [\n {\n sql: `INSERT INTO ${SCHEMA_MIGRATIONS_TABLE} (tag, applied_at) VALUES (?, ?)`,\n args: [migration.tag, Date.now()],\n },\n ...migration.statements,\n ];\n try {\n await client.batch(batch, 'write');\n } catch (err) {\n applied = await readAppliedTags(client);\n if (!applied.has(migration.tag)) {\n throw err;\n }\n }\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/libsql-storage.ts","../src/db-schema.ts","../src/migrations-bundle.ts","../src/migrate.ts"],"sourcesContent":["import type { Client, InValue } from '@libsql/client/web';\nimport type {\n ConnectorHealth,\n Distribution,\n DistributionQuery,\n Edge,\n EdgeQuery,\n Entity,\n EntityQuery,\n Event,\n EventQuery,\n GetStorageHandleOptions,\n Granularity,\n JSONValue,\n MarkConnectorSyncSucceededOptions,\n MetricQuery,\n MetricSample,\n RekeyConnectorResult,\n RollupBucket,\n RollupPartials,\n RollupQuery,\n ServerStorage,\n StorageHandle,\n SyncSchedulingState,\n SyncState,\n} from '@rawdash/core';\nimport {\n dimsKey,\n healthStatusFromSyncStatus,\n withAbortSignal,\n} from '@rawdash/core';\nimport { type CompiledQuery, type Insertable, Kysely, sql } from 'kysely';\nimport { LibsqlDialect } from 'kysely-libsql';\n\nimport type {\n Database,\n EdgesTable,\n EntitiesTable,\n EventsTable,\n MetricsTable,\n RollupsTable,\n} from './db-schema';\nimport { CONNECTOR_KEYED_TABLES } from './db-schema';\nimport { applyMigrations } from './migrate';\n\ntype Attrs = Record<string, JSONValue>;\n\nconst SYNC_STATE_ID = 1;\n\nconst MISSING_SCHEMA_PATTERN = /no such (table|column)/i;\n\nexport class SchemaNotInitializedError extends Error {\n constructor(message: string, options?: { cause?: unknown }) {\n super(message, options);\n this.name = 'SchemaNotInitializedError';\n }\n}\n\nfunction getErrorMessage(err: unknown): string {\n return err instanceof Error ? err.message : String(err);\n}\n\nfunction isMissingSchemaError(err: unknown): boolean {\n return MISSING_SCHEMA_PATTERN.test(getErrorMessage(err));\n}\n\nasync function runRead<T>(fn: () => Promise<T>): Promise<T> {\n try {\n return await fn();\n } catch (err) {\n if (isMissingSchemaError(err)) {\n throw new SchemaNotInitializedError(getErrorMessage(err), { cause: err });\n }\n throw err;\n }\n}\n\nexport async function initLibsqlSchema(client: Client): Promise<void> {\n await applyMigrations(client, { assumeLegacyBaselineIfEventsExists: true });\n await client.execute({\n sql: \"INSERT OR IGNORE INTO sync_state (id, status, queued_at, started_at, last_sync_at, last_error) VALUES (?, 'idle', NULL, NULL, NULL, NULL)\",\n args: [SYNC_STATE_ID],\n });\n}\n\nfunction parseJson<T>(value: unknown, fallback: T): T {\n if (typeof value !== 'string') {\n return fallback;\n }\n try {\n return JSON.parse(value) as T;\n } catch {\n return fallback;\n }\n}\n\nfunction createDb(client: Client): Kysely<Database> {\n return new Kysely<Database>({\n dialect: new LibsqlDialect({ client }),\n });\n}\n\nfunction toBatchStmt(q: CompiledQuery): { sql: string; args: InValue[] } {\n return { sql: q.sql, args: q.parameters as InValue[] };\n}\n\nconst DELETE_IDENTITY_CHUNK_SIZE = 200;\n\nfunction chunk<T>(items: readonly T[], size: number): T[][] {\n const chunks: T[][] = [];\n for (let i = 0; i < items.length; i += size) {\n chunks.push(items.slice(i, i + size));\n }\n return chunks;\n}\n\nfunction dedupeBy<T>(items: readonly T[], keyOf: (item: T) => string): T[] {\n const byKey = new Map<string, T>();\n for (const item of items) {\n const key = keyOf(item);\n if (!byKey.has(key)) {\n byKey.set(key, item);\n }\n }\n return [...byKey.values()];\n}\n\nexport interface LibsqlStorageOptions {\n client: Client;\n initSchema?: boolean;\n}\n\nexport class LibsqlStorage implements ServerStorage {\n private client: Client;\n private db: Kysely<Database>;\n private ready: Promise<void>;\n private initError: string | null = null;\n\n constructor(options: LibsqlStorageOptions) {\n this.client = options.client;\n this.db = createDb(options.client);\n this.ready = options.initSchema === false ? Promise.resolve() : this.init();\n }\n\n private async init(): Promise<void> {\n try {\n await initLibsqlSchema(this.client);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n this.initError = `init failed: ${message}`;\n throw err;\n }\n }\n\n async waitUntilReady(): Promise<void> {\n return this.ready;\n }\n\n getStorageHandle(\n connectorId: string,\n options?: GetStorageHandleOptions,\n ): StorageHandle {\n const handle = this.buildHandle(connectorId);\n return options?.signal ? withAbortSignal(handle, options.signal) : handle;\n }\n\n private buildHandle(connectorId: string): StorageHandle {\n const ready = this.ready;\n const db = this.db;\n const client = this.client;\n\n const eventRow = (e: Event): Insertable<EventsTable> => ({\n connector_id: connectorId,\n name: e.name,\n start_ts: e.start_ts,\n end_ts: e.end_ts,\n attributes: JSON.stringify(e.attributes),\n });\n\n const entityRow = (e: Entity): Insertable<EntitiesTable> => ({\n connector_id: connectorId,\n type: e.type,\n id: e.id,\n attributes: JSON.stringify(e.attributes),\n updated_at: e.updated_at,\n });\n\n const metricRow = (m: MetricSample): Insertable<MetricsTable> => ({\n connector_id: connectorId,\n name: m.name,\n ts: m.ts,\n value: m.value,\n attributes: JSON.stringify(m.attributes),\n });\n\n const edgeRow = (e: Edge): Insertable<EdgesTable> => ({\n connector_id: connectorId,\n from_type: e.from_type,\n from_id: e.from_id,\n kind: e.kind,\n to_type: e.to_type,\n to_id: e.to_id,\n attributes: JSON.stringify(e.attributes),\n updated_at: e.updated_at,\n });\n\n const distributionRow = (d: Distribution) => ({\n connector_id: connectorId,\n name: d.name,\n ts: d.ts,\n kind: d.kind,\n data: JSON.stringify(d.data),\n attributes: JSON.stringify(d.attributes),\n });\n\n const rollupRow = (b: RollupBucket): Insertable<RollupsTable> => ({\n connector_id: connectorId,\n resource: b.resource,\n field: b.field,\n granularity: b.granularity,\n dims_key: dimsKey(b.dims),\n dims: JSON.stringify(b.dims),\n bucket_start: b.bucketStart,\n partials: JSON.stringify(b.partials),\n });\n\n return {\n event: async (e) => {\n await ready;\n await db.insertInto('events').values(eventRow(e)).execute();\n },\n\n entity: async (e) => {\n await ready;\n await db\n .insertInto('entities')\n .values(entityRow(e))\n .onConflict((oc) =>\n oc.columns(['connector_id', 'type', 'id']).doUpdateSet({\n attributes: (eb) => eb.ref('excluded.attributes'),\n updated_at: (eb) => eb.ref('excluded.updated_at'),\n }),\n )\n .execute();\n },\n\n metric: async (m) => {\n await ready;\n await db.insertInto('metrics').values(metricRow(m)).execute();\n },\n\n edge: async (e) => {\n await ready;\n await db\n .insertInto('edges')\n .values(edgeRow(e))\n .onConflict((oc) =>\n oc\n .columns([\n 'connector_id',\n 'from_type',\n 'from_id',\n 'kind',\n 'to_type',\n 'to_id',\n ])\n .doUpdateSet({\n attributes: (eb) => eb.ref('excluded.attributes'),\n updated_at: (eb) => eb.ref('excluded.updated_at'),\n }),\n )\n .execute();\n },\n\n distribution: async (d) => {\n await ready;\n await db\n .insertInto('distributions')\n .values(distributionRow(d))\n .execute();\n },\n\n events: async (es, scope) => {\n await ready;\n const names = Array.from(\n new Set(scope?.names ?? es.map((e) => e.name)),\n );\n const stmts: { sql: string; args: InValue[] }[] = [];\n if (names.length > 0) {\n stmts.push(\n toBatchStmt(\n db\n .deleteFrom('events')\n .where('connector_id', '=', connectorId)\n .where('name', 'in', names)\n .compile(),\n ),\n );\n }\n if (es.length > 0) {\n stmts.push(\n toBatchStmt(\n db.insertInto('events').values(es.map(eventRow)).compile(),\n ),\n );\n }\n if (stmts.length > 0) {\n await client.batch(stmts, 'write');\n }\n },\n\n entities: async (es, scope) => {\n await ready;\n const types = Array.from(\n new Set(scope?.types ?? es.map((e) => e.type)),\n );\n const stmts: { sql: string; args: InValue[] }[] = [];\n if (types.length > 0) {\n stmts.push(\n toBatchStmt(\n db\n .deleteFrom('entities')\n .where('connector_id', '=', connectorId)\n .where('type', 'in', types)\n .compile(),\n ),\n );\n }\n if (es.length > 0) {\n stmts.push(\n toBatchStmt(\n db\n .insertInto('entities')\n .values(es.map(entityRow))\n .onConflict((oc) =>\n oc.columns(['connector_id', 'type', 'id']).doUpdateSet({\n attributes: (eb) => eb.ref('excluded.attributes'),\n updated_at: (eb) => eb.ref('excluded.updated_at'),\n }),\n )\n .compile(),\n ),\n );\n }\n if (stmts.length > 0) {\n await client.batch(stmts, 'write');\n }\n },\n\n metrics: async (ms, scope) => {\n await ready;\n const names = Array.from(\n new Set(scope?.names ?? ms.map((m) => m.name)),\n );\n const window = scope?.replaceWindow;\n const stmts: { sql: string; args: InValue[] }[] = [];\n if (names.length > 0) {\n let del = db\n .deleteFrom('metrics')\n .where('connector_id', '=', connectorId)\n .where('name', 'in', names);\n if (window) {\n del = del\n .where('ts', '>=', window.start)\n .where('ts', '<=', window.end);\n }\n stmts.push(toBatchStmt(del.compile()));\n }\n if (ms.length > 0) {\n stmts.push(\n toBatchStmt(\n db.insertInto('metrics').values(ms.map(metricRow)).compile(),\n ),\n );\n }\n if (stmts.length > 0) {\n await client.batch(stmts, 'write');\n }\n },\n\n edges: async (es, scope) => {\n await ready;\n const kinds = Array.from(\n new Set(scope?.kinds ?? es.map((e) => e.kind)),\n );\n const stmts: { sql: string; args: InValue[] }[] = [];\n if (kinds.length > 0) {\n stmts.push(\n toBatchStmt(\n db\n .deleteFrom('edges')\n .where('connector_id', '=', connectorId)\n .where('kind', 'in', kinds)\n .compile(),\n ),\n );\n }\n if (es.length > 0) {\n stmts.push(\n toBatchStmt(\n db\n .insertInto('edges')\n .values(es.map(edgeRow))\n .onConflict((oc) =>\n oc\n .columns([\n 'connector_id',\n 'from_type',\n 'from_id',\n 'kind',\n 'to_type',\n 'to_id',\n ])\n .doUpdateSet({\n attributes: (eb) => eb.ref('excluded.attributes'),\n updated_at: (eb) => eb.ref('excluded.updated_at'),\n }),\n )\n .compile(),\n ),\n );\n }\n if (stmts.length > 0) {\n await client.batch(stmts, 'write');\n }\n },\n\n distributions: async (ds, scope) => {\n await ready;\n const names = Array.from(\n new Set(scope?.names ?? ds.map((d) => d.name)),\n );\n const window = scope?.replaceWindow;\n const stmts: { sql: string; args: InValue[] }[] = [];\n if (names.length > 0) {\n let del = db\n .deleteFrom('distributions')\n .where('connector_id', '=', connectorId)\n .where('name', 'in', names);\n if (window) {\n del = del\n .where('ts', '>=', window.start)\n .where('ts', '<=', window.end);\n }\n stmts.push(toBatchStmt(del.compile()));\n }\n if (ds.length > 0) {\n stmts.push(\n toBatchStmt(\n db\n .insertInto('distributions')\n .values(ds.map(distributionRow))\n .compile(),\n ),\n );\n }\n if (stmts.length > 0) {\n await client.batch(stmts, 'write');\n }\n },\n\n queryEvents: async (q: EventQuery) => {\n await ready;\n let qb = db\n .selectFrom('events')\n .select(['name', 'start_ts', 'end_ts', 'attributes'])\n .where('connector_id', '=', connectorId);\n if (q.name !== undefined) {\n qb = qb.where('name', '=', q.name);\n }\n if (q.start !== undefined) {\n qb = qb.where('start_ts', '>=', q.start);\n }\n if (q.end !== undefined) {\n qb = qb.where('start_ts', '<=', q.end);\n }\n const rows = await runRead(() => qb.execute());\n return rows.map(\n (r): Event => ({\n name: r.name,\n start_ts: Number(r.start_ts),\n end_ts: r.end_ts === null ? null : Number(r.end_ts),\n attributes: parseJson<Attrs>(r.attributes, {}),\n }),\n );\n },\n\n getEntity: async (type, id) => {\n await ready;\n const r = await runRead(() =>\n db\n .selectFrom('entities')\n .select(['type', 'id', 'attributes', 'updated_at'])\n .where('connector_id', '=', connectorId)\n .where('type', '=', type)\n .where('id', '=', id)\n .limit(1)\n .executeTakeFirst(),\n );\n if (!r) {\n return null;\n }\n return {\n type: r.type,\n id: r.id,\n attributes: parseJson<Attrs>(r.attributes, {}),\n updated_at: Number(r.updated_at),\n };\n },\n\n queryEntities: async (q: EntityQuery) => {\n await ready;\n let qb = db\n .selectFrom('entities')\n .select(['type', 'id', 'attributes', 'updated_at'])\n .where('connector_id', '=', connectorId);\n if (q.type !== undefined) {\n qb = qb.where('type', '=', q.type);\n }\n const rows = await runRead(() => qb.execute());\n return rows.map(\n (r): Entity => ({\n type: r.type,\n id: r.id,\n attributes: parseJson<Attrs>(r.attributes, {}),\n updated_at: Number(r.updated_at),\n }),\n );\n },\n\n queryMetrics: async (q: MetricQuery) => {\n await ready;\n let qb = db\n .selectFrom('metrics')\n .select(['name', 'ts', 'value', 'attributes'])\n .where('connector_id', '=', connectorId);\n if (q.name !== undefined) {\n qb = qb.where('name', '=', q.name);\n }\n if (q.start !== undefined) {\n qb = qb.where('ts', '>=', q.start);\n }\n if (q.end !== undefined) {\n qb = qb.where('ts', '<=', q.end);\n }\n const rows = await runRead(() => qb.execute());\n return rows.map(\n (r): MetricSample => ({\n name: r.name,\n ts: Number(r.ts),\n value: Number(r.value),\n attributes: parseJson<Attrs>(r.attributes, {}),\n }),\n );\n },\n\n traverse: async (q: EdgeQuery) => {\n await ready;\n let qb = db\n .selectFrom('edges')\n .select([\n 'from_type',\n 'from_id',\n 'kind',\n 'to_type',\n 'to_id',\n 'attributes',\n 'updated_at',\n ])\n .where('connector_id', '=', connectorId);\n if (q.fromType !== undefined) {\n qb = qb.where('from_type', '=', q.fromType);\n }\n if (q.fromId !== undefined) {\n qb = qb.where('from_id', '=', q.fromId);\n }\n if (q.kind !== undefined) {\n qb = qb.where('kind', '=', q.kind);\n }\n if (q.toType !== undefined) {\n qb = qb.where('to_type', '=', q.toType);\n }\n if (q.toId !== undefined) {\n qb = qb.where('to_id', '=', q.toId);\n }\n const rows = await runRead(() => qb.execute());\n return rows.map(\n (r): Edge => ({\n from_type: r.from_type,\n from_id: r.from_id,\n kind: r.kind,\n to_type: r.to_type,\n to_id: r.to_id,\n attributes: parseJson<Attrs>(r.attributes, {}),\n updated_at: Number(r.updated_at),\n }),\n );\n },\n\n queryDistributions: async (q: DistributionQuery) => {\n await ready;\n let qb = db\n .selectFrom('distributions')\n .select(['name', 'ts', 'kind', 'data', 'attributes'])\n .where('connector_id', '=', connectorId);\n if (q.name !== undefined) {\n qb = qb.where('name', '=', q.name);\n }\n if (q.start !== undefined) {\n qb = qb.where('ts', '>=', q.start);\n }\n if (q.end !== undefined) {\n qb = qb.where('ts', '<=', q.end);\n }\n const rows = await runRead(() => qb.execute());\n return rows.map((r) => {\n const base = {\n name: r.name,\n ts: Number(r.ts),\n attributes: parseJson<Attrs>(r.attributes, {}),\n };\n const data = parseJson<Distribution['data']>(r.data, {\n count: 0,\n sum: 0,\n } as unknown as Distribution['data']);\n if (r.kind === 'histogram') {\n return { ...base, kind: 'histogram', data } as Distribution;\n }\n if (r.kind === 'summary') {\n return { ...base, kind: 'summary', data } as Distribution;\n }\n throw new Error(\n `Unknown distribution kind: ${r.kind} (name=${base.name})`,\n );\n });\n },\n\n deleteOlderThan: async (shape, tsUnixMs) => {\n await ready;\n if (shape === 'events') {\n const r = await db\n .deleteFrom('events')\n .where('connector_id', '=', connectorId)\n .where('start_ts', '<', tsUnixMs)\n .executeTakeFirst();\n return { rowsDeleted: Number(r.numDeletedRows) };\n }\n if (shape === 'metrics') {\n const r = await db\n .deleteFrom('metrics')\n .where('connector_id', '=', connectorId)\n .where('ts', '<', tsUnixMs)\n .executeTakeFirst();\n return { rowsDeleted: Number(r.numDeletedRows) };\n }\n if (shape === 'distributions') {\n const r = await db\n .deleteFrom('distributions')\n .where('connector_id', '=', connectorId)\n .where('ts', '<', tsUnixMs)\n .executeTakeFirst();\n return { rowsDeleted: Number(r.numDeletedRows) };\n }\n throw new Error(\n `Unsupported shape for deleteOlderThan: ${String(shape)}`,\n );\n },\n\n deleteByIdentity: async (targets) => {\n await ready;\n const stmts: { sql: string; args: InValue[] }[] = [];\n\n const events = dedupeBy(\n targets.events ?? [],\n (e) => `${e.name}\u0000${e.start_ts}\u0000${JSON.stringify(e.attributes)}`,\n );\n for (const group of chunk(events, DELETE_IDENTITY_CHUNK_SIZE)) {\n stmts.push(\n toBatchStmt(\n db\n .deleteFrom('events')\n .where('connector_id', '=', connectorId)\n .where((eb) =>\n eb.or(\n group.map((e) =>\n eb.and([\n eb('name', '=', e.name),\n eb('start_ts', '=', e.start_ts),\n eb('attributes', '=', JSON.stringify(e.attributes)),\n ]),\n ),\n ),\n )\n .compile(),\n ),\n );\n }\n\n const metrics = dedupeBy(\n targets.metrics ?? [],\n (m) => `${m.name}\u0000${m.ts}\u0000${JSON.stringify(m.attributes)}`,\n );\n for (const group of chunk(metrics, DELETE_IDENTITY_CHUNK_SIZE)) {\n stmts.push(\n toBatchStmt(\n db\n .deleteFrom('metrics')\n .where('connector_id', '=', connectorId)\n .where((eb) =>\n eb.or(\n group.map((m) =>\n eb.and([\n eb('name', '=', m.name),\n eb('ts', '=', m.ts),\n eb('attributes', '=', JSON.stringify(m.attributes)),\n ]),\n ),\n ),\n )\n .compile(),\n ),\n );\n }\n\n const distributions = dedupeBy(\n targets.distributions ?? [],\n (d) => `${d.name}\u0000${d.ts}\u0000${JSON.stringify(d.attributes)}`,\n );\n for (const group of chunk(distributions, DELETE_IDENTITY_CHUNK_SIZE)) {\n stmts.push(\n toBatchStmt(\n db\n .deleteFrom('distributions')\n .where('connector_id', '=', connectorId)\n .where((eb) =>\n eb.or(\n group.map((d) =>\n eb.and([\n eb('name', '=', d.name),\n eb('ts', '=', d.ts),\n eb('attributes', '=', JSON.stringify(d.attributes)),\n ]),\n ),\n ),\n )\n .compile(),\n ),\n );\n }\n\n const entities = dedupeBy(\n targets.entities ?? [],\n (e) => `${e.type}\u0000${e.id}`,\n );\n for (const group of chunk(entities, DELETE_IDENTITY_CHUNK_SIZE)) {\n stmts.push(\n toBatchStmt(\n db\n .deleteFrom('entities')\n .where('connector_id', '=', connectorId)\n .where((eb) =>\n eb.or(\n group.map((e) =>\n eb.and([eb('type', '=', e.type), eb('id', '=', e.id)]),\n ),\n ),\n )\n .compile(),\n ),\n );\n }\n\n if (stmts.length === 0) {\n return { rowsDeleted: 0 };\n }\n const results = await client.batch(stmts, 'write');\n const rowsDeleted = results.reduce(\n (sum, r) => sum + Number(r.rowsAffected),\n 0,\n );\n return { rowsDeleted };\n },\n\n writeRollups: async (buckets) => {\n await ready;\n if (buckets.length === 0) {\n return;\n }\n const stmts = buckets.map((b) =>\n toBatchStmt(\n db\n .insertInto('rollups')\n .values(rollupRow(b))\n .onConflict((oc) =>\n oc\n .columns([\n 'connector_id',\n 'resource',\n 'field',\n 'granularity',\n 'dims_key',\n 'bucket_start',\n ])\n .doUpdateSet({\n dims: (eb) => eb.ref('excluded.dims'),\n partials: (eb) => eb.ref('excluded.partials'),\n }),\n )\n .compile(),\n ),\n );\n await client.batch(stmts, 'write');\n },\n\n queryRollups: async (q: RollupQuery) => {\n await ready;\n let qb = db\n .selectFrom('rollups')\n .select([\n 'resource',\n 'field',\n 'granularity',\n 'dims',\n 'bucket_start',\n 'partials',\n ])\n .where('connector_id', '=', connectorId)\n .where('resource', '=', q.resource);\n if (q.field !== undefined) {\n qb = qb.where('field', '=', q.field);\n }\n if (q.granularity !== undefined) {\n qb = qb.where('granularity', '=', q.granularity);\n }\n if (q.start !== undefined) {\n qb = qb.where('bucket_start', '>=', q.start);\n }\n if (q.end !== undefined) {\n qb = qb.where('bucket_start', '<', q.end);\n }\n const rows = await runRead(() => qb.execute());\n return rows.map(\n (r): RollupBucket => ({\n resource: r.resource,\n field: r.field,\n granularity: r.granularity as Granularity,\n dims: parseJson<Record<string, JSONValue>>(r.dims, {}),\n bucketStart: Number(r.bucket_start),\n partials: parseJson<RollupPartials>(r.partials, {\n count: 0,\n numericCount: 0,\n sum: 0,\n min: null,\n max: null,\n firstTs: null,\n firstValue: null,\n latestTs: null,\n latestValue: null,\n }),\n }),\n );\n },\n\n getRollupWatermark: async (resource: string) => {\n await ready;\n const r = await runRead(() =>\n db\n .selectFrom('rollup_watermarks')\n .select(['watermark'])\n .where('connector_id', '=', connectorId)\n .where('resource', '=', resource)\n .limit(1)\n .executeTakeFirst(),\n );\n return r ? Number(r.watermark) : null;\n },\n\n setRollupWatermark: async (resource: string, tsUnixMs: number) => {\n await ready;\n await db\n .insertInto('rollup_watermarks')\n .values({ connector_id: connectorId, resource, watermark: tsUnixMs })\n .onConflict((oc) =>\n oc.columns(['connector_id', 'resource']).doUpdateSet({\n watermark: sql<number>`max(rollup_watermarks.watermark, excluded.watermark)`,\n }),\n )\n .execute();\n },\n };\n }\n\n async getHealth(_connectorId: string): Promise<ConnectorHealth | null> {\n const sync = await this.getSyncState();\n if (sync.status !== 'failed') {\n return null;\n }\n return {\n status: healthStatusFromSyncStatus(sync.status),\n lastSyncAt: sync.lastSyncAt,\n lastError: sync.lastError,\n syncIntervalSeconds: 0,\n };\n }\n\n async getSyncState(): Promise<SyncState> {\n if (this.initError !== null) {\n return {\n status: 'failed',\n queuedAt: null,\n startedAt: null,\n lastSyncAt: null,\n lastError: this.initError,\n };\n }\n await this.ready;\n const r = await this.db\n .selectFrom('sync_state')\n .select([\n 'status',\n 'queued_at',\n 'started_at',\n 'last_sync_at',\n 'last_error',\n ])\n .where('id', '=', SYNC_STATE_ID)\n .limit(1)\n .executeTakeFirst();\n if (!r) {\n return {\n status: 'idle',\n queuedAt: null,\n startedAt: null,\n lastSyncAt: null,\n lastError: null,\n };\n }\n return {\n status: r.status as SyncState['status'],\n queuedAt: r.queued_at,\n startedAt: r.started_at,\n lastSyncAt: r.last_sync_at,\n lastError: r.last_error,\n };\n }\n\n async getConnectorSyncState(\n connectorId: string,\n ): Promise<SyncSchedulingState> {\n if (this.initError !== null) {\n return { lastSyncAt: null, lastBackfillAt: null };\n }\n await this.ready;\n const r = await this.db\n .selectFrom('connector_sync_state')\n .select(['last_sync_at', 'last_backfill_at'])\n .where('connector_id', '=', connectorId)\n .limit(1)\n .executeTakeFirst();\n return {\n lastSyncAt: r?.last_sync_at ?? null,\n lastBackfillAt: r?.last_backfill_at ?? null,\n };\n }\n\n async markSyncQueued(): Promise<boolean> {\n await this.ready;\n const r = await this.db\n .updateTable('sync_state')\n .set({\n status: 'queued',\n queued_at: new Date().toISOString(),\n started_at: null,\n })\n .where('id', '=', SYNC_STATE_ID)\n .where('status', 'not in', ['queued', 'running'])\n .executeTakeFirst();\n return Number(r.numUpdatedRows) > 0;\n }\n\n async markSyncRunning(): Promise<boolean> {\n await this.ready;\n const r = await this.db\n .updateTable('sync_state')\n .set({ status: 'running', started_at: new Date().toISOString() })\n .where('id', '=', SYNC_STATE_ID)\n .where('status', '=', 'queued')\n .executeTakeFirst();\n return Number(r.numUpdatedRows) > 0;\n }\n\n async markSyncSucceeded(): Promise<void> {\n await this.ready;\n await this.db\n .updateTable('sync_state')\n .set({\n status: 'succeeded',\n queued_at: null,\n started_at: null,\n last_sync_at: new Date().toISOString(),\n last_error: null,\n })\n .where('id', '=', SYNC_STATE_ID)\n .execute();\n }\n\n async markConnectorSyncSucceeded(\n connectorId: string,\n options?: MarkConnectorSyncSucceededOptions,\n ): Promise<void> {\n await this.ready;\n const now = new Date().toISOString();\n await this.db\n .insertInto('connector_sync_state')\n .values({\n connector_id: connectorId,\n last_sync_at: now,\n last_backfill_at: options?.backfillDue ? now : null,\n })\n .onConflict((oc) =>\n oc.column('connector_id').doUpdateSet({\n last_sync_at: now,\n ...(options?.backfillDue ? { last_backfill_at: now } : {}),\n }),\n )\n .execute();\n }\n\n async markSyncFailed(error: string): Promise<void> {\n await this.ready;\n await this.db\n .updateTable('sync_state')\n .set({\n status: 'failed',\n queued_at: null,\n started_at: null,\n last_error: error,\n })\n .where('id', '=', SYNC_STATE_ID)\n .execute();\n }\n\n async rekeyConnectorId(\n fromConnectorId: string,\n toConnectorId: string,\n ): Promise<RekeyConnectorResult> {\n if (fromConnectorId === toConnectorId) {\n return { rowsAffected: 0 };\n }\n await this.ready;\n const results = await this.client.batch(\n CONNECTOR_KEYED_TABLES.map((table) => ({\n sql: `UPDATE OR IGNORE ${table} SET connector_id = ? WHERE connector_id = ?`,\n args: [toConnectorId, fromConnectorId],\n })),\n 'write',\n );\n const rowsAffected = results.reduce(\n (sum, r) => sum + Number(r.rowsAffected ?? 0),\n 0,\n );\n return { rowsAffected };\n }\n\n async close(): Promise<void> {\n await this.ready.catch(() => undefined);\n this.client.close();\n }\n}\n","import type { ColumnType, Generated } from 'kysely';\n\ntype JsonText = ColumnType<string, string, string>;\n\nexport interface EventsTable {\n id: Generated<number>;\n connector_id: string;\n name: string;\n start_ts: number;\n end_ts: number | null;\n attributes: JsonText;\n}\n\nexport interface EntitiesTable {\n connector_id: string;\n type: string;\n id: string;\n attributes: JsonText;\n updated_at: number;\n}\n\nexport interface MetricsTable {\n id: Generated<number>;\n connector_id: string;\n name: string;\n ts: number;\n value: number;\n attributes: JsonText;\n}\n\nexport interface EdgesTable {\n connector_id: string;\n from_type: string;\n from_id: string;\n kind: string;\n to_type: string;\n to_id: string;\n attributes: JsonText;\n updated_at: number;\n}\n\nexport interface DistributionsTable {\n id: Generated<number>;\n connector_id: string;\n name: string;\n ts: number;\n kind: string;\n data: JsonText;\n attributes: JsonText;\n}\n\nexport interface RollupsTable {\n connector_id: string;\n resource: string;\n field: string;\n granularity: string;\n dims_key: string;\n dims: JsonText;\n bucket_start: number;\n partials: JsonText;\n}\n\nexport interface RollupWatermarksTable {\n connector_id: string;\n resource: string;\n watermark: number;\n}\n\nexport interface SyncStateTable {\n id: number;\n status: string;\n queued_at: string | null;\n started_at: string | null;\n last_sync_at: string | null;\n last_error: string | null;\n}\n\nexport interface ConnectorSyncStateTable {\n connector_id: string;\n last_sync_at: string | null;\n last_backfill_at: string | null;\n}\n\nexport interface SchemaMigrationsTable {\n version: number;\n tag: string;\n applied_at: number;\n}\n\nexport interface Database {\n events: EventsTable;\n entities: EntitiesTable;\n metrics: MetricsTable;\n edges: EdgesTable;\n distributions: DistributionsTable;\n rollups: RollupsTable;\n rollup_watermarks: RollupWatermarksTable;\n sync_state: SyncStateTable;\n connector_sync_state: ConnectorSyncStateTable;\n schema_migrations: SchemaMigrationsTable;\n}\n\nexport type ConnectorKeyedTable = {\n [K in keyof Database]: Database[K] extends { connector_id: string }\n ? K\n : never;\n}[keyof Database];\n\nexport const CONNECTOR_KEYED_TABLES = [\n 'entities',\n 'events',\n 'metrics',\n 'edges',\n 'distributions',\n 'rollups',\n 'rollup_watermarks',\n 'connector_sync_state',\n] as const satisfies readonly ConnectorKeyedTable[];\n","// AUTO-GENERATED by scripts/bundle-migrations.ts — do not edit by hand.\n// Regenerate with: pnpm db:bundle (or pnpm db:generate).\n\nexport interface BundledMigration {\n tag: string;\n statements: string[];\n}\n\nexport const MIGRATIONS: readonly BundledMigration[] = [\n {\n tag: '0000_nosy_wendell_vaughn',\n statements: [\n \"CREATE TABLE `distributions` (\\n\\t`id` integer PRIMARY KEY AUTOINCREMENT NOT NULL,\\n\\t`connector_id` text NOT NULL,\\n\\t`name` text NOT NULL,\\n\\t`ts` integer NOT NULL,\\n\\t`kind` text NOT NULL,\\n\\t`data` text NOT NULL,\\n\\t`attributes` text DEFAULT '{}' NOT NULL\\n);\",\n 'CREATE INDEX `distributions_conn_name_ts` ON `distributions` (`connector_id`,`name`,`ts`);',\n \"CREATE TABLE `edges` (\\n\\t`connector_id` text NOT NULL,\\n\\t`from_type` text NOT NULL,\\n\\t`from_id` text NOT NULL,\\n\\t`kind` text NOT NULL,\\n\\t`to_type` text NOT NULL,\\n\\t`to_id` text NOT NULL,\\n\\t`attributes` text DEFAULT '{}' NOT NULL,\\n\\t`updated_at` integer NOT NULL,\\n\\tPRIMARY KEY(`connector_id`, `from_type`, `from_id`, `kind`, `to_type`, `to_id`)\\n);\",\n 'CREATE INDEX `edges_conn_kind` ON `edges` (`connector_id`,`kind`);',\n 'CREATE INDEX `edges_conn_from` ON `edges` (`connector_id`,`from_type`,`from_id`);',\n \"CREATE TABLE `entities` (\\n\\t`connector_id` text NOT NULL,\\n\\t`type` text NOT NULL,\\n\\t`id` text NOT NULL,\\n\\t`attributes` text DEFAULT '{}' NOT NULL,\\n\\t`updated_at` integer NOT NULL,\\n\\tPRIMARY KEY(`connector_id`, `type`, `id`)\\n);\",\n 'CREATE INDEX `entities_conn_type` ON `entities` (`connector_id`,`type`);',\n \"CREATE TABLE `events` (\\n\\t`id` integer PRIMARY KEY AUTOINCREMENT NOT NULL,\\n\\t`connector_id` text NOT NULL,\\n\\t`name` text NOT NULL,\\n\\t`start_ts` integer NOT NULL,\\n\\t`end_ts` integer,\\n\\t`attributes` text DEFAULT '{}' NOT NULL\\n);\",\n 'CREATE INDEX `events_conn_name_start` ON `events` (`connector_id`,`name`,`start_ts`);',\n \"CREATE TABLE `metrics` (\\n\\t`id` integer PRIMARY KEY AUTOINCREMENT NOT NULL,\\n\\t`connector_id` text NOT NULL,\\n\\t`name` text NOT NULL,\\n\\t`ts` integer NOT NULL,\\n\\t`value` real NOT NULL,\\n\\t`attributes` text DEFAULT '{}' NOT NULL\\n);\",\n 'CREATE INDEX `metrics_conn_name_ts` ON `metrics` (`connector_id`,`name`,`ts`);',\n ],\n },\n {\n tag: '0001_clumsy_siren',\n statements: [\n 'CREATE TABLE `sync_state` (\\n\\t`id` integer PRIMARY KEY NOT NULL,\\n\\t`status` text NOT NULL,\\n\\t`last_sync_at` text,\\n\\t`last_error` text\\n);',\n ],\n },\n {\n tag: '0002_milky_echo',\n statements: [\n 'ALTER TABLE `sync_state` ADD `queued_at` text;',\n 'ALTER TABLE `sync_state` ADD `started_at` text;',\n ],\n },\n {\n tag: '0003_milky_morbius',\n statements: [\n 'CREATE TABLE `rollup_watermarks` (\\n\\t`connector_id` text NOT NULL,\\n\\t`resource` text NOT NULL,\\n\\t`watermark` integer NOT NULL,\\n\\tPRIMARY KEY(`connector_id`, `resource`)\\n);',\n \"CREATE TABLE `rollups` (\\n\\t`connector_id` text NOT NULL,\\n\\t`resource` text NOT NULL,\\n\\t`field` text DEFAULT '' NOT NULL,\\n\\t`granularity` text NOT NULL,\\n\\t`dims_key` text DEFAULT '' NOT NULL,\\n\\t`dims` text DEFAULT '{}' NOT NULL,\\n\\t`bucket_start` integer NOT NULL,\\n\\t`partials` text NOT NULL,\\n\\tPRIMARY KEY(`connector_id`, `resource`, `field`, `granularity`, `dims_key`, `bucket_start`)\\n);\",\n 'CREATE INDEX `rollups_conn_resource_field` ON `rollups` (`connector_id`,`resource`,`field`);',\n ],\n },\n {\n tag: '0004_neat_swarm',\n statements: [\n 'CREATE TABLE `connector_sync_state` (\\n\\t`connector_id` text PRIMARY KEY NOT NULL,\\n\\t`last_sync_at` text,\\n\\t`last_backfill_at` text\\n);',\n ],\n },\n] as const;\n","import type { Client, InStatement } from '@libsql/client/web';\n\nimport { MIGRATIONS } from './migrations-bundle';\n\nconst SCHEMA_MIGRATIONS_TABLE = 'schema_migrations';\n\nconst LEGACY_BASELINE_TABLE = 'events';\n\nconst LEGACY_BASELINE_TAGS: ReadonlySet<string> = new Set([\n '0000_nosy_wendell_vaughn',\n '0001_clumsy_siren',\n '0002_milky_echo',\n '0003_milky_morbius',\n]);\n\nasync function tableExists(client: Client, name: string): Promise<boolean> {\n const result = await client.execute({\n sql: \"SELECT name FROM sqlite_master WHERE type = 'table' AND name = ? LIMIT 1\",\n args: [name],\n });\n return result.rows.length > 0;\n}\n\nasync function readAppliedTags(client: Client): Promise<Set<string>> {\n const result = await client.execute(\n `SELECT tag FROM ${SCHEMA_MIGRATIONS_TABLE}`,\n );\n return new Set(result.rows.map((r) => String(r['tag'])));\n}\n\nexport interface ApplyMigrationsOptions {\n assumeLegacyBaselineIfEventsExists?: boolean;\n}\n\nexport async function migrateIfNeeded(\n client: Client,\n opts: ApplyMigrationsOptions = {},\n): Promise<void> {\n const latest = MIGRATIONS[MIGRATIONS.length - 1];\n if (latest === undefined) {\n return;\n }\n try {\n const result = await client.execute({\n sql: `SELECT 1 FROM ${SCHEMA_MIGRATIONS_TABLE} WHERE tag = ? LIMIT 1`,\n args: [latest.tag],\n });\n if (result.rows.length > 0) {\n return;\n }\n } catch {\n // schema_migrations table doesn't exist yet — fall through to apply.\n }\n await applyMigrations(client, opts);\n}\n\nexport async function applyMigrations(\n client: Client,\n opts: ApplyMigrationsOptions = {},\n): Promise<void> {\n const hadSchemaTable = await tableExists(client, SCHEMA_MIGRATIONS_TABLE);\n\n await client.execute(\n `CREATE TABLE IF NOT EXISTS ${SCHEMA_MIGRATIONS_TABLE} (\n tag TEXT PRIMARY KEY,\n applied_at INTEGER NOT NULL\n )`,\n );\n\n if (!hadSchemaTable && opts.assumeLegacyBaselineIfEventsExists === true) {\n const hasLegacySchema = await tableExists(client, LEGACY_BASELINE_TABLE);\n if (hasLegacySchema) {\n const now = Date.now();\n for (const migration of MIGRATIONS) {\n if (!LEGACY_BASELINE_TAGS.has(migration.tag)) {\n continue;\n }\n await client.execute({\n sql: `INSERT OR IGNORE INTO ${SCHEMA_MIGRATIONS_TABLE} (tag, applied_at) VALUES (?, ?)`,\n args: [migration.tag, now],\n });\n }\n }\n }\n\n let applied = await readAppliedTags(client);\n\n for (const migration of MIGRATIONS) {\n if (applied.has(migration.tag)) {\n continue;\n }\n const batch: InStatement[] = [\n {\n sql: `INSERT INTO ${SCHEMA_MIGRATIONS_TABLE} (tag, applied_at) VALUES (?, ?)`,\n args: [migration.tag, Date.now()],\n },\n ...migration.statements,\n ];\n try {\n await client.batch(batch, 'write');\n } catch (err) {\n applied = await readAppliedTags(client);\n if (!applied.has(migration.tag)) {\n throw err;\n }\n }\n }\n}\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rawdash/adapter-libsql",
3
- "version": "0.29.0",
3
+ "version": "0.29.2",
4
4
  "description": "Rawdash libSQL/Turso storage adapter",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
@@ -25,7 +25,7 @@
25
25
  "dependencies": {
26
26
  "kysely": "^0.29.0",
27
27
  "kysely-libsql": "^0.7.0",
28
- "@rawdash/core": "0.29.0"
28
+ "@rawdash/core": "0.29.2"
29
29
  },
30
30
  "peerDependencies": {
31
31
  "@libsql/client": ">=0.14.0 <1.0.0"