@owlmeans/redis-resource 0.1.18-rc.9 → 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/build/resource.js CHANGED
@@ -1,13 +1,22 @@
1
- import { MisshapedRecord, prepareListOptions, RecordExists, UnknownRecordError, UnsupportedArgumentError } from '@owlmeans/resource';
2
- import { DEFAULT_DB_ALIAS, DEFAULT_PAGE_SIZE } from './consts.js';
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 { prepareSubOptions } from './utils/options.js';
5
- import { createIdOfLength } from '@owlmeans/basic-ids';
6
- export const makeRedisResource = (alias, dbAlias = DEFAULT_DB_ALIAS, serviceAlias = DEFAULT_DB_ALIAS, makeCustomResource) => {
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 (or its string form) is seconds from now; a `Date` is the absolute instant to
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
- const resource = appendContextual(alias, {
25
- key: key => `${resource.db.prefix}:${key ?? '*'}`,
26
- get: async (id, field, opts) => {
27
- const record = await resource.load(id, field, opts);
28
- if (record == null) {
29
- throw new UnknownRecordError(id);
30
- }
31
- return record;
32
- },
33
- load: async (id, field, opts) => {
34
- if (typeof field === 'object') {
35
- opts = field;
36
- field = field.field;
37
- }
38
- if (opts != null) {
39
- throw new UnsupportedArgumentError('load:opts');
40
- }
41
- if (field === 'id' || field == null) {
42
- const val = await resource.db.client.get(resource.key(id));
43
- if (val == null) {
44
- return null;
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
- return JSON.parse(val);
47
- }
48
- const list = await resource.list({ [field]: id }, { pager: { size: 1 } });
49
- return list.items[0] ?? null;
50
- },
51
- save: async (record, opts) => {
52
- if (record.id == null) {
53
- throw new MisshapedRecord('id');
54
- }
55
- const existing = await resource.load(record.id);
56
- if (existing != null) {
57
- return resource.update(record, opts);
58
- }
59
- return resource.create(record, typeof opts !== 'string' ? opts : undefined);
60
- },
61
- update: async (record, opts) => {
62
- let field = 'id';
63
- if (typeof opts === 'string') {
64
- field = opts;
65
- }
66
- else if (typeof opts === 'object') {
67
- field = opts.field ?? field;
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
- if (field !== 'id' && record[field] == null) {
70
- throw new MisshapedRecord('no-field-value');
118
+ closed = true;
119
+ try {
120
+ await subscriber.punsubscribe(pattern);
121
+ await subscriber.quit();
71
122
  }
72
- const id = field == 'id' ? record.id : record[field];
73
- if (id == null) {
74
- throw new MisshapedRecord('id');
123
+ catch (e) {
124
+ log.error('Redis failed to unsubscribe', { resource: alias, pattern, error: e });
75
125
  }
76
- const _opts = typeof opts === 'object' ? opts : {};
77
- const existing = await resource.get(id, field);
78
- const updated = { ...existing, ...record };
79
- await resource.db.client.set(resource.key(id), JSON.stringify(updated));
80
- if (_opts.ttl != null) {
81
- await applyTtl(resource.key(id), _opts.ttl);
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 updated;
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
- if (record.id == null) {
87
- throw new UnknownRecordError('id');
88
- }
89
- if (await resource.load(record.id) != null) {
90
- throw new RecordExists(record.id);
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(resource.key(id), opts.ttl);
185
+ await applyTtl(key, opts.ttl);
96
186
  }
97
- return record;
187
+ return stored;
98
188
  },
99
- delete: async (id, opts) => {
100
- let record = null;
101
- if (typeof id === 'object') {
102
- if (id.id == null) {
103
- throw new MisshapedRecord('id');
104
- }
105
- record = await resource.load(id.id);
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.del(resource.key(id)) > 0) {
128
- return record;
199
+ if (await resource.db.client.exists(resource.key(record.id)) < 1) {
200
+ throw new UnknownRecordError(record.id);
129
201
  }
130
- return null;
202
+ return put(record.id, record, opts);
131
203
  },
132
- pick: async (id, opts) => {
133
- let record = null;
134
- if (typeof id === 'object') {
135
- if (id.id == null) {
136
- throw new MisshapedRecord('id');
137
- }
138
- record = await resource.load(id.id);
139
- }
140
- else {
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
- list: async (criteria, opts) => {
164
- const options = prepareListOptions(DEFAULT_PAGE_SIZE, criteria, opts);
165
- criteria = options.criteria;
166
- const pager = options.pager ?? {};
167
- const keys = await resource.db.client.keys(resource.key());
168
- pager.total = keys.length;
169
- pager.page = pager.page ?? 0;
170
- pager.size = pager.size ?? DEFAULT_PAGE_SIZE;
171
- if (keys.length === 0) {
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
- const start = pager.page * pager.size;
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
- subscribe: async (handler, opts) => {
181
- opts = prepareSubOptions(opts);
182
- let _unsubascribeCalled = false;
183
- const unsusbscibe = async () => {
184
- if (_unsubascribeCalled) {
185
- return;
186
- }
187
- _unsubascribeCalled = true;
188
- try {
189
- await subscriber.punsubscribe(resource.key(opts.key)).then(() => subscriber.quit());
190
- }
191
- catch (e) {
192
- console.error('Try to unsubscribe redis resource', e);
193
- }
194
- };
195
- const listener = (value) => {
196
- handler(value);
197
- if (opts.once === true) {
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 (record, key) => {
228
- await resource.db.client.publish(resource.key(key), JSON.stringify(record));
245
+ publish: async (value, channel) => {
246
+ await resource.db.client.publish(resource.key(channel), JSON.stringify(value));
229
247
  },
230
- stream: async (key, record) => {
231
- await resource.db.client.xadd(resource.key(key), 'MAXLEN', '~', 10000, '*', 'payload', JSON.stringify(record));
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, group, consumer = createIdOfLength(15)) {
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', 1000, 'STREAMS', streamKey, id);
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
- console.log('received', fields);
248
- yield JSON.parse(line);
280
+ yield JSON.parse(fields[1]);
249
281
  }
250
282
  catch (e) {
251
- console.error('Cannot parse redis stream entry', e);
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
- const _reclaim = async function* () {
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, 'junitor', 60000, '0-0', 'COUNT', 10);
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(line);
302
+ yield JSON.parse(fields[1]);
265
303
  }
266
304
  catch (e) {
267
- console.error('Cannot parse reclaimed redis stream entry', e);
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
- console.error('Error in redis stream consumer group', e);
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', 1000, 'STREAMS', streamKey, '>');
327
+ const resp = await resource.db.client.xreadgroup('GROUP', group, consumer, 'BLOCK', block, 'STREAMS', streamKey, '>');
282
328
  if (!resp) {
283
- yield* _reclaim();
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(line);
335
+ yield JSON.parse(fields[1]);
291
336
  await resource.db.client.xack(streamKey, group, entryId);
292
337
  }
293
338
  catch (e) {
294
- console.error('Cannot parse redis stream entry', e);
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 ?? dbAlias);
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
@@ -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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"}