@kudos-protocol/storage-sqlite 0.0.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/dist/schema.js ADDED
@@ -0,0 +1,62 @@
1
+ import { sqliteTable, text, integer, index, primaryKey } from "drizzle-orm/sqlite-core";
2
+ import { sql } from "drizzle-orm";
3
+ export const events = sqliteTable("events", {
4
+ poolId: text("pool_id").notNull(),
5
+ eventId: text("event_id").notNull(),
6
+ recipient: text("recipient").notNull(),
7
+ sender: text("sender").notNull(),
8
+ ts: text("ts").notNull(),
9
+ scopeId: text("scope_id"),
10
+ kudos: integer("kudos").notNull().default(1),
11
+ emoji: text("emoji"),
12
+ title: text("title"),
13
+ visibility: text("visibility").notNull().default("PRIVATE"),
14
+ meta: text("meta"),
15
+ insertedAt: text("inserted_at")
16
+ .notNull()
17
+ .default(sql `(datetime('now'))`),
18
+ }, (table) => [
19
+ primaryKey({ columns: [table.poolId, table.eventId] }),
20
+ index("idx_events_pool_ts_id").on(table.poolId, table.ts, table.eventId),
21
+ ]);
22
+ export const poolScopeLatest = sqliteTable("pool_scope_latest", {
23
+ poolId: text("pool_id").notNull(),
24
+ recipient: text("recipient").notNull(),
25
+ scopeId: text("scope_id").notNull(),
26
+ eventId: text("event_id").notNull(),
27
+ kudos: integer("kudos").notNull(),
28
+ ts: text("ts").notNull(),
29
+ }, (table) => [
30
+ primaryKey({ columns: [table.poolId, table.recipient, table.scopeId] }),
31
+ ]);
32
+ export const poolRecipientTotals = sqliteTable("pool_recipient_totals", {
33
+ poolId: text("pool_id").notNull(),
34
+ recipient: text("recipient").notNull(),
35
+ kudos: integer("kudos").notNull().default(0),
36
+ emojis: text("emojis").notNull().default("[]"),
37
+ }, (table) => [
38
+ primaryKey({ columns: [table.poolId, table.recipient] }),
39
+ index("idx_recipient_totals_by_kudos").on(table.poolId, table.kudos),
40
+ ]);
41
+ export const poolTotals = sqliteTable("pool_totals", {
42
+ poolId: text("pool_id").primaryKey(),
43
+ kudos: integer("kudos").notNull().default(0),
44
+ });
45
+ export const outbox = sqliteTable("outbox", {
46
+ id: integer("id").primaryKey({ autoIncrement: true }),
47
+ poolId: text("pool_id").notNull(),
48
+ eventId: text("event_id").notNull(),
49
+ payload: text("payload").notNull(),
50
+ createdAt: text("created_at")
51
+ .notNull()
52
+ .default(sql `(datetime('now'))`),
53
+ delivered: integer("delivered").notNull().default(0),
54
+ deliveredAt: text("delivered_at"),
55
+ attempts: integer("attempts").notNull().default(0),
56
+ lastError: text("last_error"),
57
+ leasedAt: text("leased_at"),
58
+ leaseId: text("lease_id"),
59
+ }, (table) => [
60
+ index("idx_outbox_pending").on(table.delivered, table.createdAt),
61
+ ]);
62
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { Event } from "@kudos-protocol/pool-core";
2
+ import type { StoragePort, AppendResult, ReadEventsOptions, ReadEventsResult, ReadSummaryResult, OutboxPort, OutboxRow } from "@kudos-protocol/ports";
3
+ export interface SqliteStorageOptions {
4
+ path: string;
5
+ migrationsPath?: string;
6
+ outbox?: boolean;
7
+ }
8
+ export declare class SqliteStorage implements StoragePort, OutboxPort {
9
+ private sqlite;
10
+ private db;
11
+ private outboxEnabled;
12
+ constructor(options: SqliteStorageOptions);
13
+ close(): void;
14
+ ping(): Promise<void>;
15
+ appendEvents(poolId: string, events: Event[]): Promise<AppendResult>;
16
+ private updateProjections;
17
+ readEvents(options: ReadEventsOptions): Promise<ReadEventsResult>;
18
+ readSummary(poolId: string, limit: number): Promise<ReadSummaryResult>;
19
+ leasePending(limit: number, maxAttempts: number, leaseId: string, leaseTtlSeconds: number): Promise<OutboxRow[]>;
20
+ markDelivered(ids: number[], leaseId: string): Promise<void>;
21
+ markFailed(ids: number[], error: string, leaseId: string): Promise<void>;
22
+ }
@@ -0,0 +1,312 @@
1
+ import Database from "better-sqlite3";
2
+ import { drizzle } from "drizzle-orm/better-sqlite3";
3
+ import { migrate } from "drizzle-orm/better-sqlite3/migrator";
4
+ import { eq, and, desc, ne, gte, lt, or, sql, inArray } from "drizzle-orm";
5
+ import { fileURLToPath } from "node:url";
6
+ import path from "node:path";
7
+ import * as schema from "./schema.js";
8
+ export class SqliteStorage {
9
+ sqlite;
10
+ db;
11
+ outboxEnabled;
12
+ constructor(options) {
13
+ this.sqlite = new Database(options.path);
14
+ this.sqlite.pragma("journal_mode = WAL");
15
+ this.db = drizzle(this.sqlite, { schema });
16
+ this.outboxEnabled = options.outbox ?? false;
17
+ const migrationsFolder = options.migrationsPath ??
18
+ path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..", "drizzle");
19
+ migrate(this.db, { migrationsFolder });
20
+ }
21
+ close() {
22
+ this.sqlite.close();
23
+ }
24
+ async ping() {
25
+ this.db.select({ poolId: schema.poolTotals.poolId }).from(schema.poolTotals).limit(1).all();
26
+ }
27
+ async appendEvents(poolId, events) {
28
+ return this.db.transaction((tx) => {
29
+ let inserted = 0;
30
+ let skipped = 0;
31
+ const accepted = [];
32
+ for (const event of events) {
33
+ const result = tx
34
+ .insert(schema.events)
35
+ .values({
36
+ poolId,
37
+ eventId: event.id,
38
+ recipient: event.recipient,
39
+ sender: event.sender,
40
+ ts: event.ts,
41
+ scopeId: event.scopeId,
42
+ kudos: event.kudos,
43
+ emoji: event.emoji,
44
+ title: event.title,
45
+ visibility: event.visibility,
46
+ meta: event.meta,
47
+ })
48
+ .onConflictDoNothing({
49
+ target: [schema.events.poolId, schema.events.eventId],
50
+ })
51
+ .run();
52
+ if (result.changes === 0) {
53
+ skipped++;
54
+ accepted.push(event);
55
+ }
56
+ else {
57
+ inserted++;
58
+ accepted.push(event);
59
+ this.updateProjections(tx, poolId, event);
60
+ if (this.outboxEnabled) {
61
+ tx.insert(schema.outbox)
62
+ .values({
63
+ poolId,
64
+ eventId: event.id,
65
+ payload: JSON.stringify(event),
66
+ })
67
+ .run();
68
+ }
69
+ }
70
+ }
71
+ return { inserted, skipped, events: accepted };
72
+ });
73
+ }
74
+ updateProjections(tx, poolId, event) {
75
+ let delta;
76
+ if (event.scopeId === null) {
77
+ // Branch A: no scopeId — always additive
78
+ delta = event.kudos;
79
+ }
80
+ else {
81
+ // Branch B: scopeId present — latest-wins
82
+ const current = tx
83
+ .select()
84
+ .from(schema.poolScopeLatest)
85
+ .where(and(eq(schema.poolScopeLatest.poolId, poolId), eq(schema.poolScopeLatest.recipient, event.recipient), eq(schema.poolScopeLatest.scopeId, event.scopeId)))
86
+ .get();
87
+ if (!current) {
88
+ // B1: no existing row — insert, delta = event.kudos
89
+ delta = event.kudos;
90
+ tx.insert(schema.poolScopeLatest)
91
+ .values({
92
+ poolId,
93
+ recipient: event.recipient,
94
+ scopeId: event.scopeId,
95
+ eventId: event.id,
96
+ kudos: event.kudos,
97
+ ts: event.ts,
98
+ })
99
+ .run();
100
+ }
101
+ else {
102
+ // Deterministic tie-break: newer ts wins, or lexicographic eventId
103
+ const isNewer = event.ts > current.ts ||
104
+ (event.ts === current.ts && event.id > current.eventId);
105
+ if (isNewer) {
106
+ // B2: new event is newer — update scope_latest, delta = new - old
107
+ delta = event.kudos - current.kudos;
108
+ tx.update(schema.poolScopeLatest)
109
+ .set({
110
+ eventId: event.id,
111
+ kudos: event.kudos,
112
+ ts: event.ts,
113
+ })
114
+ .where(and(eq(schema.poolScopeLatest.poolId, poolId), eq(schema.poolScopeLatest.recipient, event.recipient), eq(schema.poolScopeLatest.scopeId, event.scopeId)))
115
+ .run();
116
+ }
117
+ else {
118
+ // B3: old event still newest — no change
119
+ delta = 0;
120
+ }
121
+ }
122
+ }
123
+ // Apply delta to projection tables
124
+ if (delta !== 0) {
125
+ // Upsert poolRecipientTotals
126
+ tx.insert(schema.poolRecipientTotals)
127
+ .values({
128
+ poolId,
129
+ recipient: event.recipient,
130
+ kudos: delta,
131
+ emojis: "[]",
132
+ })
133
+ .onConflictDoUpdate({
134
+ target: [
135
+ schema.poolRecipientTotals.poolId,
136
+ schema.poolRecipientTotals.recipient,
137
+ ],
138
+ set: {
139
+ kudos: sql `${schema.poolRecipientTotals.kudos} + ${delta}`,
140
+ },
141
+ })
142
+ .run();
143
+ // Upsert poolTotals
144
+ tx.insert(schema.poolTotals)
145
+ .values({
146
+ poolId,
147
+ kudos: delta,
148
+ })
149
+ .onConflictDoUpdate({
150
+ target: schema.poolTotals.poolId,
151
+ set: {
152
+ kudos: sql `${schema.poolTotals.kudos} + ${delta}`,
153
+ },
154
+ })
155
+ .run();
156
+ }
157
+ // Update emojis if present
158
+ if (event.emoji !== null) {
159
+ // Ensure the recipient totals row exists
160
+ tx.insert(schema.poolRecipientTotals)
161
+ .values({
162
+ poolId,
163
+ recipient: event.recipient,
164
+ kudos: 0,
165
+ emojis: "[]",
166
+ })
167
+ .onConflictDoNothing({
168
+ target: [
169
+ schema.poolRecipientTotals.poolId,
170
+ schema.poolRecipientTotals.recipient,
171
+ ],
172
+ })
173
+ .run();
174
+ const row = tx
175
+ .select({ emojis: schema.poolRecipientTotals.emojis })
176
+ .from(schema.poolRecipientTotals)
177
+ .where(and(eq(schema.poolRecipientTotals.poolId, poolId), eq(schema.poolRecipientTotals.recipient, event.recipient)))
178
+ .get();
179
+ const emojis = JSON.parse(row?.emojis ?? "[]");
180
+ if (!emojis.includes(event.emoji)) {
181
+ emojis.push(event.emoji);
182
+ tx.update(schema.poolRecipientTotals)
183
+ .set({ emojis: JSON.stringify(emojis) })
184
+ .where(and(eq(schema.poolRecipientTotals.poolId, poolId), eq(schema.poolRecipientTotals.recipient, event.recipient)))
185
+ .run();
186
+ }
187
+ }
188
+ }
189
+ async readEvents(options) {
190
+ const conditions = [eq(schema.events.poolId, options.poolId)];
191
+ if (!options.includeTombstones) {
192
+ conditions.push(ne(schema.events.kudos, 0));
193
+ }
194
+ if (options.since) {
195
+ conditions.push(gte(schema.events.ts, options.since));
196
+ }
197
+ if (options.until) {
198
+ conditions.push(lt(schema.events.ts, options.until));
199
+ }
200
+ if (options.cursor) {
201
+ conditions.push(or(lt(schema.events.ts, options.cursor.ts), and(eq(schema.events.ts, options.cursor.ts), lt(schema.events.eventId, options.cursor.id))));
202
+ }
203
+ const rows = this.db
204
+ .select()
205
+ .from(schema.events)
206
+ .where(and(...conditions))
207
+ .orderBy(desc(schema.events.ts), desc(schema.events.eventId))
208
+ .limit(options.limit + 1)
209
+ .all();
210
+ const hasMore = rows.length > options.limit;
211
+ const page = hasMore ? rows.slice(0, options.limit) : rows;
212
+ const mappedEvents = page.map(rowToEvent);
213
+ let nextCursor = null;
214
+ if (hasMore && mappedEvents.length > 0) {
215
+ const last = mappedEvents[mappedEvents.length - 1];
216
+ nextCursor = { ts: last.ts, id: last.id };
217
+ }
218
+ return { events: mappedEvents, nextCursor, hasMore };
219
+ }
220
+ async readSummary(poolId, limit) {
221
+ const totalsRow = this.db
222
+ .select({ kudos: schema.poolTotals.kudos })
223
+ .from(schema.poolTotals)
224
+ .where(eq(schema.poolTotals.poolId, poolId))
225
+ .get();
226
+ const totalKudos = totalsRow?.kudos ?? 0;
227
+ const rows = this.db
228
+ .select()
229
+ .from(schema.poolRecipientTotals)
230
+ .where(eq(schema.poolRecipientTotals.poolId, poolId))
231
+ .orderBy(desc(schema.poolRecipientTotals.kudos))
232
+ .limit(limit)
233
+ .all();
234
+ const summary = rows.map((row) => ({
235
+ recipient: row.recipient,
236
+ kudos: row.kudos,
237
+ emojis: JSON.parse(row.emojis),
238
+ percent: 0,
239
+ }));
240
+ return { totalKudos, summary };
241
+ }
242
+ // ─── OutboxPort Implementation ──────────────────────────────────────────
243
+ async leasePending(limit, maxAttempts, leaseId, leaseTtlSeconds) {
244
+ return this.db.transaction((tx) => {
245
+ const rows = tx
246
+ .select({
247
+ id: schema.outbox.id,
248
+ poolId: schema.outbox.poolId,
249
+ eventId: schema.outbox.eventId,
250
+ payload: schema.outbox.payload,
251
+ createdAt: schema.outbox.createdAt,
252
+ attempts: schema.outbox.attempts,
253
+ lastError: schema.outbox.lastError,
254
+ })
255
+ .from(schema.outbox)
256
+ .where(and(eq(schema.outbox.delivered, 0), lt(schema.outbox.attempts, maxAttempts), or(sql `${schema.outbox.leasedAt} IS NULL`, sql `${schema.outbox.leasedAt} <= datetime('now', '-${sql.raw(String(leaseTtlSeconds))} seconds')`)))
257
+ .orderBy(schema.outbox.createdAt)
258
+ .limit(limit)
259
+ .all();
260
+ if (rows.length === 0)
261
+ return [];
262
+ const ids = rows.map((r) => r.id);
263
+ tx.update(schema.outbox)
264
+ .set({
265
+ leaseId,
266
+ leasedAt: sql `datetime('now')`,
267
+ })
268
+ .where(inArray(schema.outbox.id, ids))
269
+ .run();
270
+ return rows;
271
+ });
272
+ }
273
+ async markDelivered(ids, leaseId) {
274
+ if (ids.length === 0)
275
+ return;
276
+ this.db
277
+ .update(schema.outbox)
278
+ .set({
279
+ delivered: 1,
280
+ deliveredAt: sql `datetime('now')`,
281
+ })
282
+ .where(and(inArray(schema.outbox.id, ids), eq(schema.outbox.leaseId, leaseId)))
283
+ .run();
284
+ }
285
+ async markFailed(ids, error, leaseId) {
286
+ if (ids.length === 0)
287
+ return;
288
+ this.db
289
+ .update(schema.outbox)
290
+ .set({
291
+ attempts: sql `${schema.outbox.attempts} + 1`,
292
+ lastError: error,
293
+ })
294
+ .where(and(inArray(schema.outbox.id, ids), eq(schema.outbox.leaseId, leaseId)))
295
+ .run();
296
+ }
297
+ }
298
+ function rowToEvent(row) {
299
+ return {
300
+ id: row.eventId,
301
+ recipient: row.recipient,
302
+ sender: row.sender,
303
+ ts: row.ts,
304
+ scopeId: row.scopeId ?? null,
305
+ kudos: row.kudos,
306
+ emoji: row.emoji ?? null,
307
+ title: row.title ?? null,
308
+ visibility: row.visibility,
309
+ meta: row.meta ?? null,
310
+ };
311
+ }
312
+ //# sourceMappingURL=sqlite-storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite-storage.js","sourceRoot":"","sources":["../src/sqlite-storage.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,OAAO,EAA8B,MAAM,4BAA4B,CAAC;AACjF,OAAO,EAAE,OAAO,EAAE,MAAM,qCAAqC,CAAC;AAC9D,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAW7B,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AAQtC,MAAM,OAAO,aAAa;IAChB,MAAM,CAAoB;IAC1B,EAAE,CAAuC;IACzC,aAAa,CAAU;IAE/B,YAAY,OAA6B;QACvC,IAAI,CAAC,MAAM,GAAG,IAAI,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;QACzC,IAAI,CAAC,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QAC3C,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,MAAM,IAAI,KAAK,CAAC;QAE7C,MAAM,gBAAgB,GACpB,OAAO,CAAC,cAAc;YACtB,IAAI,CAAC,OAAO,CACV,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAC5C,IAAI,EACJ,SAAS,CACV,CAAC;QACJ,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,gBAAgB,EAAE,CAAC,CAAC;IACzC,CAAC;IAED,KAAK;QACH,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IAC9F,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,MAAc,EAAE,MAAe;QAChD,OAAO,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE;YAChC,IAAI,QAAQ,GAAG,CAAC,CAAC;YACjB,IAAI,OAAO,GAAG,CAAC,CAAC;YAChB,MAAM,QAAQ,GAAY,EAAE,CAAC;YAE7B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBAC3B,MAAM,MAAM,GAAG,EAAE;qBACd,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;qBACrB,MAAM,CAAC;oBACN,MAAM;oBACN,OAAO,EAAE,KAAK,CAAC,EAAE;oBACjB,SAAS,EAAE,KAAK,CAAC,SAAS;oBAC1B,MAAM,EAAE,KAAK,CAAC,MAAM;oBACpB,EAAE,EAAE,KAAK,CAAC,EAAE;oBACZ,OAAO,EAAE,KAAK,CAAC,OAAO;oBACtB,KAAK,EAAE,KAAK,CAAC,KAAK;oBAClB,KAAK,EAAE,KAAK,CAAC,KAAK;oBAClB,KAAK,EAAE,KAAK,CAAC,KAAK;oBAClB,UAAU,EAAE,KAAK,CAAC,UAAU;oBAC5B,IAAI,EAAE,KAAK,CAAC,IAAI;iBACjB,CAAC;qBACD,mBAAmB,CAAC;oBACnB,MAAM,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC;iBACtD,CAAC;qBACD,GAAG,EAAE,CAAC;gBAET,IAAI,MAAM,CAAC,OAAO,KAAK,CAAC,EAAE,CAAC;oBACzB,OAAO,EAAE,CAAC;oBACV,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACvB,CAAC;qBAAM,CAAC;oBACN,QAAQ,EAAE,CAAC;oBACX,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBACrB,IAAI,CAAC,iBAAiB,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;oBAE1C,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;wBACvB,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;6BACrB,MAAM,CAAC;4BACN,MAAM;4BACN,OAAO,EAAE,KAAK,CAAC,EAAE;4BACjB,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;yBAC/B,CAAC;6BACD,GAAG,EAAE,CAAC;oBACX,CAAC;gBACH,CAAC;YACH,CAAC;YAED,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;QACjD,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,iBAAiB,CACvB,EAAqF,EACrF,MAAc,EACd,KAAY;QAEZ,IAAI,KAAa,CAAC;QAElB,IAAI,KAAK,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;YAC3B,yCAAyC;YACzC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;QACtB,CAAC;aAAM,CAAC;YACN,0CAA0C;YAC1C,MAAM,OAAO,GAAG,EAAE;iBACf,MAAM,EAAE;iBACR,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC;iBAC5B,KAAK,CACJ,GAAG,CACD,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,EACzC,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,EACrD,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,CAClD,CACF;iBACA,GAAG,EAAE,CAAC;YAET,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,oDAAoD;gBACpD,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;gBACpB,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC;qBAC9B,MAAM,CAAC;oBACN,MAAM;oBACN,SAAS,EAAE,KAAK,CAAC,SAAS;oBAC1B,OAAO,EAAE,KAAK,CAAC,OAAO;oBACtB,OAAO,EAAE,KAAK,CAAC,EAAE;oBACjB,KAAK,EAAE,KAAK,CAAC,KAAK;oBAClB,EAAE,EAAE,KAAK,CAAC,EAAE;iBACb,CAAC;qBACD,GAAG,EAAE,CAAC;YACX,CAAC;iBAAM,CAAC;gBACN,mEAAmE;gBACnE,MAAM,OAAO,GACX,KAAK,CAAC,EAAE,GAAG,OAAO,CAAC,EAAE;oBACrB,CAAC,KAAK,CAAC,EAAE,KAAK,OAAO,CAAC,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;gBAE1D,IAAI,OAAO,EAAE,CAAC;oBACZ,kEAAkE;oBAClE,KAAK,GAAG,KAAK,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;oBACpC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC;yBAC9B,GAAG,CAAC;wBACH,OAAO,EAAE,KAAK,CAAC,EAAE;wBACjB,KAAK,EAAE,KAAK,CAAC,KAAK;wBAClB,EAAE,EAAE,KAAK,CAAC,EAAE;qBACb,CAAC;yBACD,KAAK,CACJ,GAAG,CACD,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,EACzC,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,EACrD,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,CAClD,CACF;yBACA,GAAG,EAAE,CAAC;gBACX,CAAC;qBAAM,CAAC;oBACN,yCAAyC;oBACzC,KAAK,GAAG,CAAC,CAAC;gBACZ,CAAC;YACH,CAAC;QACH,CAAC;QAED,mCAAmC;QACnC,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;YAChB,6BAA6B;YAC7B,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC;iBAClC,MAAM,CAAC;gBACN,MAAM;gBACN,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,KAAK,EAAE,KAAK;gBACZ,MAAM,EAAE,IAAI;aACb,CAAC;iBACD,kBAAkB,CAAC;gBAClB,MAAM,EAAE;oBACN,MAAM,CAAC,mBAAmB,CAAC,MAAM;oBACjC,MAAM,CAAC,mBAAmB,CAAC,SAAS;iBACrC;gBACD,GAAG,EAAE;oBACH,KAAK,EAAE,GAAG,CAAA,GAAG,MAAM,CAAC,mBAAmB,CAAC,KAAK,MAAM,KAAK,EAAE;iBAC3D;aACF,CAAC;iBACD,GAAG,EAAE,CAAC;YAET,oBAAoB;YACpB,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC;iBACzB,MAAM,CAAC;gBACN,MAAM;gBACN,KAAK,EAAE,KAAK;aACb,CAAC;iBACD,kBAAkB,CAAC;gBAClB,MAAM,EAAE,MAAM,CAAC,UAAU,CAAC,MAAM;gBAChC,GAAG,EAAE;oBACH,KAAK,EAAE,GAAG,CAAA,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,MAAM,KAAK,EAAE;iBAClD;aACF,CAAC;iBACD,GAAG,EAAE,CAAC;QACX,CAAC;QAED,2BAA2B;QAC3B,IAAI,KAAK,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;YACzB,yCAAyC;YACzC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC;iBAClC,MAAM,CAAC;gBACN,MAAM;gBACN,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,KAAK,EAAE,CAAC;gBACR,MAAM,EAAE,IAAI;aACb,CAAC;iBACD,mBAAmB,CAAC;gBACnB,MAAM,EAAE;oBACN,MAAM,CAAC,mBAAmB,CAAC,MAAM;oBACjC,MAAM,CAAC,mBAAmB,CAAC,SAAS;iBACrC;aACF,CAAC;iBACD,GAAG,EAAE,CAAC;YAET,MAAM,GAAG,GAAG,EAAE;iBACX,MAAM,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,mBAAmB,CAAC,MAAM,EAAE,CAAC;iBACrD,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC;iBAChC,KAAK,CACJ,GAAG,CACD,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,EAC7C,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,CAC1D,CACF;iBACA,GAAG,EAAE,CAAC;YAET,MAAM,MAAM,GAAa,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,IAAI,IAAI,CAAC,CAAC;YACzD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;gBAClC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBACzB,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC;qBAClC,GAAG,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;qBACvC,KAAK,CACJ,GAAG,CACD,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,EAC7C,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,CAC1D,CACF;qBACA,GAAG,EAAE,CAAC;YACX,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,OAA0B;QACzC,MAAM,UAAU,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;QAE9D,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,CAAC;YAC/B,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9C,CAAC;QAED,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAClB,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;QACxD,CAAC;QAED,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAClB,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;QACvD,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,UAAU,CAAC,IAAI,CACb,EAAE,CACA,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,EACvC,GAAG,CACD,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,EACvC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAC7C,CACD,CACH,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE;aACjB,MAAM,EAAE;aACR,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;aACnB,KAAK,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC;aACzB,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;aAC5D,KAAK,CAAC,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC;aACxB,GAAG,EAAE,CAAC;QAET,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;QAC5C,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC3D,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAE1C,IAAI,UAAU,GAAyB,IAAI,CAAC;QAC5C,IAAI,OAAO,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvC,MAAM,IAAI,GAAG,YAAY,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACnD,UAAU,GAAG,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;QAC5C,CAAC;QAED,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;IACvD,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,MAAc,EAAE,KAAa;QAC7C,MAAM,SAAS,GAAG,IAAI,CAAC,EAAE;aACtB,MAAM,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;aAC1C,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC;aACvB,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;aAC3C,GAAG,EAAE,CAAC;QAET,MAAM,UAAU,GAAG,SAAS,EAAE,KAAK,IAAI,CAAC,CAAC;QAEzC,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE;aACjB,MAAM,EAAE;aACR,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC;aAChC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;aACpD,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;aAC/C,KAAK,CAAC,KAAK,CAAC;aACZ,GAAG,EAAE,CAAC;QAET,MAAM,OAAO,GAAuB,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACrD,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC;YAC9B,OAAO,EAAE,CAAC;SACX,CAAC,CAAC,CAAC;QAEJ,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;IACjC,CAAC;IAED,2EAA2E;IAE3E,KAAK,CAAC,YAAY,CAChB,KAAa,EACb,WAAmB,EACnB,OAAe,EACf,eAAuB;QAEvB,OAAO,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE;YAChC,MAAM,IAAI,GAAG,EAAE;iBACZ,MAAM,CAAC;gBACN,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE;gBACpB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM;gBAC5B,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO;gBAC9B,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO;gBAC9B,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS;gBAClC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ;gBAChC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS;aACnC,CAAC;iBACD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;iBACnB,KAAK,CACJ,GAAG,CACD,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,EAC9B,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,EACvC,EAAE,CACA,GAAG,CAAA,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,UAAU,EACtC,GAAG,CAAA,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,yBAAyB,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,YAAY,CAClG,CACF,CACF;iBACA,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC;iBAChC,KAAK,CAAC,KAAK,CAAC;iBACZ,GAAG,EAAE,CAAC;YAET,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,EAAE,CAAC;YAEjC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAClC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;iBACrB,GAAG,CAAC;gBACH,OAAO;gBACP,QAAQ,EAAE,GAAG,CAAA,iBAAiB;aAC/B,CAAC;iBACD,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;iBACrC,GAAG,EAAE,CAAC;YAET,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,GAAa,EAAE,OAAe;QAChD,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAC7B,IAAI,CAAC,EAAE;aACJ,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;aACrB,GAAG,CAAC;YACH,SAAS,EAAE,CAAC;YACZ,WAAW,EAAE,GAAG,CAAA,iBAAiB;SAClC,CAAC;aACD,KAAK,CACJ,GAAG,CACD,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,EAC9B,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CACnC,CACF;aACA,GAAG,EAAE,CAAC;IACX,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,GAAa,EAAE,KAAa,EAAE,OAAe;QAC5D,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAC7B,IAAI,CAAC,EAAE;aACJ,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;aACrB,GAAG,CAAC;YACH,QAAQ,EAAE,GAAG,CAAA,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,MAAM;YAC5C,SAAS,EAAE,KAAK;SACjB,CAAC;aACD,KAAK,CACJ,GAAG,CACD,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,EAC9B,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CACnC,CACF;aACA,GAAG,EAAE,CAAC;IACX,CAAC;CACF;AAED,SAAS,UAAU,CAAC,GAAsC;IACxD,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,OAAO;QACf,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,IAAI;QAC5B,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,IAAI;QACxB,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,IAAI;QACxB,UAAU,EAAE,GAAG,CAAC,UAAiC;QACjD,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,IAAI;KACvB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,53 @@
1
+ CREATE TABLE `events` (
2
+ `pool_id` text NOT NULL,
3
+ `event_id` text NOT NULL,
4
+ `recipient` text NOT NULL,
5
+ `sender` text NOT NULL,
6
+ `ts` text NOT NULL,
7
+ `scope_id` text,
8
+ `kudos` integer DEFAULT 1 NOT NULL,
9
+ `emoji` text,
10
+ `title` text,
11
+ `visibility` text DEFAULT 'PRIVATE' NOT NULL,
12
+ `meta` text,
13
+ `inserted_at` text DEFAULT (datetime('now')) NOT NULL,
14
+ PRIMARY KEY(`pool_id`, `event_id`)
15
+ );
16
+ --> statement-breakpoint
17
+ CREATE INDEX `idx_events_pool_ts_id` ON `events` (`pool_id`,`ts`,`event_id`);--> statement-breakpoint
18
+ CREATE TABLE `outbox` (
19
+ `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL,
20
+ `pool_id` text NOT NULL,
21
+ `event_id` text NOT NULL,
22
+ `payload` text NOT NULL,
23
+ `created_at` text DEFAULT (datetime('now')) NOT NULL,
24
+ `delivered` integer DEFAULT 0 NOT NULL,
25
+ `delivered_at` text,
26
+ `attempts` integer DEFAULT 0 NOT NULL,
27
+ `last_error` text
28
+ );
29
+ --> statement-breakpoint
30
+ CREATE INDEX `idx_outbox_pending` ON `outbox` (`delivered`,`created_at`);--> statement-breakpoint
31
+ CREATE TABLE `pool_recipient_totals` (
32
+ `pool_id` text NOT NULL,
33
+ `recipient` text NOT NULL,
34
+ `kudos` integer DEFAULT 0 NOT NULL,
35
+ `emojis` text DEFAULT '[]' NOT NULL,
36
+ PRIMARY KEY(`pool_id`, `recipient`)
37
+ );
38
+ --> statement-breakpoint
39
+ CREATE INDEX `idx_recipient_totals_by_kudos` ON `pool_recipient_totals` (`pool_id`,`kudos`);--> statement-breakpoint
40
+ CREATE TABLE `pool_scope_latest` (
41
+ `pool_id` text NOT NULL,
42
+ `recipient` text NOT NULL,
43
+ `scope_id` text NOT NULL,
44
+ `event_id` text NOT NULL,
45
+ `kudos` integer NOT NULL,
46
+ `ts` text NOT NULL,
47
+ PRIMARY KEY(`pool_id`, `recipient`, `scope_id`)
48
+ );
49
+ --> statement-breakpoint
50
+ CREATE TABLE `pool_totals` (
51
+ `pool_id` text PRIMARY KEY NOT NULL,
52
+ `kudos` integer DEFAULT 0 NOT NULL
53
+ );
@@ -0,0 +1,2 @@
1
+ ALTER TABLE `outbox` ADD `leased_at` text;--> statement-breakpoint
2
+ ALTER TABLE `outbox` ADD `lease_id` text;