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