@haikit/postgres 0.13.0 → 0.14.0
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/README.md +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +20 -3
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/src/index.ts +20 -3
package/README.md
CHANGED
|
@@ -56,6 +56,9 @@ code declares.
|
|
|
56
56
|
`noticed_through` to `haikit_conversations`, for `hai.notify`. As before, if
|
|
57
57
|
you call `migrate()` at startup there is nothing to do.
|
|
58
58
|
|
|
59
|
+
**Upgrading to 0.13:** `migrate()` adds `kind` to `haikit_notices`, and
|
|
60
|
+
`wakes` and `woke_through` to `haikit_conversations`, for wake notices.
|
|
61
|
+
|
|
59
62
|
Handles are numbered per conversation, so every conversation's digests start at
|
|
60
63
|
`ui_01`.
|
|
61
64
|
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAML,KAAK,YAAY,EAClB,MAAM,cAAc,CAAC;AAEtB;;;;;;;;GAQG;AACH,MAAM,WAAW,SAAS;IACxB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,GAAG,EAAE,CAAA;KAAE,CAAC,CAAC;CACnE;AAED,MAAM,WAAW,cAAc;IAC7B;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;;OAKG;IACH,MAAM,CAAC,EAAE,QAAQ,CAAC;CACnB;AAED;;;GAGG;AACH,MAAM,WAAW,QAAQ;IACvB,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAChF;AAID,gFAAgF;AAChF,eAAO,MAAM,cAAc,mBAAmB,CAAC;AAE/C;;;GAGG;AACH,eAAO,MAAM,MAAM,EAAE,SAAS,MAAM,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAML,KAAK,YAAY,EAClB,MAAM,cAAc,CAAC;AAEtB;;;;;;;;GAQG;AACH,MAAM,WAAW,SAAS;IACxB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,GAAG,EAAE,CAAA;KAAE,CAAC,CAAC;CACnE;AAED,MAAM,WAAW,cAAc;IAC7B;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;;OAKG;IACH,MAAM,CAAC,EAAE,QAAQ,CAAC;CACnB;AAED;;;GAGG;AACH,MAAM,WAAW,QAAQ;IACvB,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAChF;AAID,gFAAgF;AAChF,eAAO,MAAM,cAAc,mBAAmB,CAAC;AAE/C;;;GAGG;AACH,eAAO,MAAM,MAAM,EAAE,SAAS,MAAM,EA8DnC,CAAC;AAEF,8FAA8F;AAC9F,wBAAsB,OAAO,CAAC,EAAE,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAI1D;AAkED,wBAAgB,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,OAAO,GAAE,cAAmB,GAAG,YAAY,CAuPjF;AAED,MAAM,WAAW,YAAY;IAC3B;;;;OAIG;IACH,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,YAAY,CAAC,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAYrG"}
|
package/dist/index.js
CHANGED
|
@@ -32,11 +32,16 @@ export const schema = [
|
|
|
32
32
|
-- the last notice number given out, and the last one its history took in
|
|
33
33
|
notice_seq integer NOT NULL DEFAULT 0,
|
|
34
34
|
noticed_through integer NOT NULL DEFAULT 0,
|
|
35
|
+
-- when recent wake turns started, and the last notice that may no longer start one
|
|
36
|
+
wakes jsonb NOT NULL DEFAULT '[]',
|
|
37
|
+
woke_through integer NOT NULL DEFAULT 0,
|
|
35
38
|
updated_at timestamptz NOT NULL DEFAULT now()
|
|
36
39
|
)`,
|
|
37
40
|
// a table created before notices existed gains the columns
|
|
38
41
|
`ALTER TABLE haikit_conversations ADD COLUMN IF NOT EXISTS notice_seq integer NOT NULL DEFAULT 0`,
|
|
39
42
|
`ALTER TABLE haikit_conversations ADD COLUMN IF NOT EXISTS noticed_through integer NOT NULL DEFAULT 0`,
|
|
43
|
+
`ALTER TABLE haikit_conversations ADD COLUMN IF NOT EXISTS wakes jsonb NOT NULL DEFAULT '[]'`,
|
|
44
|
+
`ALTER TABLE haikit_conversations ADD COLUMN IF NOT EXISTS woke_through integer NOT NULL DEFAULT 0`,
|
|
40
45
|
// Append-only, and never an orphan: a notice belongs to a conversation that
|
|
41
46
|
// exists, and goes when it does.
|
|
42
47
|
`CREATE TABLE IF NOT EXISTS haikit_notices (
|
|
@@ -48,8 +53,11 @@ export const schema = [
|
|
|
48
53
|
payload jsonb NOT NULL,
|
|
49
54
|
model text,
|
|
50
55
|
handle text,
|
|
56
|
+
-- 'wake', or NULL for a passive notice
|
|
57
|
+
kind text,
|
|
51
58
|
PRIMARY KEY (conversation_id, seq)
|
|
52
59
|
)`,
|
|
60
|
+
`ALTER TABLE haikit_notices ADD COLUMN IF NOT EXISTS kind text`,
|
|
53
61
|
// Write-once. Nothing about a payload changes after insert — everything that
|
|
54
62
|
// does lives on the fenced conversation row (see Conversation.frozen).
|
|
55
63
|
`CREATE TABLE IF NOT EXISTS haikit_payloads (
|
|
@@ -87,9 +95,10 @@ export async function migrate(db) {
|
|
|
87
95
|
const CONVERSATION_COLUMNS = `
|
|
88
96
|
id, status, messages::text AS messages, handles::text AS handles,
|
|
89
97
|
frozen::text AS frozen, pending::text AS pending, lease_token, noticed_through,
|
|
98
|
+
wakes::text AS wakes, woke_through,
|
|
90
99
|
(extract(epoch FROM lease_until) * 1000)::float8 AS lease_until_ms`;
|
|
91
100
|
const NOTICE_COLUMNS = `
|
|
92
|
-
conversation_id, seq, name, version, payload::text AS payload, model, handle,
|
|
101
|
+
conversation_id, seq, name, version, payload::text AS payload, model, handle, kind,
|
|
93
102
|
(extract(epoch FROM created_at) * 1000)::float8 AS created_at_ms`;
|
|
94
103
|
// The window is read as text too: 'Infinity' is how "never" is stored, and
|
|
95
104
|
// drivers need not agree on turning it into a number.
|
|
@@ -108,6 +117,8 @@ const toConversation = (row) => ({
|
|
|
108
117
|
leaseUntil: row.lease_until_ms == null ? null : Number(row.lease_until_ms),
|
|
109
118
|
leaseToken: row.lease_token,
|
|
110
119
|
noticedThrough: Number(row.noticed_through ?? 0),
|
|
120
|
+
wakes: row.wakes == null ? [] : json(row.wakes),
|
|
121
|
+
wokeThrough: Number(row.woke_through ?? 0),
|
|
111
122
|
});
|
|
112
123
|
const toNotice = (row) => ({
|
|
113
124
|
conversationId: row.conversation_id,
|
|
@@ -118,6 +129,7 @@ const toNotice = (row) => ({
|
|
|
118
129
|
payload: json(row.payload),
|
|
119
130
|
model: row.model,
|
|
120
131
|
...(row.handle == null ? {} : { handle: row.handle }),
|
|
132
|
+
...(row.kind === "wake" ? { kind: "wake" } : {}),
|
|
121
133
|
});
|
|
122
134
|
const toPayload = (row) => ({
|
|
123
135
|
handle: row.handle,
|
|
@@ -236,6 +248,8 @@ export function pgStore(db, options = {}) {
|
|
|
236
248
|
pending = $7::jsonb,
|
|
237
249
|
lease_until = to_timestamp($8::float8 / 1000),
|
|
238
250
|
noticed_through = $9::integer,
|
|
251
|
+
wakes = $10::jsonb,
|
|
252
|
+
woke_through = $11::integer,
|
|
239
253
|
updated_at = now()
|
|
240
254
|
WHERE id = $1 AND lease_token = $2
|
|
241
255
|
RETURNING id`, [
|
|
@@ -249,6 +263,8 @@ export function pgStore(db, options = {}) {
|
|
|
249
263
|
conversation.pending == null ? null : JSON.stringify(conversation.pending),
|
|
250
264
|
conversation.leaseUntil,
|
|
251
265
|
conversation.noticedThrough ?? 0,
|
|
266
|
+
JSON.stringify(conversation.wakes ?? []),
|
|
267
|
+
conversation.wokeThrough ?? 0,
|
|
252
268
|
]);
|
|
253
269
|
if (!rows.length)
|
|
254
270
|
await stale(conversation.id);
|
|
@@ -318,8 +334,8 @@ export function pgStore(db, options = {}) {
|
|
|
318
334
|
WHERE id = $1::text
|
|
319
335
|
RETURNING notice_seq
|
|
320
336
|
), stored AS (
|
|
321
|
-
INSERT INTO haikit_notices (conversation_id, seq, name, version, payload, model, handle)
|
|
322
|
-
SELECT $1::text, notice_seq, $2::text, $3::integer, $4::jsonb, $5::text, $6::text FROM next
|
|
337
|
+
INSERT INTO haikit_notices (conversation_id, seq, name, version, payload, model, handle, kind)
|
|
338
|
+
SELECT $1::text, notice_seq, $2::text, $3::integer, $4::jsonb, $5::text, $6::text, $7::text FROM next
|
|
323
339
|
RETURNING ${NOTICE_COLUMNS}
|
|
324
340
|
)
|
|
325
341
|
SELECT stored.*, pg_notify('${NOTICE_CHANNEL}', $1::text) FROM stored`, [
|
|
@@ -329,6 +345,7 @@ export function pgStore(db, options = {}) {
|
|
|
329
345
|
JSON.stringify(record.payload ?? null),
|
|
330
346
|
record.model,
|
|
331
347
|
record.handle ?? null,
|
|
348
|
+
record.kind === "wake" ? "wake" : null,
|
|
332
349
|
]);
|
|
333
350
|
if (!rows.length)
|
|
334
351
|
throw new Error(`conversation ${record.conversationId} does not exist`);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EACL,gBAAgB,EAChB,UAAU,GAKX,MAAM,cAAc,CAAC;AAuCtB,MAAM,QAAQ,GAAG,OAAO,CAAC;AAEzB,gFAAgF;AAChF,MAAM,CAAC,MAAM,cAAc,GAAG,gBAAgB,CAAC;AAE/C;;;GAGG;AACH,MAAM,CAAC,MAAM,MAAM,GAAsB;IACvC
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@haikit/postgres",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.14.0",
|
|
4
4
|
"description": "Postgres store adapter for haikit: durable conversations, fenced turn leases, write-once payloads. Bring your own driver.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"haikit",
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
"prepack": "npm --prefix ../.. run build"
|
|
35
35
|
},
|
|
36
36
|
"dependencies": {
|
|
37
|
-
"@haikit/core": "0.
|
|
37
|
+
"@haikit/core": "0.14.0"
|
|
38
38
|
},
|
|
39
39
|
"publishConfig": {
|
|
40
40
|
"access": "public"
|
package/src/index.ts
CHANGED
|
@@ -80,11 +80,16 @@ export const schema: readonly string[] = [
|
|
|
80
80
|
-- the last notice number given out, and the last one its history took in
|
|
81
81
|
notice_seq integer NOT NULL DEFAULT 0,
|
|
82
82
|
noticed_through integer NOT NULL DEFAULT 0,
|
|
83
|
+
-- when recent wake turns started, and the last notice that may no longer start one
|
|
84
|
+
wakes jsonb NOT NULL DEFAULT '[]',
|
|
85
|
+
woke_through integer NOT NULL DEFAULT 0,
|
|
83
86
|
updated_at timestamptz NOT NULL DEFAULT now()
|
|
84
87
|
)`,
|
|
85
88
|
// a table created before notices existed gains the columns
|
|
86
89
|
`ALTER TABLE haikit_conversations ADD COLUMN IF NOT EXISTS notice_seq integer NOT NULL DEFAULT 0`,
|
|
87
90
|
`ALTER TABLE haikit_conversations ADD COLUMN IF NOT EXISTS noticed_through integer NOT NULL DEFAULT 0`,
|
|
91
|
+
`ALTER TABLE haikit_conversations ADD COLUMN IF NOT EXISTS wakes jsonb NOT NULL DEFAULT '[]'`,
|
|
92
|
+
`ALTER TABLE haikit_conversations ADD COLUMN IF NOT EXISTS woke_through integer NOT NULL DEFAULT 0`,
|
|
88
93
|
// Append-only, and never an orphan: a notice belongs to a conversation that
|
|
89
94
|
// exists, and goes when it does.
|
|
90
95
|
`CREATE TABLE IF NOT EXISTS haikit_notices (
|
|
@@ -96,8 +101,11 @@ export const schema: readonly string[] = [
|
|
|
96
101
|
payload jsonb NOT NULL,
|
|
97
102
|
model text,
|
|
98
103
|
handle text,
|
|
104
|
+
-- 'wake', or NULL for a passive notice
|
|
105
|
+
kind text,
|
|
99
106
|
PRIMARY KEY (conversation_id, seq)
|
|
100
107
|
)`,
|
|
108
|
+
`ALTER TABLE haikit_notices ADD COLUMN IF NOT EXISTS kind text`,
|
|
101
109
|
// Write-once. Nothing about a payload changes after insert — everything that
|
|
102
110
|
// does lives on the fenced conversation row (see Conversation.frozen).
|
|
103
111
|
`CREATE TABLE IF NOT EXISTS haikit_payloads (
|
|
@@ -136,10 +144,11 @@ export async function migrate(db: Queryable): Promise<void> {
|
|
|
136
144
|
const CONVERSATION_COLUMNS = `
|
|
137
145
|
id, status, messages::text AS messages, handles::text AS handles,
|
|
138
146
|
frozen::text AS frozen, pending::text AS pending, lease_token, noticed_through,
|
|
147
|
+
wakes::text AS wakes, woke_through,
|
|
139
148
|
(extract(epoch FROM lease_until) * 1000)::float8 AS lease_until_ms`;
|
|
140
149
|
|
|
141
150
|
const NOTICE_COLUMNS = `
|
|
142
|
-
conversation_id, seq, name, version, payload::text AS payload, model, handle,
|
|
151
|
+
conversation_id, seq, name, version, payload::text AS payload, model, handle, kind,
|
|
143
152
|
(extract(epoch FROM created_at) * 1000)::float8 AS created_at_ms`;
|
|
144
153
|
|
|
145
154
|
// The window is read as text too: 'Infinity' is how "never" is stored, and
|
|
@@ -161,6 +170,8 @@ const toConversation = (row: any): Conversation => ({
|
|
|
161
170
|
leaseUntil: row.lease_until_ms == null ? null : Number(row.lease_until_ms),
|
|
162
171
|
leaseToken: row.lease_token,
|
|
163
172
|
noticedThrough: Number(row.noticed_through ?? 0),
|
|
173
|
+
wakes: row.wakes == null ? [] : json(row.wakes),
|
|
174
|
+
wokeThrough: Number(row.woke_through ?? 0),
|
|
164
175
|
});
|
|
165
176
|
|
|
166
177
|
const toNotice = (row: any): NoticeRecord => ({
|
|
@@ -172,6 +183,7 @@ const toNotice = (row: any): NoticeRecord => ({
|
|
|
172
183
|
payload: json(row.payload),
|
|
173
184
|
model: row.model,
|
|
174
185
|
...(row.handle == null ? {} : { handle: row.handle }),
|
|
186
|
+
...(row.kind === "wake" ? { kind: "wake" as const } : {}),
|
|
175
187
|
});
|
|
176
188
|
|
|
177
189
|
const toPayload = (row: any): PayloadRecord => ({
|
|
@@ -302,6 +314,8 @@ export function pgStore(db: Queryable, options: PgStoreOptions = {}): StoreAdapt
|
|
|
302
314
|
pending = $7::jsonb,
|
|
303
315
|
lease_until = to_timestamp($8::float8 / 1000),
|
|
304
316
|
noticed_through = $9::integer,
|
|
317
|
+
wakes = $10::jsonb,
|
|
318
|
+
woke_through = $11::integer,
|
|
305
319
|
updated_at = now()
|
|
306
320
|
WHERE id = $1 AND lease_token = $2
|
|
307
321
|
RETURNING id`,
|
|
@@ -316,6 +330,8 @@ export function pgStore(db: Queryable, options: PgStoreOptions = {}): StoreAdapt
|
|
|
316
330
|
conversation.pending == null ? null : JSON.stringify(conversation.pending),
|
|
317
331
|
conversation.leaseUntil,
|
|
318
332
|
conversation.noticedThrough ?? 0,
|
|
333
|
+
JSON.stringify(conversation.wakes ?? []),
|
|
334
|
+
conversation.wokeThrough ?? 0,
|
|
319
335
|
],
|
|
320
336
|
);
|
|
321
337
|
if (!rows.length) await stale(conversation.id);
|
|
@@ -397,8 +413,8 @@ export function pgStore(db: Queryable, options: PgStoreOptions = {}): StoreAdapt
|
|
|
397
413
|
WHERE id = $1::text
|
|
398
414
|
RETURNING notice_seq
|
|
399
415
|
), stored AS (
|
|
400
|
-
INSERT INTO haikit_notices (conversation_id, seq, name, version, payload, model, handle)
|
|
401
|
-
SELECT $1::text, notice_seq, $2::text, $3::integer, $4::jsonb, $5::text, $6::text FROM next
|
|
416
|
+
INSERT INTO haikit_notices (conversation_id, seq, name, version, payload, model, handle, kind)
|
|
417
|
+
SELECT $1::text, notice_seq, $2::text, $3::integer, $4::jsonb, $5::text, $6::text, $7::text FROM next
|
|
402
418
|
RETURNING ${NOTICE_COLUMNS}
|
|
403
419
|
)
|
|
404
420
|
SELECT stored.*, pg_notify('${NOTICE_CHANNEL}', $1::text) FROM stored`,
|
|
@@ -409,6 +425,7 @@ export function pgStore(db: Queryable, options: PgStoreOptions = {}): StoreAdapt
|
|
|
409
425
|
JSON.stringify(record.payload ?? null),
|
|
410
426
|
record.model,
|
|
411
427
|
record.handle ?? null,
|
|
428
|
+
record.kind === "wake" ? "wake" : null,
|
|
412
429
|
],
|
|
413
430
|
);
|
|
414
431
|
if (!rows.length) throw new Error(`conversation ${record.conversationId} does not exist`);
|