@owlmeans/redis-resource 0.1.18-rc.2 → 0.1.18-rc.21
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 +182 -50
- package/agent-meta/manifest.json +2 -2
- package/agent-meta/skills/redis-resource/SKILL.md +96 -31
- package/build/consts.d.ts +20 -1
- package/build/consts.d.ts.map +1 -1
- package/build/consts.js +20 -1
- package/build/consts.js.map +1 -1
- package/build/resource.d.ts +11 -2
- package/build/resource.d.ts.map +1 -1
- package/build/resource.js +243 -217
- package/build/resource.js.map +1 -1
- package/build/types.d.ts +27 -12
- package/build/types.d.ts.map +1 -1
- package/package.json +5 -5
- package/src/consts.ts +27 -2
- package/src/resource.ts +289 -233
- package/src/types.ts +28 -18
- package/build/.gitkeep +0 -0
- package/build/utils/index.d.ts +0 -2
- package/build/utils/index.d.ts.map +0 -1
- package/build/utils/index.js +0 -2
- package/build/utils/index.js.map +0 -1
- package/build/utils/options.d.ts +0 -3
- package/build/utils/options.d.ts.map +0 -1
- package/build/utils/options.js +0 -17
- package/build/utils/options.js.map +0 -1
- package/src/utils/index.ts +0 -2
- package/src/utils/options.ts +0 -17
package/build/resource.js
CHANGED
|
@@ -1,13 +1,20 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { DEFAULT_DB_ALIAS,
|
|
1
|
+
import { applyQuery, filterRecords, firstMatch, matchCriteria, MisshapedRecord, RecordExists, UnknownRecordError, UnsupportedArgumentError } from '@owlmeans/resource';
|
|
2
|
+
import { CONSUMER_ID_LENGTH, DEFAULT_DB_ALIAS, DEFAULT_STREAM_BLOCK, READ_BATCH, RECLAIM_COUNT, RECLAIM_IDLE, SCAN_BATCH, STREAM_MAX_LENGTH } from './consts.js';
|
|
3
3
|
import { appendContextual, assertContext } from '@owlmeans/context';
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
import { createIdOfLength, uuid } from '@owlmeans/basic-ids';
|
|
5
|
+
/**
|
|
6
|
+
* A `Resource` over plain redis strings: one JSON document per namespaced key.
|
|
7
|
+
*
|
|
8
|
+
* Reads by id are O(1) GETs. Everything else — a criteria read, a listing, a count, a purge —
|
|
9
|
+
* walks this resource's OWN namespace with SCAN and evaluates the criteria in memory, because
|
|
10
|
+
* redis has no index to ask. That is affordable for a small namespaced set (a session cache, an
|
|
11
|
+
* adapter store) and wrong for anything unbounded or hot; a resource that needs real queries
|
|
12
|
+
* belongs in mongo or postgres.
|
|
13
|
+
*/
|
|
14
|
+
export const makeRedisResource = (alias, dbAlias = DEFAULT_DB_ALIAS, serviceAlias = DEFAULT_DB_ALIAS) => {
|
|
7
15
|
const location = `redis-resource:${alias}`;
|
|
8
16
|
/**
|
|
9
|
-
* A number
|
|
10
|
-
* expire at.
|
|
17
|
+
* A number is seconds from now; a `Date` is the absolute instant to expire at.
|
|
11
18
|
*
|
|
12
19
|
* The absolute form needs PEXPIREAT, not EXPIREAT: `Date.getTime()` is milliseconds while
|
|
13
20
|
* EXPIREAT reads its argument as seconds, so the timestamp landed tens of thousands of years
|
|
@@ -21,231 +28,254 @@ export const makeRedisResource = (alias, dbAlias = DEFAULT_DB_ALIAS, serviceAlia
|
|
|
21
28
|
await resource.db.client.expire(key, ttl);
|
|
22
29
|
}
|
|
23
30
|
};
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
31
|
+
/** Close a subscription once its lifetime runs out — seconds from now, or an instant. */
|
|
32
|
+
const armTtl = (close, ttl) => {
|
|
33
|
+
if (ttl == null) {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
setTimeout(() => void close(), ttl instanceof Date ? ttl.getTime() - Date.now() : ttl * 1000);
|
|
37
|
+
};
|
|
38
|
+
/** The record as it goes into redis: whatever was passed, under the id it is keyed by. */
|
|
39
|
+
const withId = (record, id) => ({ ...record, id });
|
|
40
|
+
/**
|
|
41
|
+
* Write the record under its key. SET both creates and replaces, which is what lets `save`
|
|
42
|
+
* upsert without reading first.
|
|
43
|
+
*/
|
|
44
|
+
const put = async (id, record, opts) => {
|
|
45
|
+
const key = resource.key(id);
|
|
46
|
+
const stored = withId(record, id);
|
|
47
|
+
await resource.db.client.set(key, JSON.stringify(stored));
|
|
48
|
+
if (opts?.ttl != null) {
|
|
49
|
+
await applyTtl(key, opts.ttl);
|
|
50
|
+
}
|
|
51
|
+
return stored;
|
|
52
|
+
};
|
|
53
|
+
/**
|
|
54
|
+
* Every key under this resource's prefix, collected with SCAN.
|
|
55
|
+
*
|
|
56
|
+
* Never KEYS: KEYS blocks the server for the length of the whole sweep, while SCAN walks the
|
|
57
|
+
* keyspace in bounded bites. SCAN may hand the same key back twice across iterations, which is
|
|
58
|
+
* why the keys land in a Set.
|
|
59
|
+
*/
|
|
60
|
+
const scanKeys = async () => {
|
|
61
|
+
const found = new Set();
|
|
62
|
+
let cursor = '0';
|
|
63
|
+
do {
|
|
64
|
+
const [next, batch] = await resource.db.client.scan(cursor, 'MATCH', resource.key(), 'COUNT', SCAN_BATCH);
|
|
65
|
+
cursor = next;
|
|
66
|
+
batch.forEach(key => found.add(key));
|
|
67
|
+
} while (cursor !== '0');
|
|
68
|
+
return [...found];
|
|
69
|
+
};
|
|
70
|
+
/**
|
|
71
|
+
* The namespace as key/record pairs, read in MGET batches.
|
|
72
|
+
*
|
|
73
|
+
* O(N) over the resource's own namespace — every criteria that is not a bare id is answered
|
|
74
|
+
* from this in memory. A key holding something other than a string, this resource's own streams
|
|
75
|
+
* included, reads back as `null` from MGET and is skipped.
|
|
76
|
+
*/
|
|
77
|
+
const readNamespace = async () => {
|
|
78
|
+
const keys = await scanKeys();
|
|
79
|
+
const entries = [];
|
|
80
|
+
for (let from = 0; from < keys.length; from += READ_BATCH) {
|
|
81
|
+
const batch = keys.slice(from, from + READ_BATCH);
|
|
82
|
+
const values = await resource.db.client.mget(batch);
|
|
83
|
+
values.forEach((value, index) => {
|
|
84
|
+
if (typeof value === 'string') {
|
|
85
|
+
entries.push([batch[index], JSON.parse(value)]);
|
|
45
86
|
}
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
return entries;
|
|
90
|
+
};
|
|
91
|
+
const readRecords = async () => (await readNamespace()).map(([, record]) => record);
|
|
92
|
+
/** `{ id: 'x' }` is the one criteria redis can answer by key; anything else needs the walk. */
|
|
93
|
+
const soleId = (where) => {
|
|
94
|
+
const keys = Object.keys(where);
|
|
95
|
+
return keys.length === 1 && keys[0] === 'id' && typeof where.id === 'string' ? where.id : null;
|
|
96
|
+
};
|
|
97
|
+
const loadOne = async (idOrWhere, opts) => {
|
|
98
|
+
const id = typeof idOrWhere === 'string' ? idOrWhere : soleId(idOrWhere);
|
|
99
|
+
if (id != null) {
|
|
100
|
+
const value = await resource.db.client.get(resource.key(id));
|
|
101
|
+
return value == null ? null : JSON.parse(value);
|
|
102
|
+
}
|
|
103
|
+
return firstMatch(await readRecords(), idOrWhere, opts);
|
|
104
|
+
};
|
|
105
|
+
/**
|
|
106
|
+
* One dedicated connection per subscription: a redis client in subscriber mode accepts nothing
|
|
107
|
+
* but (un)subscribe commands, so the resource's own client has to stay out of it.
|
|
108
|
+
*/
|
|
109
|
+
const listen = async (pattern, onMessage, opts) => {
|
|
110
|
+
const subscriber = resource.db.client.duplicate();
|
|
111
|
+
let closed = false;
|
|
112
|
+
const unsubscribe = async () => {
|
|
113
|
+
if (closed) {
|
|
114
|
+
return;
|
|
68
115
|
}
|
|
69
|
-
|
|
70
|
-
|
|
116
|
+
closed = true;
|
|
117
|
+
try {
|
|
118
|
+
await subscriber.punsubscribe(pattern);
|
|
119
|
+
await subscriber.quit();
|
|
71
120
|
}
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
throw new MisshapedRecord('id');
|
|
121
|
+
catch (e) {
|
|
122
|
+
console.error(`${location}: failed to unsubscribe ${pattern}`, e);
|
|
75
123
|
}
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
124
|
+
};
|
|
125
|
+
await subscriber.psubscribe(pattern);
|
|
126
|
+
subscriber.on('pmessage', (_pattern, channel, message) => {
|
|
127
|
+
/**
|
|
128
|
+
* `once` closes before the handler's own work finishes on purpose: the handler may await a
|
|
129
|
+
* read, and a second message arriving meanwhile would fire a subscription that has already
|
|
130
|
+
* delivered its one message.
|
|
131
|
+
*/
|
|
132
|
+
if (opts?.once === true) {
|
|
133
|
+
void unsubscribe();
|
|
134
|
+
}
|
|
135
|
+
onMessage(channel, message);
|
|
136
|
+
});
|
|
137
|
+
armTtl(unsubscribe, opts?.ttl);
|
|
138
|
+
return unsubscribe;
|
|
139
|
+
};
|
|
140
|
+
const resource = appendContextual(alias, {
|
|
141
|
+
key: (key) => `${resource.db.prefix}:${key ?? '*'}`,
|
|
142
|
+
/**
|
|
143
|
+
* @throws {UnknownRecordError}
|
|
144
|
+
*/
|
|
145
|
+
get: async (idOrWhere, opts) => {
|
|
146
|
+
const record = await loadOne(idOrWhere, opts);
|
|
147
|
+
if (record == null) {
|
|
148
|
+
throw new UnknownRecordError(typeof idOrWhere === 'string' ? idOrWhere : JSON.stringify(idOrWhere));
|
|
82
149
|
}
|
|
83
|
-
return
|
|
150
|
+
return record;
|
|
151
|
+
},
|
|
152
|
+
load: loadOne,
|
|
153
|
+
/**
|
|
154
|
+
* Unpaged by default: without a `size` every match comes back. A `page` on its own is a
|
|
155
|
+
* caller error rather than a window over an implied default — there is no default here to
|
|
156
|
+
* take a window of.
|
|
157
|
+
*
|
|
158
|
+
* @throws {UnsupportedArgumentError} on `page` without `size`.
|
|
159
|
+
*/
|
|
160
|
+
list: async (where, opts) => {
|
|
161
|
+
if (opts?.page != null && opts.size == null) {
|
|
162
|
+
throw new UnsupportedArgumentError('page-without-size');
|
|
163
|
+
}
|
|
164
|
+
return applyQuery(await readRecords(), where, opts);
|
|
84
165
|
},
|
|
166
|
+
count: async (where) => filterRecords(await readRecords(), where).length,
|
|
167
|
+
/**
|
|
168
|
+
* SET NX rather than a read followed by a write: two callers racing for the same id both saw
|
|
169
|
+
* an empty key, both "created" the record, and the loser's write silently won.
|
|
170
|
+
*
|
|
171
|
+
* A record with no id gets one — redis needs a key, and `save` relies on this to create.
|
|
172
|
+
*
|
|
173
|
+
* @throws {RecordExists}
|
|
174
|
+
*/
|
|
85
175
|
create: async (record, opts) => {
|
|
86
|
-
|
|
87
|
-
|
|
176
|
+
const id = record.id ?? uuid();
|
|
177
|
+
const key = resource.key(id);
|
|
178
|
+
const stored = withId(record, id);
|
|
179
|
+
if (await resource.db.client.set(key, JSON.stringify(stored), 'NX') == null) {
|
|
180
|
+
throw new RecordExists(id);
|
|
88
181
|
}
|
|
89
|
-
if (await resource.load(record.id) != null) {
|
|
90
|
-
throw new RecordExists(record.id);
|
|
91
|
-
}
|
|
92
|
-
const id = record.id;
|
|
93
|
-
await resource.db.client.set(resource.key(id), JSON.stringify(record));
|
|
94
182
|
if (opts?.ttl != null) {
|
|
95
|
-
await applyTtl(
|
|
183
|
+
await applyTtl(key, opts.ttl);
|
|
96
184
|
}
|
|
97
|
-
return
|
|
185
|
+
return stored;
|
|
98
186
|
},
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
else {
|
|
108
|
-
// `opts` is optional in the contract: without this branch `delete(id)` — the plain,
|
|
109
|
-
// by-id form every caller uses — left `record` null and returned without touching redis.
|
|
110
|
-
record = await resource.load(id, opts);
|
|
111
|
-
}
|
|
112
|
-
if (record == null) {
|
|
113
|
-
return null;
|
|
114
|
-
}
|
|
115
|
-
let field = 'id';
|
|
116
|
-
if (typeof opts === 'string') {
|
|
117
|
-
field = opts;
|
|
118
|
-
opts = undefined;
|
|
119
|
-
}
|
|
120
|
-
else if (typeof opts === 'object') {
|
|
121
|
-
field = opts.field ?? field;
|
|
122
|
-
}
|
|
123
|
-
id = record.id ?? '';
|
|
124
|
-
if (id === '') {
|
|
187
|
+
/**
|
|
188
|
+
* Replaces the whole record: what is stored afterwards is exactly what was passed, not a
|
|
189
|
+
* merge over what was there. A renewal has to pass its TTL again — SET drops the old expiry.
|
|
190
|
+
*
|
|
191
|
+
* @throws {MisshapedRecord} without an id, {@link UnknownRecordError} when the id is absent.
|
|
192
|
+
*/
|
|
193
|
+
update: async (record, opts) => {
|
|
194
|
+
if (record.id == null) {
|
|
125
195
|
throw new MisshapedRecord('id');
|
|
126
196
|
}
|
|
127
|
-
if (await resource.db.client.
|
|
128
|
-
|
|
197
|
+
if (await resource.db.client.exists(resource.key(record.id)) < 1) {
|
|
198
|
+
throw new UnknownRecordError(record.id);
|
|
129
199
|
}
|
|
130
|
-
return
|
|
200
|
+
return put(record.id, record, opts);
|
|
131
201
|
},
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
record = await resource.load(id, opts);
|
|
142
|
-
}
|
|
143
|
-
if (record == null) {
|
|
144
|
-
return null;
|
|
145
|
-
}
|
|
146
|
-
let field = 'id';
|
|
147
|
-
if (typeof opts === 'string') {
|
|
148
|
-
field = opts;
|
|
149
|
-
opts = undefined;
|
|
150
|
-
}
|
|
151
|
-
else if (typeof opts === 'object') {
|
|
152
|
-
field = opts.field ?? field;
|
|
153
|
-
}
|
|
154
|
-
id = record.id ?? '';
|
|
155
|
-
if (id === '') {
|
|
156
|
-
throw new MisshapedRecord('id');
|
|
157
|
-
}
|
|
158
|
-
if (await resource.db.client.del(resource.key(id)) > 0) {
|
|
159
|
-
return record;
|
|
160
|
-
}
|
|
161
|
-
throw new UnknownRecordError(id);
|
|
202
|
+
/** Creates when the record carries no id, replaces otherwise — SET does both. */
|
|
203
|
+
save: async (record, opts) => record.id == null ? resource.create(record, opts) : put(record.id, record, opts),
|
|
204
|
+
/**
|
|
205
|
+
* GETDEL — reading the record and dropping the key in one command, so two callers cannot both
|
|
206
|
+
* be handed the same record. Needs redis 6.2 or newer.
|
|
207
|
+
*/
|
|
208
|
+
delete: async (id) => {
|
|
209
|
+
const value = await resource.db.client.getdel(resource.key(id));
|
|
210
|
+
return value == null ? null : JSON.parse(value);
|
|
162
211
|
},
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
return { items: [], pager };
|
|
212
|
+
/**
|
|
213
|
+
* Delete-and-return where absence is an error — the consume-once read.
|
|
214
|
+
*
|
|
215
|
+
* @throws {UnknownRecordError}
|
|
216
|
+
*/
|
|
217
|
+
take: async (id) => {
|
|
218
|
+
const record = await resource.delete(id);
|
|
219
|
+
if (record == null) {
|
|
220
|
+
throw new UnknownRecordError(id);
|
|
173
221
|
}
|
|
174
|
-
|
|
175
|
-
const slice = keys.toSpliced(start, pager.size);
|
|
176
|
-
return {
|
|
177
|
-
pager, items: (await Promise.all(slice.map(async (key) => await resource.db.client.get(key)))).filter(val => typeof val === 'string').map(val => JSON.parse(val))
|
|
178
|
-
};
|
|
222
|
+
return record;
|
|
179
223
|
},
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
void unsusbscibe();
|
|
199
|
-
}
|
|
200
|
-
};
|
|
201
|
-
const subscriber = resource.db.client.duplicate();
|
|
202
|
-
if (opts.key != null && null != await resource.load(opts.key)) {
|
|
203
|
-
await subscriber.psubscribe(`__keyspace@0__:${resource.key(opts.key)}`);
|
|
204
|
-
subscriber.on('pmessage', async (_, channel) => {
|
|
205
|
-
const [, , ...key] = channel.split(':');
|
|
206
|
-
const record = await resource.load(key.join(':'));
|
|
207
|
-
listener(record ?? { id: key, __null: true });
|
|
208
|
-
});
|
|
209
|
-
}
|
|
210
|
-
else {
|
|
211
|
-
await subscriber.psubscribe(resource.key(opts.key));
|
|
212
|
-
subscriber.on('pmessage', (_, __, message) => listener(JSON.parse(message)));
|
|
213
|
-
}
|
|
214
|
-
if (opts.ttl != null) {
|
|
215
|
-
const ttl = opts.ttl instanceof Date
|
|
216
|
-
? opts.ttl.getTime() - Date.now()
|
|
217
|
-
: typeof opts.ttl === 'number'
|
|
218
|
-
? opts.ttl * 1000
|
|
219
|
-
: null;
|
|
220
|
-
if (ttl == null) {
|
|
221
|
-
throw new UnsupportedArgumentError(`subscribe:ttl:${typeof opts.ttl}`);
|
|
222
|
-
}
|
|
223
|
-
setTimeout(unsusbscibe, ttl);
|
|
224
|
-
}
|
|
225
|
-
return unsusbscibe;
|
|
224
|
+
/**
|
|
225
|
+
* Bulk delete over the namespace walk. An empty criteria object is refused: wiping a whole
|
|
226
|
+
* namespace is what FLUSHDB is for, not something a filter that came back empty should do.
|
|
227
|
+
*
|
|
228
|
+
* @throws {UnsupportedArgumentError} on empty criteria.
|
|
229
|
+
*/
|
|
230
|
+
purge: async (where) => {
|
|
231
|
+
if (where == null || Object.keys(where).length < 1) {
|
|
232
|
+
throw new UnsupportedArgumentError('purge:empty-criteria');
|
|
233
|
+
}
|
|
234
|
+
const keys = (await readNamespace())
|
|
235
|
+
.filter(([, record]) => matchCriteria(record, where))
|
|
236
|
+
.map(([key]) => key);
|
|
237
|
+
let deleted = 0;
|
|
238
|
+
for (let from = 0; from < keys.length; from += READ_BATCH) {
|
|
239
|
+
deleted += await resource.db.client.del(keys.slice(from, from + READ_BATCH));
|
|
240
|
+
}
|
|
241
|
+
return deleted;
|
|
226
242
|
},
|
|
227
|
-
publish: async (
|
|
228
|
-
await resource.db.client.publish(resource.key(
|
|
243
|
+
publish: async (value, channel) => {
|
|
244
|
+
await resource.db.client.publish(resource.key(channel), JSON.stringify(value));
|
|
229
245
|
},
|
|
230
|
-
|
|
231
|
-
|
|
246
|
+
/**
|
|
247
|
+
* Channel pub/sub. The channel name is namespaced like a key, and an omitted channel listens
|
|
248
|
+
* to the resource's whole namespace — `key()` yields the glob that PSUBSCRIBE matches on.
|
|
249
|
+
*/
|
|
250
|
+
subscribe: async (handler, opts) => listen(resource.key(opts?.channel), (_channel, message) => void handler(JSON.parse(message)), opts),
|
|
251
|
+
/**
|
|
252
|
+
* Keyspace notifications for ONE record: every write, expiry or delete on its key hands the
|
|
253
|
+
* handler the current value, or `null` once the key is gone.
|
|
254
|
+
*
|
|
255
|
+
* Keyspace events are published per database and this listens on db 0, so deployments sharing
|
|
256
|
+
* one instance isolate on the key prefix, never on the db index. The server also has to have
|
|
257
|
+
* `notify-keyspace-events` enabled — redis emits nothing otherwise.
|
|
258
|
+
*/
|
|
259
|
+
watch: async (id, handler, opts) => listen(`__keyspace@0__:${resource.key(id)}`, () => void loadOne(id).then(record => handler(record)), opts),
|
|
260
|
+
stream: async (key, value) => {
|
|
261
|
+
await resource.db.client.xadd(resource.key(key), 'MAXLEN', '~', STREAM_MAX_LENGTH, '*', 'payload', JSON.stringify(value));
|
|
232
262
|
},
|
|
233
|
-
consume: async function* (key,
|
|
234
|
-
console.log(`Establish redis stream consumer: ${group ?? 'no-group'}:${consumer} for ${key}`);
|
|
263
|
+
consume: async function* (key, opts) {
|
|
235
264
|
const streamKey = resource.key(key);
|
|
265
|
+
const group = opts?.group;
|
|
266
|
+
const consumer = opts?.consumer ?? createIdOfLength(CONSUMER_ID_LENGTH);
|
|
267
|
+
const block = opts?.block ?? DEFAULT_STREAM_BLOCK;
|
|
236
268
|
if (group == null) {
|
|
237
269
|
let id = '$';
|
|
238
270
|
do {
|
|
239
|
-
const resp = await resource.db.client.xread('BLOCK',
|
|
271
|
+
const resp = await resource.db.client.xread('BLOCK', block, 'STREAMS', streamKey, id);
|
|
240
272
|
if (!resp)
|
|
241
273
|
continue;
|
|
242
274
|
const [, entries] = resp[0];
|
|
243
275
|
for (const [entryId, fields] of entries) {
|
|
244
276
|
id = entryId;
|
|
245
|
-
const line = fields[1];
|
|
246
277
|
try {
|
|
247
|
-
|
|
248
|
-
yield JSON.parse(line);
|
|
278
|
+
yield JSON.parse(fields[1]);
|
|
249
279
|
}
|
|
250
280
|
catch (e) {
|
|
251
281
|
console.error('Cannot parse redis stream entry', e);
|
|
@@ -254,14 +284,17 @@ export const makeRedisResource = (alias, dbAlias = DEFAULT_DB_ALIAS, serviceAlia
|
|
|
254
284
|
} while (true);
|
|
255
285
|
}
|
|
256
286
|
else {
|
|
257
|
-
|
|
287
|
+
/**
|
|
288
|
+
* Entries a consumer took and never acknowledged, claimed under THIS consumer's name.
|
|
289
|
+
* Claiming them for a fixed name instead left them owned by a consumer that never reads,
|
|
290
|
+
* so a crashed worker's entries moved once and then stalled for good.
|
|
291
|
+
*/
|
|
292
|
+
const reclaim = async function* () {
|
|
258
293
|
try {
|
|
259
|
-
const [, entries] = await resource.db.client.xautoclaim(streamKey, group,
|
|
294
|
+
const [, entries] = await resource.db.client.xautoclaim(streamKey, group, consumer, RECLAIM_IDLE, '0-0', 'COUNT', RECLAIM_COUNT);
|
|
260
295
|
for (const [id, fields] of entries) {
|
|
261
|
-
console.log('Reclaimed', id);
|
|
262
|
-
const line = fields[1];
|
|
263
296
|
try {
|
|
264
|
-
yield JSON.parse(
|
|
297
|
+
yield JSON.parse(fields[1]);
|
|
265
298
|
}
|
|
266
299
|
catch (e) {
|
|
267
300
|
console.error('Cannot parse reclaimed redis stream entry', e);
|
|
@@ -278,16 +311,15 @@ export const makeRedisResource = (alias, dbAlias = DEFAULT_DB_ALIAS, serviceAlia
|
|
|
278
311
|
console.error('Error in redis stream consumer group', e);
|
|
279
312
|
}
|
|
280
313
|
do {
|
|
281
|
-
const resp = await resource.db.client.xreadgroup('GROUP', group, consumer, 'BLOCK',
|
|
314
|
+
const resp = await resource.db.client.xreadgroup('GROUP', group, consumer, 'BLOCK', block, 'STREAMS', streamKey, '>');
|
|
282
315
|
if (!resp) {
|
|
283
|
-
yield*
|
|
316
|
+
yield* reclaim();
|
|
284
317
|
continue;
|
|
285
318
|
}
|
|
286
319
|
const [, entries] = resp[0];
|
|
287
320
|
for (const [entryId, fields] of entries) {
|
|
288
|
-
const line = fields[1];
|
|
289
321
|
try {
|
|
290
|
-
yield JSON.parse(
|
|
322
|
+
yield JSON.parse(fields[1]);
|
|
291
323
|
await resource.db.client.xack(streamKey, group, entryId);
|
|
292
324
|
}
|
|
293
325
|
catch (e) {
|
|
@@ -300,7 +332,7 @@ export const makeRedisResource = (alias, dbAlias = DEFAULT_DB_ALIAS, serviceAlia
|
|
|
300
332
|
});
|
|
301
333
|
resource.init = async () => {
|
|
302
334
|
const context = assertContext(resource.ctx, location);
|
|
303
|
-
const redis = context.service(serviceAlias
|
|
335
|
+
const redis = context.service(serviceAlias);
|
|
304
336
|
await redis.ready();
|
|
305
337
|
const db = await redis.db(dbAlias);
|
|
306
338
|
const _pref = (val) => val.replaceAll(/\W+/g, '_');
|
|
@@ -309,12 +341,6 @@ export const makeRedisResource = (alias, dbAlias = DEFAULT_DB_ALIAS, serviceAlia
|
|
|
309
341
|
prefix: `${_pref(db.prefix)}-${_pref(resource.name ?? alias)}`
|
|
310
342
|
};
|
|
311
343
|
};
|
|
312
|
-
resource.reinitializeContext = (context) => {
|
|
313
|
-
const resource = (makeCustomResource?.(dbAlias, serviceAlias)
|
|
314
|
-
?? makeRedisResource(alias, dbAlias, serviceAlias));
|
|
315
|
-
resource.ctx = context;
|
|
316
|
-
return resource;
|
|
317
|
-
};
|
|
318
344
|
return resource;
|
|
319
345
|
};
|
|
320
346
|
//# sourceMappingURL=resource.js.map
|
package/build/resource.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resource.js","sourceRoot":"","sources":["../src/resource.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"resource.js","sourceRoot":"","sources":["../src/resource.ts"],"names":[],"mappings":"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"}
|