@owlmeans/redis-resource 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.
@@ -0,0 +1,241 @@
1
+ import { MisshapedRecord, prepareListOptions, RecordExists, UnknownRecordError, UnsupportedArgumentError } from '@owlmeans/resource';
2
+ import { DEFAULT_DB_ALIAS, DEFAULT_PAGE_SIZE } from './consts.js';
3
+ import { appendContextual, assertContext } from '@owlmeans/context';
4
+ import { prepareSubOptions } from './utils/options.js';
5
+ export const makeRedisResource = (alias, dbAlias = DEFAULT_DB_ALIAS, serviceAlias = DEFAULT_DB_ALIAS, makeCustomResource) => {
6
+ const location = `redis-resource:${alias}`;
7
+ const resource = appendContextual(alias, {
8
+ key: key => `${resource.db.prefix}:${key ?? '*'}`,
9
+ get: async (id, field, opts) => {
10
+ const record = await resource.load(id, field, opts);
11
+ if (record == null) {
12
+ throw new UnknownRecordError(id);
13
+ }
14
+ return record;
15
+ },
16
+ load: async (id, field, opts) => {
17
+ if (typeof field === 'object') {
18
+ opts = field;
19
+ field = field.field;
20
+ }
21
+ if (opts != null) {
22
+ throw new UnsupportedArgumentError('load:opts');
23
+ }
24
+ if (field === 'id' || field == null) {
25
+ const val = await resource.db.client.get(resource.key(id));
26
+ if (val == null) {
27
+ return null;
28
+ }
29
+ return JSON.parse(val);
30
+ }
31
+ const list = await resource.list({ [field]: id }, { pager: { size: 1 } });
32
+ return list.items[0] ?? null;
33
+ },
34
+ save: async (record, opts) => {
35
+ if (record.id == null) {
36
+ throw new MisshapedRecord('id');
37
+ }
38
+ const existing = await resource.load(record.id);
39
+ if (existing != null) {
40
+ return resource.update(record, opts);
41
+ }
42
+ return resource.create(record, typeof opts !== 'string' ? opts : undefined);
43
+ },
44
+ update: async (record, opts) => {
45
+ let field = 'id';
46
+ if (typeof opts === 'string') {
47
+ field = opts;
48
+ }
49
+ else if (typeof opts === 'object') {
50
+ field = opts.field ?? field;
51
+ }
52
+ if (field !== 'id' && record[field] == null) {
53
+ throw new MisshapedRecord('no-field-value');
54
+ }
55
+ const id = field == 'id' ? record.id : record[field];
56
+ if (id == null) {
57
+ throw new MisshapedRecord('id');
58
+ }
59
+ const _opts = typeof opts === 'object' ? opts : {};
60
+ const existing = await resource.get(id, field);
61
+ const updated = { ...existing, ...record };
62
+ await resource.db.client.set(resource.key(id), JSON.stringify(updated));
63
+ if (_opts.ttl != null) {
64
+ if (_opts.ttl instanceof Date) {
65
+ await resource.db.client.expireat(resource.key(id), _opts.ttl.getTime());
66
+ }
67
+ else {
68
+ await resource.db.client.expire(resource.key(id), _opts.ttl);
69
+ }
70
+ }
71
+ return updated;
72
+ },
73
+ create: async (record, opts) => {
74
+ if (record.id == null) {
75
+ throw new UnknownRecordError('id');
76
+ }
77
+ if (await resource.load(record.id) != null) {
78
+ throw new RecordExists(record.id);
79
+ }
80
+ const id = record.id;
81
+ await resource.db.client.set(resource.key(id), JSON.stringify(record));
82
+ if (opts?.ttl != null) {
83
+ if (opts.ttl instanceof Date) {
84
+ await resource.db.client.expireat(resource.key(id), opts.ttl.getTime());
85
+ }
86
+ else {
87
+ await resource.db.client.expire(resource.key(id), opts.ttl);
88
+ }
89
+ }
90
+ return record;
91
+ },
92
+ delete: async (id, opts) => {
93
+ let record = null;
94
+ if (typeof id === 'object') {
95
+ if (id.id == null) {
96
+ throw new MisshapedRecord('id');
97
+ }
98
+ record = await resource.load(id.id);
99
+ }
100
+ else if (typeof opts === 'string') {
101
+ record = await resource.load(id, opts);
102
+ }
103
+ if (record == null) {
104
+ return null;
105
+ }
106
+ let field = 'id';
107
+ if (typeof opts === 'string') {
108
+ field = opts;
109
+ opts = undefined;
110
+ }
111
+ else if (typeof opts === 'object') {
112
+ field = opts.field ?? field;
113
+ }
114
+ id = record.id ?? '';
115
+ if (id === '') {
116
+ throw new MisshapedRecord('id');
117
+ }
118
+ if (await resource.db.client.del(resource.key(id)) > 0) {
119
+ return record;
120
+ }
121
+ return null;
122
+ },
123
+ pick: async (id, opts) => {
124
+ let record = null;
125
+ if (typeof id === 'object') {
126
+ if (id.id == null) {
127
+ throw new MisshapedRecord('id');
128
+ }
129
+ record = await resource.load(id.id);
130
+ }
131
+ else {
132
+ record = await resource.load(id, opts);
133
+ }
134
+ if (record == null) {
135
+ return null;
136
+ }
137
+ let field = 'id';
138
+ if (typeof opts === 'string') {
139
+ field = opts;
140
+ opts = undefined;
141
+ }
142
+ else if (typeof opts === 'object') {
143
+ field = opts.field ?? field;
144
+ }
145
+ id = record.id ?? '';
146
+ if (id === '') {
147
+ throw new MisshapedRecord('id');
148
+ }
149
+ if (await resource.db.client.del(resource.key(id)) > 0) {
150
+ return record;
151
+ }
152
+ throw new UnknownRecordError(id);
153
+ },
154
+ list: async (criteria, opts) => {
155
+ const options = prepareListOptions(DEFAULT_PAGE_SIZE, criteria, opts);
156
+ criteria = options.criteria;
157
+ const pager = options.pager ?? {};
158
+ const keys = await resource.db.client.keys(resource.key());
159
+ pager.total = keys.length;
160
+ pager.page = pager.page ?? 0;
161
+ pager.size = pager.size ?? DEFAULT_PAGE_SIZE;
162
+ if (keys.length === 0) {
163
+ return { items: [], pager };
164
+ }
165
+ const start = pager.page * pager.size;
166
+ const slice = keys.toSpliced(start, pager.size);
167
+ return {
168
+ 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))
169
+ };
170
+ },
171
+ subscribe: async (handler, opts) => {
172
+ opts = prepareSubOptions(opts);
173
+ let _unsubascribeCalled = false;
174
+ const unsusbscibe = async () => {
175
+ if (_unsubascribeCalled) {
176
+ return;
177
+ }
178
+ _unsubascribeCalled = true;
179
+ try {
180
+ await subscriber.punsubscribe(resource.key(opts.key)).then(() => subscriber.quit());
181
+ }
182
+ catch (e) {
183
+ console.error('Try to unsubscribe redis resource', e);
184
+ }
185
+ };
186
+ const listener = (value) => {
187
+ handler(value);
188
+ if (opts.once === true) {
189
+ void unsusbscibe();
190
+ }
191
+ };
192
+ const subscriber = resource.db.client.duplicate();
193
+ if (opts.key != null && null != await resource.load(opts.key)) {
194
+ await subscriber.psubscribe(`__keyspace@0__:${resource.key(opts.key)}`);
195
+ subscriber.on('pmessage', async (_, channel) => {
196
+ const [, , ...key] = channel.split(':');
197
+ const record = await resource.load(key.join(':'));
198
+ listener(record ?? { id: key, __null: true });
199
+ });
200
+ }
201
+ else {
202
+ await subscriber.psubscribe(resource.key(opts.key));
203
+ subscriber.on('pmessage', (_, __, message) => listener(JSON.parse(message)));
204
+ }
205
+ if (opts.ttl != null) {
206
+ const ttl = opts.ttl instanceof Date
207
+ ? opts.ttl.getTime() - Date.now()
208
+ : typeof opts.ttl === 'number'
209
+ ? opts.ttl * 1000
210
+ : null;
211
+ if (ttl == null) {
212
+ throw new UnsupportedArgumentError(`subscribe:ttl:${typeof opts.ttl}`);
213
+ }
214
+ setTimeout(unsusbscibe, ttl);
215
+ }
216
+ return unsusbscibe;
217
+ },
218
+ publish: async (record, key) => {
219
+ await resource.db.client.publish(resource.key(key), JSON.stringify(record));
220
+ }
221
+ });
222
+ resource.init = async () => {
223
+ const context = assertContext(resource.ctx, location);
224
+ const redis = context.service(serviceAlias ?? dbAlias);
225
+ await redis.ready();
226
+ const db = await redis.db(dbAlias);
227
+ const _pref = (val) => val.replaceAll(/\W+/g, '_');
228
+ resource.db = {
229
+ client: db.client,
230
+ prefix: `${_pref(db.prefix)}-${_pref(resource.name ?? alias)}`
231
+ };
232
+ };
233
+ resource.reinitializeContext = (context) => {
234
+ const resource = (makeCustomResource?.(dbAlias, serviceAlias)
235
+ ?? makeRedisResource(alias, dbAlias, serviceAlias));
236
+ resource.ctx = context;
237
+ return resource;
238
+ };
239
+ return resource;
240
+ };
241
+ //# sourceMappingURL=resource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource.js","sourceRoot":"","sources":["../src/resource.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,YAAY,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAA;AAGpI,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AACjE,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAEnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AAKtD,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAG/B,KAAa,EAAE,OAAO,GAAG,gBAAgB,EAAE,YAAY,GAAG,gBAAgB,EAC1E,kBAAwC,EACrC,EAAE;IACL,MAAM,QAAQ,GAAG,kBAAkB,KAAK,EAAE,CAAA;IAE1C,MAAM,QAAQ,GAAM,gBAAgB,CAAI,KAAK,EAAE;QAC7C,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAE;QAEjD,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YAC7B,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,CAAA;YACnD,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;gBACnB,MAAM,IAAI,kBAAkB,CAAC,EAAE,CAAC,CAAA;YAClC,CAAC;YAED,OAAO,MAAM,CAAA;QACf,CAAC;QAED,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YAC9B,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC9B,IAAI,GAAG,KAAK,CAAA;gBACZ,KAAK,GAAG,KAAK,CAAC,KAAK,CAAA;YACrB,CAAC;YACD,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;gBACjB,MAAM,IAAI,wBAAwB,CAAC,WAAW,CAAC,CAAA;YACjD,CAAC;YACD,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;gBACpC,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAA;gBAC1D,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;oBAChB,OAAO,IAAI,CAAA;gBACb,CAAC;gBAED,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;YACxB,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;YAEzE,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAA;QAC9B,CAAC;QAED,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;YAC3B,IAAI,MAAM,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC;gBACtB,MAAM,IAAI,eAAe,CAAC,IAAI,CAAC,CAAA;YACjC,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;YAC/C,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;gBACrB,OAAO,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;YACtC,CAAC;YAED,OAAO,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;QAC7E,CAAC;QAED,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;YAC7B,IAAI,KAAK,GAAG,IAAI,CAAA;YAChB,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC7B,KAAK,GAAG,IAAI,CAAA;YACd,CAAC;iBAAM,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACpC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,KAAK,CAAA;YAC7B,CAAC;YACD,IAAI,KAAK,KAAK,IAAI,IAAI,MAAM,CAAC,KAA4B,CAAC,IAAI,IAAI,EAAE,CAAC;gBACnE,MAAM,IAAI,eAAe,CAAC,gBAAgB,CAAC,CAAA;YAC7C,CAAC;YACD,MAAM,EAAE,GAAG,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAA4B,CAAW,CAAA;YACrF,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC;gBACf,MAAM,IAAI,eAAe,CAAC,IAAI,CAAC,CAAA;YACjC,CAAC;YACD,MAAM,KAAK,GAAG,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAA;YAClD,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAA;YAC9C,MAAM,OAAO,GAAG,EAAE,GAAG,QAAQ,EAAE,GAAG,MAAM,EAAE,CAAA;YAC1C,MAAM,QAAQ,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAA;YACvE,IAAI,KAAK,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC;gBACtB,IAAI,KAAK,CAAC,GAAG,YAAY,IAAI,EAAE,CAAC;oBAC9B,MAAM,QAAQ,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAA;gBAC1E,CAAC;qBAAM,CAAC;oBACN,MAAM,QAAQ,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAA;gBAC9D,CAAC;YACH,CAAC;YAED,OAAO,OAAO,CAAA;QAChB,CAAC;QAED,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;YAC7B,IAAI,MAAM,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC;gBACtB,MAAM,IAAI,kBAAkB,CAAC,IAAI,CAAC,CAAA;YACpC,CAAC;YACD,IAAI,MAAM,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC;gBAC3C,MAAM,IAAI,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;YACnC,CAAC;YAED,MAAM,EAAE,GAAG,MAAM,CAAC,EAAE,CAAA;YACpB,MAAM,QAAQ,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAA;YACtE,IAAI,IAAI,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC;gBACtB,IAAI,IAAI,CAAC,GAAG,YAAY,IAAI,EAAE,CAAC;oBAC7B,MAAM,QAAQ,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAA;gBACzE,CAAC;qBAAM,CAAC;oBACN,MAAM,QAAQ,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAA;gBAC7D,CAAC;YACH,CAAC;YAED,OAAO,MAAM,CAAA;QACf,CAAC;QAED,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE;YACzB,IAAI,MAAM,GAAa,IAAI,CAAA;YAC3B,IAAI,OAAO,EAAE,KAAK,QAAQ,EAAE,CAAC;gBAC3B,IAAI,EAAE,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC;oBAClB,MAAM,IAAI,eAAe,CAAC,IAAI,CAAC,CAAA;gBACjC,CAAC;gBACD,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;YACrC,CAAC;iBAAM,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACpC,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAA;YACxC,CAAC;YAED,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;gBACnB,OAAO,IAAI,CAAA;YACb,CAAC;YAED,IAAI,KAAK,GAAG,IAAI,CAAA;YAChB,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC7B,KAAK,GAAG,IAAI,CAAA;gBACZ,IAAI,GAAG,SAAS,CAAA;YAClB,CAAC;iBAAM,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACpC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,KAAK,CAAA;YAC7B,CAAC;YAED,EAAE,GAAG,MAAM,CAAC,EAAE,IAAI,EAAE,CAAA;YAEpB,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;gBACd,MAAM,IAAI,eAAe,CAAC,IAAI,CAAC,CAAA;YACjC,CAAC;YAED,IAAI,MAAM,QAAQ,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;gBACvD,OAAO,MAAM,CAAA;YACf,CAAC;YAED,OAAO,IAAI,CAAA;QACb,CAAC;QAED,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE;YACvB,IAAI,MAAM,GAAa,IAAI,CAAA;YAC3B,IAAI,OAAO,EAAE,KAAK,QAAQ,EAAE,CAAC;gBAC3B,IAAI,EAAE,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC;oBAClB,MAAM,IAAI,eAAe,CAAC,IAAI,CAAC,CAAA;gBACjC,CAAC;gBACD,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;YACrC,CAAC;iBAAM,CAAC;gBACN,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAA;YACxC,CAAC;YAED,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;gBACnB,OAAO,IAAI,CAAA;YACb,CAAC;YAED,IAAI,KAAK,GAAG,IAAI,CAAA;YAChB,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC7B,KAAK,GAAG,IAAI,CAAA;gBACZ,IAAI,GAAG,SAAS,CAAA;YAClB,CAAC;iBAAM,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACpC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,KAAK,CAAA;YAC7B,CAAC;YAED,EAAE,GAAG,MAAM,CAAC,EAAE,IAAI,EAAE,CAAA;YAEpB,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;gBACd,MAAM,IAAI,eAAe,CAAC,IAAI,CAAC,CAAA;YACjC,CAAC;YAED,IAAI,MAAM,QAAQ,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;gBACvD,OAAO,MAAM,CAAA;YACf,CAAC;YAED,MAAM,IAAI,kBAAkB,CAAC,EAAE,CAAC,CAAA;QAClC,CAAC;QAED,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE;YAC7B,MAAM,OAAO,GAAG,kBAAkB,CAAC,iBAAiB,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAA;YACrE,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAA;YAC3B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,EAAE,CAAA;YAEjC,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAA;YAC1D,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAA;YACzB,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,CAAC,CAAA;YAC5B,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,iBAAiB,CAAA;YAE5C,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACtB,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,CAAA;YAC7B,CAAC;YAED,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAA;YACrC,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,CAAA;YAE/C,OAAO;gBACL,KAAK,EAAE,KAAK,EAAE,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CACxC,KAAK,EAAC,GAAG,EAAC,EAAE,CAAC,MAAM,QAAQ,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAC/C,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,GAAG,CAC5C,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAa,CAAC,CACjC;aACF,CAAA;QACH,CAAC;QAED,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;YACjC,IAAI,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAA;YAE9B,IAAI,mBAAmB,GAAG,KAAK,CAAA;YAC/B,MAAM,WAAW,GAAG,KAAK,IAAI,EAAE;gBAC7B,IAAI,mBAAmB,EAAE,CAAC;oBACxB,OAAM;gBACR,CAAC;gBACD,mBAAmB,GAAG,IAAI,CAAA;gBAC1B,IAAI,CAAC;oBACH,MAAM,UAAU,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAA;gBACrF,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,OAAO,CAAC,KAAK,CAAC,mCAAmC,EAAE,CAAC,CAAC,CAAA;gBACvD,CAAC;YACH,CAAC,CAAA;YAED,MAAM,QAAQ,GAAG,CAAC,KAAQ,EAAE,EAAE;gBAC5B,OAAO,CAAC,KAAY,CAAC,CAAA;gBACrB,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;oBACvB,KAAK,WAAW,EAAE,CAAA;gBACpB,CAAC;YACH,CAAC,CAAA;YAED,MAAM,UAAU,GAAI,QAAQ,CAAC,EAAE,CAAC,MAAsB,CAAC,SAAS,EAAE,CAAA;YAClE,IAAI,IAAI,CAAC,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC9D,MAAM,UAAU,CAAC,UAAU,CAAC,kBAAkB,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;gBACvE,UAAU,CAAC,EAAE,CAAC,UAAU,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE;oBAC7C,MAAM,CAAC,EAAE,AAAD,EAAG,GAAG,GAAG,CAAC,GAAI,OAAkB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;oBACnD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;oBACjD,QAAQ,CAAC,MAAM,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAc,CAAC,CAAA;gBAC3D,CAAC,CAAC,CAAA;YACJ,CAAC;iBAAM,CAAC;gBACN,MAAM,UAAU,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;gBACnD,UAAU,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;YAC9E,CAAC;YAGD,IAAI,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC;gBACrB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,YAAY,IAAI;oBAClC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE;oBACjC,CAAC,CAAC,OAAO,IAAI,CAAC,GAAG,KAAK,QAAQ;wBAC5B,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI;wBACjB,CAAC,CAAC,IAAI,CAAA;gBACV,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;oBAChB,MAAM,IAAI,wBAAwB,CAAC,iBAAiB,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC,CAAA;gBACxE,CAAC;gBACD,UAAU,CAAC,WAAW,EAAE,GAAG,CAAC,CAAA;YAC9B,CAAC;YAED,OAAO,WAAW,CAAA;QACpB,CAAC;QAED,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE;YAC7B,MAAM,QAAQ,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAA;QAC7E,CAAC;KACY,CAAC,CAAA;IAEhB,QAAQ,CAAC,IAAI,GAAG,KAAK,IAAI,EAAE;QACzB,MAAM,OAAO,GAAG,aAAa,CAAkB,QAAQ,CAAC,GAAc,EAAE,QAAQ,CAAC,CAAA;QACjF,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAiB,YAAY,IAAI,OAAO,CAAC,CAAA;QACtE,MAAM,KAAK,CAAC,KAAK,EAAE,CAAA;QACnB,MAAM,EAAE,GAAG,MAAM,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,CAAA;QAClC,MAAM,KAAK,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;QAE1D,QAAQ,CAAC,EAAE,GAAG;YACZ,MAAM,EAAE,EAAE,CAAC,MAAM;YACjB,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,IAAI,KAAK,CAAC,EAAE;SAC/D,CAAA;IACH,CAAC,CAAA;IAED,QAAQ,CAAC,mBAAmB,GAAG,CAA0B,OAA6B,EAAE,EAAE;QACxF,MAAM,QAAQ,GAAG,CAAC,kBAAkB,EAAE,CAAC,OAAO,EAAE,YAAY,CAAC;eACxD,iBAAiB,CAAO,KAAK,EAAE,OAAO,EAAE,YAAY,CAAC,CAAoB,CAAA;QAE9E,QAAQ,CAAC,GAAG,GAAG,OAAO,CAAA;QAEtB,OAAO,QAAgB,CAAA;IACzB,CAAC,CAAA;IAED,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA"}
@@ -0,0 +1,22 @@
1
+ import type { LifecycleOptions, Resource, ResourceDbService, ResourceRecord } from '@owlmeans/resource';
2
+ import type { RedisCommander, Redis, Cluster } from 'ioredis';
3
+ export interface RedisDbService extends ResourceDbService<RedisDb, RedisClient> {
4
+ }
5
+ export type RedisClient = Redis | Cluster;
6
+ export interface RedisDb {
7
+ client: RedisCommander;
8
+ prefix: string;
9
+ }
10
+ export interface RedisResource<T extends ResourceRecord> extends Resource<T> {
11
+ name?: string;
12
+ db: RedisDb;
13
+ key: (key?: string) => string;
14
+ subscribe: <Type extends T>(handler: (value: Type) => Promise<void>, key?: SubOpts) => Promise<() => Promise<void>>;
15
+ publish: <Type extends T>(value: Type, key?: string) => Promise<void>;
16
+ }
17
+ export type SubOpts = number | string | boolean | SubscriptionOptions;
18
+ export interface SubscriptionOptions extends LifecycleOptions {
19
+ key?: string;
20
+ once?: boolean;
21
+ }
22
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAEvG,OAAO,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAE7D,MAAM,WAAW,cAAe,SAAQ,iBAAiB,CAAC,OAAO,EAAE,WAAW,CAAC;CAC9E;AAED,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,OAAO,CAAA;AAEzC,MAAM,WAAW,OAAO;IACtB,MAAM,EAAE,cAAc,CAAA;IACtB,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,aAAa,CAAC,CAAC,SAAS,cAAc,CAAE,SAAQ,QAAQ,CAAC,CAAC,CAAC;IAC1E,IAAI,CAAC,EAAE,MAAM,CAAA;IAEb,EAAE,EAAE,OAAO,CAAA;IAEX,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,KAAK,MAAM,CAAA;IAE7B,SAAS,EAAE,CAAC,IAAI,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;IAEnH,OAAO,EAAE,CAAC,IAAI,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CACtE;AAED,MAAM,MAAM,OAAO,GAAG,MAAM,GAAE,MAAM,GAAG,OAAO,GAAG,mBAAmB,CAAA;AAEpE,MAAM,WAAW,mBAAoB,SAAQ,gBAAgB;IAC3D,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,OAAO,CAAA;CACf"}
package/build/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export * from './options.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AACA,cAAc,cAAc,CAAA"}
@@ -0,0 +1,2 @@
1
+ export * from './options.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AACA,cAAc,cAAc,CAAA"}
@@ -0,0 +1,3 @@
1
+ import type { SubOpts, SubscriptionOptions } from '../types.js';
2
+ export declare const prepareSubOptions: (opts?: SubOpts) => SubscriptionOptions;
3
+ //# sourceMappingURL=options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../src/utils/options.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAE/D,eAAO,MAAM,iBAAiB,UAAW,OAAO,KAAG,mBAalD,CAAA"}
@@ -0,0 +1,17 @@
1
+ export const prepareSubOptions = (opts) => {
2
+ let _opts = {};
3
+ if (typeof opts === 'string') {
4
+ _opts.key = opts;
5
+ }
6
+ else if (typeof opts === 'number') {
7
+ _opts.ttl = opts;
8
+ }
9
+ else if (typeof opts === 'boolean') {
10
+ _opts.once = opts;
11
+ }
12
+ else if (typeof opts === 'object') {
13
+ _opts = opts;
14
+ }
15
+ return _opts;
16
+ };
17
+ //# sourceMappingURL=options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.js","sourceRoot":"","sources":["../../src/utils/options.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,IAAc,EAAuB,EAAE;IACvE,IAAI,KAAK,GAAwB,EAAE,CAAA;IACnC,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,KAAK,CAAC,GAAG,GAAG,IAAI,CAAA;IAClB,CAAC;SAAM,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QACpC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAA;IAClB,CAAC;SAAM,IAAI,OAAO,IAAI,KAAK,SAAS,EAAE,CAAC;QACrC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAA;IACnB,CAAC;SAAM,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QACpC,KAAK,GAAG,IAAI,CAAA;IACd,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC,CAAA"}
package/package.json ADDED
@@ -0,0 +1,41 @@
1
+ {
2
+ "name": "@owlmeans/redis-resource",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "scripts": {
6
+ "build": "tsc -b",
7
+ "dev": "sleep 246 && nodemon -e ts,tsx,json --watch src --exec \"tsc -p ./tsconfig.json\"",
8
+ "watch": "tsc -b -w --preserveWatchOutput --pretty"
9
+ },
10
+ "main": "build/index.js",
11
+ "module": "build/index.js",
12
+ "types": "build/index.d.ts",
13
+ "exports": {
14
+ ".": {
15
+ "import": "./build/index.js",
16
+ "require": "./build/index.js",
17
+ "default": "./build/index.js",
18
+ "module": "./build/index.js",
19
+ "types": "./build/index.d.ts"
20
+ }
21
+ },
22
+ "peerDependencies": {
23
+ "ajv": "*",
24
+ "ioredis": "*"
25
+ },
26
+ "dependencies": {
27
+ "@owlmeans/context": "^0.1.0",
28
+ "@owlmeans/resource": "^0.1.0",
29
+ "@owlmeans/server-context": "^0.1.0"
30
+ },
31
+ "devDependencies": {
32
+ "@types/node": "^22.7.8",
33
+ "nodemon": "^3.1.7",
34
+ "npm-check": "^6.0.1",
35
+ "typescript": "^5.6.3"
36
+ },
37
+ "private": false,
38
+ "publishConfig": {
39
+ "access": "public"
40
+ }
41
+ }
package/src/consts.ts ADDED
@@ -0,0 +1,4 @@
1
+
2
+ export const DEFAULT_DB_ALIAS = 'redis'
3
+
4
+ export const DEFAULT_PAGE_SIZE = 10
package/src/index.ts ADDED
@@ -0,0 +1,3 @@
1
+ export type * from './types.js'
2
+ export * from './consts.js'
3
+ export * from './resource.js'