@neutron-build/nucleus 0.1.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/LICENSE +21 -0
- package/README.md +27 -0
- package/dist/blob/index.d.ts +42 -0
- package/dist/blob/index.d.ts.map +1 -0
- package/dist/blob/index.js +121 -0
- package/dist/blob/index.js.map +1 -0
- package/dist/cdc/index.d.ts +14 -0
- package/dist/cdc/index.d.ts.map +1 -0
- package/dist/cdc/index.js +41 -0
- package/dist/cdc/index.js.map +1 -0
- package/dist/client.d.ts +59 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +68 -0
- package/dist/client.js.map +1 -0
- package/dist/columnar/index.d.ts +20 -0
- package/dist/columnar/index.d.ts.map +1 -0
- package/dist/columnar/index.js +60 -0
- package/dist/columnar/index.js.map +1 -0
- package/dist/datalog/index.d.ts +20 -0
- package/dist/datalog/index.d.ts.map +1 -0
- package/dist/datalog/index.js +53 -0
- package/dist/datalog/index.js.map +1 -0
- package/dist/document/index.d.ts +42 -0
- package/dist/document/index.d.ts.map +1 -0
- package/dist/document/index.js +154 -0
- package/dist/document/index.js.map +1 -0
- package/dist/errors.d.ts +39 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +64 -0
- package/dist/errors.js.map +1 -0
- package/dist/features.d.ts +14 -0
- package/dist/features.d.ts.map +1 -0
- package/dist/features.js +85 -0
- package/dist/features.js.map +1 -0
- package/dist/fts/index.d.ts +35 -0
- package/dist/fts/index.d.ts.map +1 -0
- package/dist/fts/index.js +76 -0
- package/dist/fts/index.js.map +1 -0
- package/dist/geo/index.d.ts +34 -0
- package/dist/geo/index.d.ts.map +1 -0
- package/dist/geo/index.js +121 -0
- package/dist/geo/index.js.map +1 -0
- package/dist/graph/index.d.ts +43 -0
- package/dist/graph/index.d.ts.map +1 -0
- package/dist/graph/index.js +109 -0
- package/dist/graph/index.js.map +1 -0
- package/dist/helpers.d.ts +11 -0
- package/dist/helpers.d.ts.map +1 -0
- package/dist/helpers.js +47 -0
- package/dist/helpers.js.map +1 -0
- package/dist/index.d.ts +39 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +29 -0
- package/dist/index.js.map +1 -0
- package/dist/kv/index.d.ts +93 -0
- package/dist/kv/index.d.ts.map +1 -0
- package/dist/kv/index.js +223 -0
- package/dist/kv/index.js.map +1 -0
- package/dist/migrate.d.ts +37 -0
- package/dist/migrate.d.ts.map +1 -0
- package/dist/migrate.js +95 -0
- package/dist/migrate.js.map +1 -0
- package/dist/pubsub/index.d.ts +14 -0
- package/dist/pubsub/index.d.ts.map +1 -0
- package/dist/pubsub/index.js +44 -0
- package/dist/pubsub/index.js.map +1 -0
- package/dist/sql/index.d.ts +31 -0
- package/dist/sql/index.d.ts.map +1 -0
- package/dist/sql/index.js +65 -0
- package/dist/sql/index.js.map +1 -0
- package/dist/streams/index.d.ts +26 -0
- package/dist/streams/index.d.ts.map +1 -0
- package/dist/streams/index.js +83 -0
- package/dist/streams/index.js.map +1 -0
- package/dist/timeseries/index.d.ts +46 -0
- package/dist/timeseries/index.d.ts.map +1 -0
- package/dist/timeseries/index.js +122 -0
- package/dist/timeseries/index.js.map +1 -0
- package/dist/transport.d.ts +97 -0
- package/dist/transport.d.ts.map +1 -0
- package/dist/transport.js +477 -0
- package/dist/transport.js.map +1 -0
- package/dist/types.d.ts +58 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/vector/index.d.ts +34 -0
- package/dist/vector/index.d.ts.map +1 -0
- package/dist/vector/index.js +104 -0
- package/dist/vector/index.js.map +1 -0
- package/package.json +110 -0
package/dist/kv/index.js
ADDED
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// @neutron/nucleus/kv — KV model plugin
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
import { requireNucleus } from '../helpers.js';
|
|
5
|
+
// ---------------------------------------------------------------------------
|
|
6
|
+
// Implementation
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
function resolveKey(key, namespace) {
|
|
9
|
+
return namespace ? `${namespace}:${key}` : key;
|
|
10
|
+
}
|
|
11
|
+
class KVModelImpl {
|
|
12
|
+
transport;
|
|
13
|
+
features;
|
|
14
|
+
constructor(transport, features) {
|
|
15
|
+
this.transport = transport;
|
|
16
|
+
this.features = features;
|
|
17
|
+
}
|
|
18
|
+
require() {
|
|
19
|
+
requireNucleus(this.features, 'KV');
|
|
20
|
+
}
|
|
21
|
+
// -- Base ------------------------------------------------------------------
|
|
22
|
+
async get(key) {
|
|
23
|
+
this.require();
|
|
24
|
+
return this.transport.fetchval('SELECT KV_GET($1)', [key]);
|
|
25
|
+
}
|
|
26
|
+
async getTyped(key) {
|
|
27
|
+
const raw = await this.get(key);
|
|
28
|
+
if (raw === null)
|
|
29
|
+
return null;
|
|
30
|
+
return JSON.parse(raw);
|
|
31
|
+
}
|
|
32
|
+
async set(key, value, opts) {
|
|
33
|
+
this.require();
|
|
34
|
+
const k = resolveKey(key, opts?.namespace);
|
|
35
|
+
if (opts?.ttl !== undefined) {
|
|
36
|
+
await this.transport.execute('SELECT KV_SET($1, $2, $3)', [k, value, opts.ttl]);
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
await this.transport.execute('SELECT KV_SET($1, $2)', [k, value]);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
async setTyped(key, value, opts) {
|
|
43
|
+
await this.set(key, JSON.stringify(value), opts);
|
|
44
|
+
}
|
|
45
|
+
async setNX(key, value) {
|
|
46
|
+
this.require();
|
|
47
|
+
return (await this.transport.fetchval('SELECT KV_SETNX($1, $2)', [key, value])) ?? false;
|
|
48
|
+
}
|
|
49
|
+
async delete(key) {
|
|
50
|
+
this.require();
|
|
51
|
+
return (await this.transport.fetchval('SELECT KV_DEL($1)', [key])) ?? false;
|
|
52
|
+
}
|
|
53
|
+
async exists(key) {
|
|
54
|
+
this.require();
|
|
55
|
+
return (await this.transport.fetchval('SELECT KV_EXISTS($1)', [key])) ?? false;
|
|
56
|
+
}
|
|
57
|
+
async incr(key, amount) {
|
|
58
|
+
this.require();
|
|
59
|
+
if (amount !== undefined) {
|
|
60
|
+
return (await this.transport.fetchval('SELECT KV_INCR($1, $2)', [key, amount])) ?? 0;
|
|
61
|
+
}
|
|
62
|
+
return (await this.transport.fetchval('SELECT KV_INCR($1)', [key])) ?? 0;
|
|
63
|
+
}
|
|
64
|
+
async ttl(key) {
|
|
65
|
+
this.require();
|
|
66
|
+
return (await this.transport.fetchval('SELECT KV_TTL($1)', [key])) ?? -2;
|
|
67
|
+
}
|
|
68
|
+
async expire(key, seconds) {
|
|
69
|
+
this.require();
|
|
70
|
+
return (await this.transport.fetchval('SELECT KV_EXPIRE($1, $2)', [key, seconds])) ?? false;
|
|
71
|
+
}
|
|
72
|
+
async dbSize() {
|
|
73
|
+
this.require();
|
|
74
|
+
return (await this.transport.fetchval('SELECT KV_DBSIZE()')) ?? 0;
|
|
75
|
+
}
|
|
76
|
+
async flushDB() {
|
|
77
|
+
this.require();
|
|
78
|
+
await this.transport.execute('SELECT KV_FLUSHDB()');
|
|
79
|
+
}
|
|
80
|
+
async scan(pattern, count = 100) {
|
|
81
|
+
this.require();
|
|
82
|
+
const result = await this.transport.query('SELECT KV_SCAN($1, $2)', [pattern, count]);
|
|
83
|
+
return result.rows;
|
|
84
|
+
}
|
|
85
|
+
// -- Lists -----------------------------------------------------------------
|
|
86
|
+
async lpush(key, value) {
|
|
87
|
+
this.require();
|
|
88
|
+
return (await this.transport.fetchval('SELECT KV_LPUSH($1, $2)', [key, value])) ?? 0;
|
|
89
|
+
}
|
|
90
|
+
async rpush(key, value) {
|
|
91
|
+
this.require();
|
|
92
|
+
return (await this.transport.fetchval('SELECT KV_RPUSH($1, $2)', [key, value])) ?? 0;
|
|
93
|
+
}
|
|
94
|
+
async lpop(key) {
|
|
95
|
+
this.require();
|
|
96
|
+
return this.transport.fetchval('SELECT KV_LPOP($1)', [key]);
|
|
97
|
+
}
|
|
98
|
+
async rpop(key) {
|
|
99
|
+
this.require();
|
|
100
|
+
return this.transport.fetchval('SELECT KV_RPOP($1)', [key]);
|
|
101
|
+
}
|
|
102
|
+
async lrange(key, start, stop) {
|
|
103
|
+
this.require();
|
|
104
|
+
const raw = await this.transport.fetchval('SELECT KV_LRANGE($1, $2, $3)', [key, start, stop]);
|
|
105
|
+
if (!raw)
|
|
106
|
+
return [];
|
|
107
|
+
return raw.split(',');
|
|
108
|
+
}
|
|
109
|
+
async llen(key) {
|
|
110
|
+
this.require();
|
|
111
|
+
return (await this.transport.fetchval('SELECT KV_LLEN($1)', [key])) ?? 0;
|
|
112
|
+
}
|
|
113
|
+
async lindex(key, index) {
|
|
114
|
+
this.require();
|
|
115
|
+
return this.transport.fetchval('SELECT KV_LINDEX($1, $2)', [key, index]);
|
|
116
|
+
}
|
|
117
|
+
// -- Hashes ----------------------------------------------------------------
|
|
118
|
+
async hset(key, field, value) {
|
|
119
|
+
this.require();
|
|
120
|
+
return (await this.transport.fetchval('SELECT KV_HSET($1, $2, $3)', [key, field, value])) ?? false;
|
|
121
|
+
}
|
|
122
|
+
async hget(key, field) {
|
|
123
|
+
this.require();
|
|
124
|
+
return this.transport.fetchval('SELECT KV_HGET($1, $2)', [key, field]);
|
|
125
|
+
}
|
|
126
|
+
async hdel(key, field) {
|
|
127
|
+
this.require();
|
|
128
|
+
return (await this.transport.fetchval('SELECT KV_HDEL($1, $2)', [key, field])) ?? false;
|
|
129
|
+
}
|
|
130
|
+
async hexists(key, field) {
|
|
131
|
+
this.require();
|
|
132
|
+
return (await this.transport.fetchval('SELECT KV_HEXISTS($1, $2)', [key, field])) ?? false;
|
|
133
|
+
}
|
|
134
|
+
async hgetall(key) {
|
|
135
|
+
this.require();
|
|
136
|
+
const raw = await this.transport.fetchval('SELECT KV_HGETALL($1)', [key]);
|
|
137
|
+
if (!raw)
|
|
138
|
+
return {};
|
|
139
|
+
const result = {};
|
|
140
|
+
for (const pair of raw.split(',')) {
|
|
141
|
+
const eqIdx = pair.indexOf('=');
|
|
142
|
+
if (eqIdx !== -1) {
|
|
143
|
+
result[pair.slice(0, eqIdx)] = pair.slice(eqIdx + 1);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
return result;
|
|
147
|
+
}
|
|
148
|
+
async hlen(key) {
|
|
149
|
+
this.require();
|
|
150
|
+
return (await this.transport.fetchval('SELECT KV_HLEN($1)', [key])) ?? 0;
|
|
151
|
+
}
|
|
152
|
+
// -- Sets ------------------------------------------------------------------
|
|
153
|
+
async sadd(key, member) {
|
|
154
|
+
this.require();
|
|
155
|
+
return (await this.transport.fetchval('SELECT KV_SADD($1, $2)', [key, member])) ?? false;
|
|
156
|
+
}
|
|
157
|
+
async srem(key, member) {
|
|
158
|
+
this.require();
|
|
159
|
+
return (await this.transport.fetchval('SELECT KV_SREM($1, $2)', [key, member])) ?? false;
|
|
160
|
+
}
|
|
161
|
+
async smembers(key) {
|
|
162
|
+
this.require();
|
|
163
|
+
const raw = await this.transport.fetchval('SELECT KV_SMEMBERS($1)', [key]);
|
|
164
|
+
if (!raw)
|
|
165
|
+
return [];
|
|
166
|
+
return raw.split(',');
|
|
167
|
+
}
|
|
168
|
+
async sismember(key, member) {
|
|
169
|
+
this.require();
|
|
170
|
+
return (await this.transport.fetchval('SELECT KV_SISMEMBER($1, $2)', [key, member])) ?? false;
|
|
171
|
+
}
|
|
172
|
+
async scard(key) {
|
|
173
|
+
this.require();
|
|
174
|
+
return (await this.transport.fetchval('SELECT KV_SCARD($1)', [key])) ?? 0;
|
|
175
|
+
}
|
|
176
|
+
// -- Sorted Sets -----------------------------------------------------------
|
|
177
|
+
async zadd(key, score, member) {
|
|
178
|
+
this.require();
|
|
179
|
+
return (await this.transport.fetchval('SELECT KV_ZADD($1, $2, $3)', [key, score, member])) ?? false;
|
|
180
|
+
}
|
|
181
|
+
async zrange(key, start, stop) {
|
|
182
|
+
this.require();
|
|
183
|
+
const raw = await this.transport.fetchval('SELECT KV_ZRANGE($1, $2, $3)', [key, start, stop]);
|
|
184
|
+
if (!raw)
|
|
185
|
+
return [];
|
|
186
|
+
return raw.split(',');
|
|
187
|
+
}
|
|
188
|
+
async zrangeByScore(key, min, max) {
|
|
189
|
+
this.require();
|
|
190
|
+
const raw = await this.transport.fetchval('SELECT KV_ZRANGEBYSCORE($1, $2, $3)', [key, min, max]);
|
|
191
|
+
if (!raw)
|
|
192
|
+
return [];
|
|
193
|
+
return raw.split(',');
|
|
194
|
+
}
|
|
195
|
+
async zrem(key, member) {
|
|
196
|
+
this.require();
|
|
197
|
+
return (await this.transport.fetchval('SELECT KV_ZREM($1, $2)', [key, member])) ?? false;
|
|
198
|
+
}
|
|
199
|
+
async zcard(key) {
|
|
200
|
+
this.require();
|
|
201
|
+
return (await this.transport.fetchval('SELECT KV_ZCARD($1)', [key])) ?? 0;
|
|
202
|
+
}
|
|
203
|
+
// -- HyperLogLog -----------------------------------------------------------
|
|
204
|
+
async pfadd(key, element) {
|
|
205
|
+
this.require();
|
|
206
|
+
return (await this.transport.fetchval('SELECT KV_PFADD($1, $2)', [key, element])) ?? false;
|
|
207
|
+
}
|
|
208
|
+
async pfcount(key) {
|
|
209
|
+
this.require();
|
|
210
|
+
return (await this.transport.fetchval('SELECT KV_PFCOUNT($1)', [key])) ?? 0;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
// ---------------------------------------------------------------------------
|
|
214
|
+
// Plugin
|
|
215
|
+
// ---------------------------------------------------------------------------
|
|
216
|
+
/** Plugin: adds `.kv` to the client. */
|
|
217
|
+
export const withKV = {
|
|
218
|
+
name: 'kv',
|
|
219
|
+
init(transport, features) {
|
|
220
|
+
return { kv: new KVModelImpl(transport, features) };
|
|
221
|
+
},
|
|
222
|
+
};
|
|
223
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/kv/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { Transport } from './types.js';
|
|
2
|
+
/** A single migration definition. */
|
|
3
|
+
export interface Migration {
|
|
4
|
+
/** Monotonically increasing version number. */
|
|
5
|
+
version: number;
|
|
6
|
+
/** Human-readable name. */
|
|
7
|
+
name: string;
|
|
8
|
+
/** SQL to apply the migration. */
|
|
9
|
+
up: string;
|
|
10
|
+
/** SQL to revert the migration (optional). */
|
|
11
|
+
down?: string;
|
|
12
|
+
}
|
|
13
|
+
/** A migration that has already been applied. */
|
|
14
|
+
export interface MigrationRecord {
|
|
15
|
+
version: number;
|
|
16
|
+
name: string;
|
|
17
|
+
appliedAt: Date;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Run all pending migrations in ascending version order.
|
|
21
|
+
*
|
|
22
|
+
* Each migration runs inside its own transaction. Returns the names of the
|
|
23
|
+
* migrations that were applied.
|
|
24
|
+
*/
|
|
25
|
+
export declare function migrate(transport: Transport, migrations: Migration[]): Promise<string[]>;
|
|
26
|
+
/**
|
|
27
|
+
* Roll back the most recently applied migrations.
|
|
28
|
+
*
|
|
29
|
+
* @param steps Number of migrations to roll back (default 1).
|
|
30
|
+
* @returns Names of the migrations that were rolled back.
|
|
31
|
+
*/
|
|
32
|
+
export declare function migrateDown(transport: Transport, migrations: Migration[], steps?: number): Promise<string[]>;
|
|
33
|
+
/**
|
|
34
|
+
* Return all previously applied migrations, ordered by version ascending.
|
|
35
|
+
*/
|
|
36
|
+
export declare function migrationStatus(transport: Transport): Promise<MigrationRecord[]>;
|
|
37
|
+
//# sourceMappingURL=migrate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../src/migrate.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAM5C,qCAAqC;AACrC,MAAM,WAAW,SAAS;IACxB,+CAA+C;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,2BAA2B;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,kCAAkC;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,8CAA8C;IAC9C,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,iDAAiD;AACjD,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,IAAI,CAAC;CACjB;AA2BD;;;;;GAKG;AACH,wBAAsB,OAAO,CAAC,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAwB9F;AAED;;;;;GAKG;AACH,wBAAsB,WAAW,CAC/B,SAAS,EAAE,SAAS,EACpB,UAAU,EAAE,SAAS,EAAE,EACvB,KAAK,SAAI,GACR,OAAO,CAAC,MAAM,EAAE,CAAC,CAyBnB;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAUtF"}
|
package/dist/migrate.js
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// Nucleus client — migration system
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
// ---------------------------------------------------------------------------
|
|
5
|
+
// Internal helpers
|
|
6
|
+
// ---------------------------------------------------------------------------
|
|
7
|
+
const MIGRATIONS_TABLE_SQL = `
|
|
8
|
+
CREATE TABLE IF NOT EXISTS _neutron_migrations (
|
|
9
|
+
version INTEGER PRIMARY KEY,
|
|
10
|
+
name TEXT NOT NULL,
|
|
11
|
+
applied_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
12
|
+
)`;
|
|
13
|
+
async function ensureTable(transport) {
|
|
14
|
+
await transport.execute(MIGRATIONS_TABLE_SQL);
|
|
15
|
+
}
|
|
16
|
+
async function appliedVersions(transport) {
|
|
17
|
+
await ensureTable(transport);
|
|
18
|
+
const result = await transport.query('SELECT version FROM _neutron_migrations');
|
|
19
|
+
return new Set(result.rows.map((r) => r.version));
|
|
20
|
+
}
|
|
21
|
+
// ---------------------------------------------------------------------------
|
|
22
|
+
// Public API
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
24
|
+
/**
|
|
25
|
+
* Run all pending migrations in ascending version order.
|
|
26
|
+
*
|
|
27
|
+
* Each migration runs inside its own transaction. Returns the names of the
|
|
28
|
+
* migrations that were applied.
|
|
29
|
+
*/
|
|
30
|
+
export async function migrate(transport, migrations) {
|
|
31
|
+
const applied = await appliedVersions(transport);
|
|
32
|
+
const sorted = [...migrations].sort((a, b) => a.version - b.version);
|
|
33
|
+
const ran = [];
|
|
34
|
+
for (const m of sorted) {
|
|
35
|
+
if (applied.has(m.version))
|
|
36
|
+
continue;
|
|
37
|
+
const tx = await transport.beginTransaction();
|
|
38
|
+
try {
|
|
39
|
+
await tx.execute(m.up);
|
|
40
|
+
await tx.execute('INSERT INTO _neutron_migrations (version, name) VALUES ($1, $2)', [m.version, m.name]);
|
|
41
|
+
await tx.commit();
|
|
42
|
+
ran.push(m.name);
|
|
43
|
+
}
|
|
44
|
+
catch (err) {
|
|
45
|
+
await tx.rollback();
|
|
46
|
+
throw err;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return ran;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Roll back the most recently applied migrations.
|
|
53
|
+
*
|
|
54
|
+
* @param steps Number of migrations to roll back (default 1).
|
|
55
|
+
* @returns Names of the migrations that were rolled back.
|
|
56
|
+
*/
|
|
57
|
+
export async function migrateDown(transport, migrations, steps = 1) {
|
|
58
|
+
const applied = await appliedVersions(transport);
|
|
59
|
+
const sorted = [...migrations].sort((a, b) => b.version - a.version); // descending
|
|
60
|
+
const rolled = [];
|
|
61
|
+
for (const m of sorted) {
|
|
62
|
+
if (rolled.length >= steps)
|
|
63
|
+
break;
|
|
64
|
+
if (!applied.has(m.version))
|
|
65
|
+
continue;
|
|
66
|
+
if (!m.down) {
|
|
67
|
+
throw new Error(`Migration ${m.version} (${m.name}) has no down SQL`);
|
|
68
|
+
}
|
|
69
|
+
const tx = await transport.beginTransaction();
|
|
70
|
+
try {
|
|
71
|
+
await tx.execute(m.down);
|
|
72
|
+
await tx.execute('DELETE FROM _neutron_migrations WHERE version = $1', [m.version]);
|
|
73
|
+
await tx.commit();
|
|
74
|
+
rolled.push(m.name);
|
|
75
|
+
}
|
|
76
|
+
catch (err) {
|
|
77
|
+
await tx.rollback();
|
|
78
|
+
throw err;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return rolled;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Return all previously applied migrations, ordered by version ascending.
|
|
85
|
+
*/
|
|
86
|
+
export async function migrationStatus(transport) {
|
|
87
|
+
await ensureTable(transport);
|
|
88
|
+
const result = await transport.query('SELECT version, name, applied_at FROM _neutron_migrations ORDER BY version');
|
|
89
|
+
return result.rows.map((r) => ({
|
|
90
|
+
version: r.version,
|
|
91
|
+
name: r.name,
|
|
92
|
+
appliedAt: new Date(r.applied_at),
|
|
93
|
+
}));
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=migrate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate.js","sourceRoot":"","sources":["../src/migrate.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,oCAAoC;AACpC,8EAA8E;AA2B9E,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E,MAAM,oBAAoB,GAAG;;;;;EAK3B,CAAC;AAEH,KAAK,UAAU,WAAW,CAAC,SAAoB;IAC7C,MAAM,SAAS,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;AAChD,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,SAAoB;IACjD,MAAM,WAAW,CAAC,SAAS,CAAC,CAAC;IAC7B,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,KAAK,CAAsB,yCAAyC,CAAC,CAAC;IACrG,OAAO,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AACpD,CAAC;AAED,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,SAAoB,EAAE,UAAuB;IACzE,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,SAAS,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC;IACrE,MAAM,GAAG,GAAa,EAAE,CAAC;IAEzB,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC;YAAE,SAAS;QAErC,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,gBAAgB,EAAE,CAAC;QAC9C,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACvB,MAAM,EAAE,CAAC,OAAO,CACd,iEAAiE,EACjE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CACpB,CAAC;YACF,MAAM,EAAE,CAAC,MAAM,EAAE,CAAC;YAClB,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC;YACpB,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,SAAoB,EACpB,UAAuB,EACvB,KAAK,GAAG,CAAC;IAET,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,SAAS,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa;IACnF,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,IAAI,MAAM,CAAC,MAAM,IAAI,KAAK;YAAE,MAAM;QAClC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC;YAAE,SAAS;QACtC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,IAAI,mBAAmB,CAAC,CAAC;QACxE,CAAC;QAED,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,gBAAgB,EAAE,CAAC;QAC9C,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACzB,MAAM,EAAE,CAAC,OAAO,CAAC,oDAAoD,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;YACpF,MAAM,EAAE,CAAC,MAAM,EAAE,CAAC;YAClB,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC;YACpB,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,SAAoB;IACxD,MAAM,WAAW,CAAC,SAAS,CAAC,CAAC;IAC7B,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,KAAK,CAClC,4EAA4E,CAC7E,CAAC;IACF,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC7B,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,SAAS,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC;KAClC,CAAC,CAAC,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { NucleusPlugin } from '../types.js';
|
|
2
|
+
export interface PubSubModel {
|
|
3
|
+
/** Publish a message on a channel. Returns the number of subscribers reached. */
|
|
4
|
+
publish(channel: string, message: string): Promise<number>;
|
|
5
|
+
/** Return active channels matching an optional pattern (empty = all). */
|
|
6
|
+
channels(pattern?: string): Promise<string>;
|
|
7
|
+
/** Return the number of subscribers on a channel. */
|
|
8
|
+
subscribers(channel: string): Promise<number>;
|
|
9
|
+
}
|
|
10
|
+
/** Plugin: adds `.pubsub` to the client. */
|
|
11
|
+
export declare const withPubSub: NucleusPlugin<{
|
|
12
|
+
pubsub: PubSubModel;
|
|
13
|
+
}>;
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/pubsub/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAa,aAAa,EAAmB,MAAM,aAAa,CAAC;AAO7E,MAAM,WAAW,WAAW;IAC1B,iFAAiF;IACjF,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAE3D,yEAAyE;IACzE,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAE5C,qDAAqD;IACrD,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAC/C;AAuCD,4CAA4C;AAC5C,eAAO,MAAM,UAAU,EAAE,aAAa,CAAC;IAAE,MAAM,EAAE,WAAW,CAAA;CAAE,CAK7D,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// @neutron/nucleus/pubsub — PubSub model plugin
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
import { requireNucleus } from '../helpers.js';
|
|
5
|
+
// ---------------------------------------------------------------------------
|
|
6
|
+
// Implementation
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
class PubSubModelImpl {
|
|
9
|
+
transport;
|
|
10
|
+
features;
|
|
11
|
+
constructor(transport, features) {
|
|
12
|
+
this.transport = transport;
|
|
13
|
+
this.features = features;
|
|
14
|
+
}
|
|
15
|
+
require() {
|
|
16
|
+
requireNucleus(this.features, 'PubSub');
|
|
17
|
+
}
|
|
18
|
+
async publish(channel, message) {
|
|
19
|
+
this.require();
|
|
20
|
+
return (await this.transport.fetchval('SELECT PUBSUB_PUBLISH($1, $2)', [channel, message])) ?? 0;
|
|
21
|
+
}
|
|
22
|
+
async channels(pattern) {
|
|
23
|
+
this.require();
|
|
24
|
+
if (pattern) {
|
|
25
|
+
return (await this.transport.fetchval('SELECT PUBSUB_CHANNELS($1)', [pattern])) ?? '';
|
|
26
|
+
}
|
|
27
|
+
return (await this.transport.fetchval('SELECT PUBSUB_CHANNELS()')) ?? '';
|
|
28
|
+
}
|
|
29
|
+
async subscribers(channel) {
|
|
30
|
+
this.require();
|
|
31
|
+
return (await this.transport.fetchval('SELECT PUBSUB_SUBSCRIBERS($1)', [channel])) ?? 0;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
// ---------------------------------------------------------------------------
|
|
35
|
+
// Plugin
|
|
36
|
+
// ---------------------------------------------------------------------------
|
|
37
|
+
/** Plugin: adds `.pubsub` to the client. */
|
|
38
|
+
export const withPubSub = {
|
|
39
|
+
name: 'pubsub',
|
|
40
|
+
init(transport, features) {
|
|
41
|
+
return { pubsub: new PubSubModelImpl(transport, features) };
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/pubsub/index.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,gDAAgD;AAChD,8EAA8E;AAG9E,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAiB/C,8EAA8E;AAC9E,iBAAiB;AACjB,8EAA8E;AAE9E,MAAM,eAAe;IAEA;IACA;IAFnB,YACmB,SAAoB,EACpB,QAAyB;QADzB,cAAS,GAAT,SAAS,CAAW;QACpB,aAAQ,GAAR,QAAQ,CAAiB;IACzC,CAAC;IAEI,OAAO;QACb,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAAe,EAAE,OAAe;QAC5C,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,OAAO,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAS,+BAA+B,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC3G,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,OAAgB;QAC7B,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAS,4BAA4B,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAChG,CAAC;QACD,OAAO,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAS,0BAA0B,CAAC,CAAC,IAAI,EAAE,CAAC;IACnF,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,OAAe;QAC/B,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,OAAO,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAS,+BAA+B,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAClG,CAAC;CACF;AAED,8EAA8E;AAC9E,SAAS;AACT,8EAA8E;AAE9E,4CAA4C;AAC5C,MAAM,CAAC,MAAM,UAAU,GAA2C;IAChE,IAAI,EAAE,QAAQ;IACd,IAAI,CAAC,SAAoB,EAAE,QAAyB;QAClD,OAAO,EAAE,MAAM,EAAE,IAAI,eAAe,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,CAAC;IAC9D,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { NucleusPlugin, IsolationLevel } from '../types.js';
|
|
2
|
+
export interface SQLModel {
|
|
3
|
+
/** Query rows into typed results. */
|
|
4
|
+
query<T = Record<string, unknown>>(sql: string, ...params: unknown[]): Promise<T[]>;
|
|
5
|
+
/** Query exactly one row. Throws `NucleusNotFoundError` if none. */
|
|
6
|
+
queryOne<T = Record<string, unknown>>(sql: string, ...params: unknown[]): Promise<T>;
|
|
7
|
+
/** Query one row, or `null` if none. */
|
|
8
|
+
queryOneOrNull<T = Record<string, unknown>>(sql: string, ...params: unknown[]): Promise<T | null>;
|
|
9
|
+
/** Execute a DML statement and return the affected row count. */
|
|
10
|
+
execute(sql: string, ...params: unknown[]): Promise<number>;
|
|
11
|
+
/** Execute many statements in batch and return each affected-row count. */
|
|
12
|
+
executeBatch(statements: Array<{
|
|
13
|
+
sql: string;
|
|
14
|
+
params?: unknown[];
|
|
15
|
+
}>): Promise<number[]>;
|
|
16
|
+
/** Fetch a single scalar value from the first column of the first row. */
|
|
17
|
+
fetchval<T = unknown>(sql: string, ...params: unknown[]): Promise<T | null>;
|
|
18
|
+
/**
|
|
19
|
+
* Run `fn` inside a transaction. Commits on success, rolls back on error.
|
|
20
|
+
* The callback receives a scoped `SQLModel` whose operations all execute
|
|
21
|
+
* within the same transaction.
|
|
22
|
+
*/
|
|
23
|
+
transaction<T>(fn: (tx: SQLModel) => Promise<T>, opts?: {
|
|
24
|
+
isolationLevel?: IsolationLevel;
|
|
25
|
+
}): Promise<T>;
|
|
26
|
+
}
|
|
27
|
+
/** Plugin: adds `.sql` to the client. */
|
|
28
|
+
export declare const withSQL: NucleusPlugin<{
|
|
29
|
+
sql: SQLModel;
|
|
30
|
+
}>;
|
|
31
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sql/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAa,aAAa,EAAmB,cAAc,EAAE,MAAM,aAAa,CAAC;AAO7F,MAAM,WAAW,QAAQ;IACvB,qCAAqC;IACrC,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;IAEpF,oEAAoE;IACpE,QAAQ,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAErF,wCAAwC;IACxC,cAAc,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAElG,iEAAiE;IACjE,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAE5D,2EAA2E;IAC3E,YAAY,CAAC,UAAU,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAA;KAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAExF,0EAA0E;IAC1E,QAAQ,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAE5E;;;;OAIG;IACH,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE;QAAE,cAAc,CAAC,EAAE,cAAc,CAAA;KAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CAC1G;AAgED,yCAAyC;AACzC,eAAO,MAAM,OAAO,EAAE,aAAa,CAAC;IAAE,GAAG,EAAE,QAAQ,CAAA;CAAE,CAKpD,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// @neutron/nucleus/sql — SQL model plugin
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
import { NucleusNotFoundError } from '../errors.js';
|
|
5
|
+
// ---------------------------------------------------------------------------
|
|
6
|
+
// Implementation
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
class SQLModelImpl {
|
|
9
|
+
transport;
|
|
10
|
+
constructor(transport) {
|
|
11
|
+
this.transport = transport;
|
|
12
|
+
}
|
|
13
|
+
async query(sql, ...params) {
|
|
14
|
+
const result = await this.transport.query(sql, params);
|
|
15
|
+
return result.rows;
|
|
16
|
+
}
|
|
17
|
+
async queryOne(sql, ...params) {
|
|
18
|
+
const rows = await this.query(sql, ...params);
|
|
19
|
+
if (rows.length === 0) {
|
|
20
|
+
throw new NucleusNotFoundError('Expected one row but found none');
|
|
21
|
+
}
|
|
22
|
+
return rows[0];
|
|
23
|
+
}
|
|
24
|
+
async queryOneOrNull(sql, ...params) {
|
|
25
|
+
const rows = await this.query(sql, ...params);
|
|
26
|
+
return rows.length > 0 ? rows[0] : null;
|
|
27
|
+
}
|
|
28
|
+
async execute(sql, ...params) {
|
|
29
|
+
return this.transport.execute(sql, params);
|
|
30
|
+
}
|
|
31
|
+
async executeBatch(statements) {
|
|
32
|
+
const results = [];
|
|
33
|
+
for (const stmt of statements) {
|
|
34
|
+
results.push(await this.transport.execute(stmt.sql, stmt.params));
|
|
35
|
+
}
|
|
36
|
+
return results;
|
|
37
|
+
}
|
|
38
|
+
async fetchval(sql, ...params) {
|
|
39
|
+
return this.transport.fetchval(sql, params);
|
|
40
|
+
}
|
|
41
|
+
async transaction(fn, opts) {
|
|
42
|
+
const txTransport = await this.transport.beginTransaction(opts?.isolationLevel);
|
|
43
|
+
const txSql = new SQLModelImpl(txTransport);
|
|
44
|
+
try {
|
|
45
|
+
const result = await fn(txSql);
|
|
46
|
+
await txTransport.commit();
|
|
47
|
+
return result;
|
|
48
|
+
}
|
|
49
|
+
catch (err) {
|
|
50
|
+
await txTransport.rollback();
|
|
51
|
+
throw err;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
// ---------------------------------------------------------------------------
|
|
56
|
+
// Plugin
|
|
57
|
+
// ---------------------------------------------------------------------------
|
|
58
|
+
/** Plugin: adds `.sql` to the client. */
|
|
59
|
+
export const withSQL = {
|
|
60
|
+
name: 'sql',
|
|
61
|
+
init(transport, _features) {
|
|
62
|
+
return { sql: new SQLModelImpl(transport) };
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sql/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { NucleusPlugin } from '../types.js';
|
|
2
|
+
export interface StreamEntry {
|
|
3
|
+
id: string;
|
|
4
|
+
fields: Record<string, unknown>;
|
|
5
|
+
}
|
|
6
|
+
export interface StreamsModel {
|
|
7
|
+
/** Append an entry to a stream. Returns the generated entry ID. */
|
|
8
|
+
xadd(stream: string, fields: Record<string, unknown>): Promise<string>;
|
|
9
|
+
/** Return the number of entries in a stream. */
|
|
10
|
+
xlen(stream: string): Promise<number>;
|
|
11
|
+
/** Return entries between `startMs` and `endMs` timestamps (inclusive). */
|
|
12
|
+
xrange(stream: string, startMs: number, endMs: number, count: number): Promise<StreamEntry[]>;
|
|
13
|
+
/** Read new entries after `lastIdMs`. */
|
|
14
|
+
xread(stream: string, lastIdMs: number, count: number): Promise<StreamEntry[]>;
|
|
15
|
+
/** Create a consumer group on a stream. */
|
|
16
|
+
xgroupCreate(stream: string, group: string, startId: number): Promise<boolean>;
|
|
17
|
+
/** Read entries from a consumer group. */
|
|
18
|
+
xreadGroup(stream: string, group: string, consumer: string, count: number): Promise<StreamEntry[]>;
|
|
19
|
+
/** Acknowledge processing of an entry in a consumer group. */
|
|
20
|
+
xack(stream: string, group: string, idMs: number, idSeq: number): Promise<boolean>;
|
|
21
|
+
}
|
|
22
|
+
/** Plugin: adds `.streams` to the client. */
|
|
23
|
+
export declare const withStreams: NucleusPlugin<{
|
|
24
|
+
streams: StreamsModel;
|
|
25
|
+
}>;
|
|
26
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/streams/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAa,aAAa,EAAmB,MAAM,aAAa,CAAC;AAO7E,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAMD,MAAM,WAAW,YAAY;IAC3B,mEAAmE;IACnE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAEvE,gDAAgD;IAChD,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAEtC,2EAA2E;IAC3E,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAE9F,yCAAyC;IACzC,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAE/E,2CAA2C;IAC3C,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAE/E,0CAA0C;IAC1C,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAEnG,8DAA8D;IAC9D,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACpF;AAmFD,6CAA6C;AAC7C,eAAO,MAAM,WAAW,EAAE,aAAa,CAAC;IAAE,OAAO,EAAE,YAAY,CAAA;CAAE,CAKhE,CAAC"}
|