@vibes.diy/api-svc 9.2.0 → 9.2.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.
@@ -0,0 +1,135 @@
1
+ import { and, eq, sql } from "drizzle-orm";
2
+ import { isRetryableConflict } from "./seq-allocation.js";
3
+ import { audienceChannelsOf, inheritChannelOf } from "./audience-channels.js";
4
+ const FEED_TABLE = sql.raw(`"SyncFeed"`);
5
+ function partitionLockKey(ownerHandle, appSlug, dbName) {
6
+ return JSON.stringify(["syncfeed", ownerHandle, appSlug, dbName]);
7
+ }
8
+ function buildAppendInsert(p) {
9
+ return sql `
10
+ INSERT INTO ${FEED_TABLE} ("userSlug","appSlug","dbName","syncSeq","kind","docId","seq","channel","created")
11
+ SELECT ${p.ownerHandle}, ${p.appSlug}, ${p.dbName},
12
+ COALESCE(MAX("syncSeq"),0)+1, ${p.kind}, ${p.docId}, ${p.seq ?? 0}, ${p.channel ?? ""}, ${p.created}
13
+ FROM ${FEED_TABLE}
14
+ WHERE "userSlug"=${p.ownerHandle} AND "appSlug"=${p.appSlug} AND "dbName"=${p.dbName}
15
+ RETURNING "syncSeq"
16
+ `;
17
+ }
18
+ function runReturning(db, flavour, stmt) {
19
+ if (flavour === "pg") {
20
+ return db.execute(stmt);
21
+ }
22
+ return db.run(stmt);
23
+ }
24
+ function extractSyncSeq(result) {
25
+ const rows = result?.rows ?? result;
26
+ const raw = Array.isArray(rows) ? rows[0]?.syncSeq : rows?.syncSeq;
27
+ const n = Number(raw);
28
+ if (!Number.isFinite(n)) {
29
+ throw new Error(`could not extract returned syncSeq from result: ${JSON.stringify(result)}`);
30
+ }
31
+ return n;
32
+ }
33
+ function asTxRunner(db) {
34
+ return db;
35
+ }
36
+ export async function appendFeedEntry(p) {
37
+ if (p.flavour === "pg") {
38
+ const key = partitionLockKey(p.ownerHandle, p.appSlug, p.dbName);
39
+ return asTxRunner(p.db).transaction(async (tx) => {
40
+ await tx.execute(sql `SELECT pg_advisory_xact_lock(hashtextextended(${key}, 0))`);
41
+ return extractSyncSeq(await runReturning(tx, "pg", buildAppendInsert(p)));
42
+ });
43
+ }
44
+ const attempts = p.maxAttempts ?? 3;
45
+ for (let i = 0; i < attempts; i++) {
46
+ try {
47
+ return extractSyncSeq(await runReturning(p.db, p.flavour, buildAppendInsert(p)));
48
+ }
49
+ catch (err) {
50
+ if (!isRetryableConflict(err))
51
+ throw err;
52
+ await new Promise((r) => setTimeout(r, Math.floor(Math.random() * (8 << i))));
53
+ }
54
+ }
55
+ return extractSyncSeq(await runReturning(p.db, p.flavour, buildAppendInsert(p)));
56
+ }
57
+ export function channelSetOfDescriptor(descriptor) {
58
+ if (!descriptor)
59
+ return [];
60
+ return [
61
+ ...(Array.isArray(descriptor.channels) ? descriptor.channels : []),
62
+ ...audienceChannelsOf(descriptor),
63
+ ...inheritChannelOf(descriptor),
64
+ ];
65
+ }
66
+ export async function loadDocChannels(vctx, part) {
67
+ const tO = vctx.sql.tables.accessFnOutputs;
68
+ const row = await vctx.sql.db
69
+ .select({ output: tO.output })
70
+ .from(tO)
71
+ .where(and(eq(tO.ownerHandle, part.ownerHandle), eq(tO.appSlug, part.appSlug), eq(tO.dbName, part.dbName), eq(tO.docId, part.docId)))
72
+ .limit(1)
73
+ .then((r) => r[0]);
74
+ if (!row?.output)
75
+ return [];
76
+ try {
77
+ return channelSetOfDescriptor(JSON.parse(row.output));
78
+ }
79
+ catch {
80
+ return [];
81
+ }
82
+ }
83
+ export async function emitChannelChangeFeed(p) {
84
+ const oldSet = new Set(p.oldChannels);
85
+ const newSet = new Set(p.newChannels);
86
+ const channelsChanged = oldSet.size !== newSet.size || [...newSet].some((c) => !oldSet.has(c)) || [...oldSet].some((c) => !newSet.has(c));
87
+ for (const ch of oldSet) {
88
+ if (!newSet.has(ch)) {
89
+ await appendFeedEntry({
90
+ db: p.db,
91
+ flavour: p.flavour,
92
+ ownerHandle: p.ownerHandle,
93
+ appSlug: p.appSlug,
94
+ dbName: p.dbName,
95
+ kind: "evict",
96
+ docId: p.docId,
97
+ channel: ch,
98
+ created: p.created,
99
+ });
100
+ }
101
+ }
102
+ if (p.alwaysPut || channelsChanged) {
103
+ return appendFeedEntry({
104
+ db: p.db,
105
+ flavour: p.flavour,
106
+ ownerHandle: p.ownerHandle,
107
+ appSlug: p.appSlug,
108
+ dbName: p.dbName,
109
+ kind: "put",
110
+ docId: p.docId,
111
+ seq: p.seq,
112
+ created: p.created,
113
+ });
114
+ }
115
+ return undefined;
116
+ }
117
+ export async function bestEffortChannelChange(p) {
118
+ try {
119
+ return await emitChannelChangeFeed(p);
120
+ }
121
+ catch (err) {
122
+ console.warn(`sync feed append (put/evict) failed for ${p.ownerHandle}/${p.appSlug}/${p.dbName}/${p.docId}:`, err);
123
+ return undefined;
124
+ }
125
+ }
126
+ export async function bestEffortAppendDelete(p) {
127
+ try {
128
+ return await appendFeedEntry({ ...p, kind: "delete" });
129
+ }
130
+ catch (err) {
131
+ console.warn(`sync feed append (delete) failed for ${p.ownerHandle}/${p.appSlug}/${p.dbName}/${p.docId}:`, err);
132
+ return undefined;
133
+ }
134
+ }
135
+ //# sourceMappingURL=sync-feed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-feed.js","sourceRoot":"","sources":["../../jsr/public/sync-feed.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { SyncEntry } from "@vibes.diy/api-types";
2
+ export interface SyncFeedRow {
3
+ readonly syncSeq: number;
4
+ readonly kind: "put" | "delete" | "evict";
5
+ readonly docId: string;
6
+ readonly seq: number;
7
+ readonly channel: string;
8
+ }
9
+ export interface LiveHeadDoc {
10
+ readonly docId: string;
11
+ readonly seq: number;
12
+ readonly doc: Record<string, unknown> & {
13
+ _id: string;
14
+ };
15
+ readonly channels: readonly string[];
16
+ }
17
+ export interface ComputeSyncPullArgs {
18
+ readonly feed: readonly SyncFeedRow[];
19
+ readonly cursors: Readonly<Record<string, number>>;
20
+ readonly grantedChannels: readonly string[];
21
+ readonly liveDocs: readonly LiveHeadDoc[];
22
+ readonly adminOverride?: boolean;
23
+ }
24
+ export interface ComputeSyncPullResult {
25
+ readonly mode: "incremental" | "snapshot";
26
+ readonly entries: SyncEntry[];
27
+ readonly cursors: Record<string, number>;
28
+ readonly grantedChannels: string[];
29
+ }
30
+ export declare function computeSyncPull(args: ComputeSyncPullArgs): ComputeSyncPullResult;
@@ -0,0 +1,84 @@
1
+ function intersects(docChannels, grantedSet) {
2
+ for (const ch of docChannels) {
3
+ if (grantedSet.has(ch))
4
+ return true;
5
+ }
6
+ return false;
7
+ }
8
+ export function computeSyncPull(args) {
9
+ const { feed, cursors, grantedChannels, liveDocs, adminOverride = false } = args;
10
+ const grantedSet = new Set(grantedChannels);
11
+ const cursorOf = (channel) => cursors[channel] ?? 0;
12
+ const hasCursor = (channel) => Object.hasOwn(cursors, channel);
13
+ let maxSyncSeq = 0;
14
+ for (const row of feed)
15
+ if (row.syncSeq > maxSyncSeq)
16
+ maxSyncSeq = row.syncSeq;
17
+ const docCount = liveDocs.length;
18
+ const nextCursors = {};
19
+ for (const ch of grantedChannels)
20
+ nextCursors[ch] = Math.max(cursorOf(ch), maxSyncSeq);
21
+ const buildSnapshot = () => {
22
+ const snapshot = [];
23
+ for (const d of liveDocs) {
24
+ if (!adminOverride && !intersects(d.channels, grantedSet))
25
+ continue;
26
+ snapshot.push({ kind: "put", docId: d.docId, syncSeq: maxSyncSeq, seq: d.seq, doc: d.doc });
27
+ }
28
+ snapshot.sort((a, b) => (a.docId < b.docId ? -1 : a.docId > b.docId ? 1 : 0));
29
+ return snapshot;
30
+ };
31
+ if (adminOverride && docCount > 0) {
32
+ return { mode: "snapshot", entries: buildSnapshot(), cursors: nextCursors, grantedChannels: [...grantedChannels] };
33
+ }
34
+ const cold = grantedChannels.some((ch) => !hasCursor(ch));
35
+ if (docCount > 0 && cold) {
36
+ return { mode: "snapshot", entries: buildSnapshot(), cursors: nextCursors, grantedChannels: [...grantedChannels] };
37
+ }
38
+ const latestPut = new Map();
39
+ const latestDelete = new Map();
40
+ const evicts = [];
41
+ for (const row of feed) {
42
+ if (row.kind === "put") {
43
+ latestPut.set(row.docId, Math.max(latestPut.get(row.docId) ?? 0, row.syncSeq));
44
+ }
45
+ else if (row.kind === "delete") {
46
+ const prev = latestDelete.get(row.docId);
47
+ if (prev === undefined || row.syncSeq > prev.syncSeq)
48
+ latestDelete.set(row.docId, { syncSeq: row.syncSeq, seq: row.seq });
49
+ }
50
+ else {
51
+ evicts.push({ docId: row.docId, channel: row.channel, syncSeq: row.syncSeq });
52
+ }
53
+ }
54
+ const entries = [];
55
+ for (const d of liveDocs) {
56
+ const grantedDocChannels = d.channels.filter((ch) => grantedSet.has(ch));
57
+ if (grantedDocChannels.length === 0)
58
+ continue;
59
+ const putSeq = latestPut.get(d.docId);
60
+ if (putSeq === undefined)
61
+ continue;
62
+ const behind = grantedDocChannels.some((ch) => cursorOf(ch) < putSeq);
63
+ if (behind)
64
+ entries.push({ kind: "put", docId: d.docId, syncSeq: putSeq, seq: d.seq, doc: d.doc });
65
+ }
66
+ for (const [docId, del] of latestDelete) {
67
+ const behind = grantedChannels.some((ch) => cursorOf(ch) < del.syncSeq);
68
+ if (behind)
69
+ entries.push({ kind: "delete", docId, syncSeq: del.syncSeq, seq: del.seq });
70
+ }
71
+ for (const e of evicts) {
72
+ if (!grantedSet.has(e.channel))
73
+ continue;
74
+ if (cursorOf(e.channel) < e.syncSeq)
75
+ entries.push({ kind: "evict", docId: e.docId, syncSeq: e.syncSeq, channel: e.channel });
76
+ }
77
+ entries.sort((a, b) => a.syncSeq - b.syncSeq || (a.docId < b.docId ? -1 : a.docId > b.docId ? 1 : 0));
78
+ const deliveredPutDocs = new Set(entries.filter((e) => e.kind === "put").map((e) => e.docId));
79
+ if (docCount > 0 && deliveredPutDocs.size > docCount / 2) {
80
+ return { mode: "snapshot", entries: buildSnapshot(), cursors: nextCursors, grantedChannels: [...grantedChannels] };
81
+ }
82
+ return { mode: "incremental", entries, cursors: nextCursors, grantedChannels: [...grantedChannels] };
83
+ }
84
+ //# sourceMappingURL=sync-pull-core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-pull-core.js","sourceRoot":"","sources":["../../jsr/public/sync-pull-core.ts"],"names":[],"mappings":"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"}