@nymphjs/client 1.0.0-beta.11 → 1.0.0-beta.110
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/CHANGELOG.md +452 -0
- package/README.md +6 -6
- package/asyncitertest.js +53 -0
- package/dist/Entity.d.ts +156 -0
- package/{lib → dist}/Entity.js +202 -104
- package/dist/Entity.js.map +1 -0
- package/dist/Entity.types.d.ts +218 -0
- package/dist/Entity.types.js +2 -0
- package/{lib → dist}/EntityWeakCache.d.ts +1 -1
- package/{lib → dist}/EntityWeakCache.js +5 -9
- package/dist/EntityWeakCache.js.map +1 -0
- package/{lib → dist}/HttpRequester.d.ts +18 -4
- package/dist/HttpRequester.js +365 -0
- package/dist/HttpRequester.js.map +1 -0
- package/{lib → dist}/Nymph.d.ts +48 -11
- package/{lib → dist}/Nymph.js +167 -51
- package/dist/Nymph.js.map +1 -0
- package/{lib → dist}/Nymph.types.d.ts +82 -2
- package/dist/Nymph.types.js +2 -0
- package/{lib → dist}/PubSub.d.ts +16 -10
- package/{lib → dist}/PubSub.js +172 -108
- package/dist/PubSub.js.map +1 -0
- package/{lib → dist}/PubSub.types.d.ts +8 -3
- package/dist/PubSub.types.js +2 -0
- package/{lib → dist}/entityRefresh.d.ts +1 -1
- package/{lib → dist}/entityRefresh.js +21 -13
- package/dist/entityRefresh.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.js +13 -2
- package/dist/index.js.map +1 -1
- package/{lib → dist}/utils.d.ts +1 -1
- package/{lib → dist}/utils.js +28 -21
- package/dist/utils.js.map +1 -0
- package/jest.config.js +11 -2
- package/package.json +23 -27
- package/src/Entity.ts +173 -107
- package/src/Entity.types.ts +29 -47
- package/src/EntityWeakCache.ts +8 -6
- package/src/HttpRequester.ts +268 -31
- package/src/Nymph.ts +191 -88
- package/src/Nymph.types.ts +51 -2
- package/src/PubSub.ts +214 -141
- package/src/PubSub.types.ts +10 -5
- package/src/entityRefresh.ts +6 -6
- package/src/index.ts +10 -10
- package/src/utils.ts +12 -5
- package/tsconfig.json +6 -4
- package/typedoc.json +4 -0
- package/dist/index.js.LICENSE.txt +0 -8
- package/lib/Entity.d.ts +0 -51
- package/lib/Entity.js.map +0 -1
- package/lib/Entity.types.d.ts +0 -65
- package/lib/Entity.types.js +0 -3
- package/lib/EntityWeakCache.js.map +0 -1
- package/lib/HttpRequester.js +0 -190
- package/lib/HttpRequester.js.map +0 -1
- package/lib/Nymph.js.map +0 -1
- package/lib/Nymph.types.js +0 -3
- package/lib/PubSub.js.map +0 -1
- package/lib/PubSub.types.js +0 -3
- package/lib/entityRefresh.js.map +0 -1
- package/lib/index.d.ts +0 -13
- package/lib/index.js +0 -34
- package/lib/index.js.map +0 -1
- package/lib/utils.js.map +0 -1
- package/webpack.config.js +0 -28
- /package/{lib → dist}/Entity.types.js.map +0 -0
- /package/{lib → dist}/Nymph.types.js.map +0 -0
- /package/{lib → dist}/PubSub.types.js.map +0 -0
package/{lib → dist}/Nymph.js
RENAMED
|
@@ -1,27 +1,52 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.InvalidRequestError = exports.ClassNotAvailableError = void 0;
|
|
7
|
-
const Entity_1 = __importDefault(require("./Entity"));
|
|
8
|
-
const EntityWeakCache_1 = __importDefault(require("./EntityWeakCache"));
|
|
9
|
-
const HttpRequester_1 = __importDefault(require("./HttpRequester"));
|
|
10
|
-
const utils_1 = require("./utils");
|
|
1
|
+
import Entity from './Entity.js';
|
|
2
|
+
import EntityWeakCache from './EntityWeakCache.js';
|
|
3
|
+
import HttpRequester, { ClientError } from './HttpRequester.js';
|
|
4
|
+
import { entitiesToReferences, entityConstructorsToClassNames, } from './utils.js';
|
|
11
5
|
let requester;
|
|
12
|
-
class Nymph {
|
|
6
|
+
export default class Nymph {
|
|
7
|
+
/**
|
|
8
|
+
* And optional PubSub client instance.
|
|
9
|
+
*/
|
|
10
|
+
pubsub = undefined;
|
|
11
|
+
/**
|
|
12
|
+
* A simple map of names to Entity classes.
|
|
13
|
+
*/
|
|
14
|
+
entityClasses = {};
|
|
15
|
+
/**
|
|
16
|
+
* The entity class for this instance of Nymph.
|
|
17
|
+
*/
|
|
18
|
+
Entity;
|
|
19
|
+
requestCallbacks = [];
|
|
20
|
+
responseCallbacks = [];
|
|
21
|
+
restUrl = '';
|
|
22
|
+
weakCache = false;
|
|
23
|
+
/**
|
|
24
|
+
* Headers that will be sent with every request.
|
|
25
|
+
*
|
|
26
|
+
* These are used by Tilmeld for authentication.
|
|
27
|
+
*/
|
|
28
|
+
headers = {};
|
|
29
|
+
/**
|
|
30
|
+
* The entity cache.
|
|
31
|
+
*/
|
|
32
|
+
cache = new EntityWeakCache();
|
|
33
|
+
/**
|
|
34
|
+
* Return `null` or empty array instead of error when entity/ies not found.
|
|
35
|
+
*/
|
|
36
|
+
returnNullOnNotFound = false;
|
|
13
37
|
constructor(NymphOptions) {
|
|
14
|
-
this.pubsub = undefined;
|
|
15
|
-
this.entityClasses = {};
|
|
16
|
-
this.requestCallbacks = [];
|
|
17
|
-
this.responseCallbacks = [];
|
|
18
|
-
this.restUrl = '';
|
|
19
|
-
this.weakCache = false;
|
|
20
|
-
this.cache = new EntityWeakCache_1.default();
|
|
21
38
|
this.restUrl = NymphOptions.restUrl;
|
|
39
|
+
// @ts-ignore TS doesn't know about WeakRef.
|
|
22
40
|
this.weakCache = !!NymphOptions.weakCache && typeof WeakRef !== 'undefined';
|
|
23
|
-
|
|
24
|
-
|
|
41
|
+
if ('returnNullOnNotFound' in NymphOptions &&
|
|
42
|
+
NymphOptions.returnNullOnNotFound != null) {
|
|
43
|
+
this.returnNullOnNotFound = NymphOptions.returnNullOnNotFound;
|
|
44
|
+
}
|
|
45
|
+
this.Entity = this.addEntityClass(Entity);
|
|
46
|
+
requester = new HttpRequester('fetch' in NymphOptions ? NymphOptions.fetch : undefined);
|
|
47
|
+
if ('renewTokens' in NymphOptions && !NymphOptions.renewTokens) {
|
|
48
|
+
this.headers['X-Tilmeld-Token-Renewal'] = 'off';
|
|
49
|
+
}
|
|
25
50
|
requester.on('request', (_requester, url, options) => {
|
|
26
51
|
for (let i = 0; i < this.requestCallbacks.length; i++) {
|
|
27
52
|
this.requestCallbacks[i] && this.requestCallbacks[i](url, options);
|
|
@@ -33,26 +58,45 @@ class Nymph {
|
|
|
33
58
|
}
|
|
34
59
|
});
|
|
35
60
|
}
|
|
61
|
+
/**
|
|
62
|
+
* Add your class to this instance.
|
|
63
|
+
*
|
|
64
|
+
* This will create a class that extends your class within this instance of
|
|
65
|
+
* Nymph and return it. You can then use this class's constructor and methods,
|
|
66
|
+
* which will use this instance of Nymph.
|
|
67
|
+
*
|
|
68
|
+
* Because this creates a subclass, don't use the class returned from
|
|
69
|
+
* `getEntityClass` to check with `instanceof`. Instead, use the base class
|
|
70
|
+
* that you passed into this method.
|
|
71
|
+
*/
|
|
36
72
|
addEntityClass(entityClass) {
|
|
37
73
|
const nymph = this;
|
|
38
74
|
class NymphEntity extends entityClass {
|
|
75
|
+
static nymph = nymph;
|
|
39
76
|
constructor(...args) {
|
|
40
77
|
super(...args);
|
|
41
78
|
}
|
|
42
79
|
}
|
|
43
|
-
NymphEntity.nymph = nymph;
|
|
44
80
|
this.entityClasses[entityClass.class] = NymphEntity;
|
|
45
81
|
return NymphEntity;
|
|
46
82
|
}
|
|
47
83
|
getEntityClass(className) {
|
|
48
|
-
|
|
49
|
-
|
|
84
|
+
let key = null;
|
|
85
|
+
if (typeof className === 'string') {
|
|
86
|
+
key = className;
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
key = className.class;
|
|
50
90
|
}
|
|
51
|
-
|
|
91
|
+
if (key in this.entityClasses) {
|
|
92
|
+
return this.entityClasses[key];
|
|
93
|
+
}
|
|
94
|
+
throw new ClassNotAvailableError('Tried to use class: ' + key);
|
|
52
95
|
}
|
|
53
96
|
async newUID(name) {
|
|
54
97
|
const data = await requester.POST({
|
|
55
98
|
url: this.restUrl,
|
|
99
|
+
headers: { ...this.headers },
|
|
56
100
|
dataType: 'text',
|
|
57
101
|
data: { action: 'uid', data: name },
|
|
58
102
|
});
|
|
@@ -61,6 +105,7 @@ class Nymph {
|
|
|
61
105
|
async setUID(name, value) {
|
|
62
106
|
return await requester.PUT({
|
|
63
107
|
url: this.restUrl,
|
|
108
|
+
headers: { ...this.headers },
|
|
64
109
|
dataType: 'json',
|
|
65
110
|
data: { action: 'uid', data: { name, value } },
|
|
66
111
|
});
|
|
@@ -68,6 +113,7 @@ class Nymph {
|
|
|
68
113
|
async getUID(name) {
|
|
69
114
|
const data = await requester.GET({
|
|
70
115
|
url: this.restUrl,
|
|
116
|
+
headers: { ...this.headers },
|
|
71
117
|
dataType: 'text',
|
|
72
118
|
data: { action: 'uid', data: name },
|
|
73
119
|
});
|
|
@@ -76,6 +122,7 @@ class Nymph {
|
|
|
76
122
|
async deleteUID(name) {
|
|
77
123
|
return await requester.DELETE({
|
|
78
124
|
url: this.restUrl,
|
|
125
|
+
headers: { ...this.headers },
|
|
79
126
|
dataType: 'text',
|
|
80
127
|
data: { action: 'uid', data: name },
|
|
81
128
|
});
|
|
@@ -121,6 +168,7 @@ class Nymph {
|
|
|
121
168
|
async requestWithMethod(entity, method, data, plural) {
|
|
122
169
|
const response = await requester[method]({
|
|
123
170
|
url: this.restUrl,
|
|
171
|
+
headers: { ...this.headers },
|
|
124
172
|
dataType: 'json',
|
|
125
173
|
data: {
|
|
126
174
|
action: plural ? 'entities' : 'entity',
|
|
@@ -140,7 +188,21 @@ class Nymph {
|
|
|
140
188
|
throw new Error('Server error');
|
|
141
189
|
}
|
|
142
190
|
async getEntity(options, ...selectors) {
|
|
143
|
-
|
|
191
|
+
let data = null;
|
|
192
|
+
try {
|
|
193
|
+
// @ts-ignore: Implementation signatures of overloads are not externally visible.
|
|
194
|
+
data = (await this.getEntityData(options, ...selectors));
|
|
195
|
+
}
|
|
196
|
+
catch (e) {
|
|
197
|
+
if (this.returnNullOnNotFound &&
|
|
198
|
+
e instanceof ClientError &&
|
|
199
|
+
e.status === 404) {
|
|
200
|
+
data = null;
|
|
201
|
+
}
|
|
202
|
+
else {
|
|
203
|
+
throw e;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
144
206
|
if (options.return && options.return === 'count') {
|
|
145
207
|
return Number(data ?? 0);
|
|
146
208
|
}
|
|
@@ -155,20 +217,22 @@ class Nymph {
|
|
|
155
217
|
return null;
|
|
156
218
|
}
|
|
157
219
|
async getEntityData(options, ...selectors) {
|
|
158
|
-
if (options.class
|
|
220
|
+
if (options.class instanceof Entity) {
|
|
159
221
|
throw new InvalidRequestError("You can't make REST requests with the base Entity class.");
|
|
160
222
|
}
|
|
223
|
+
// Set up options and selectors.
|
|
161
224
|
if (typeof selectors[0] === 'string') {
|
|
162
225
|
selectors = [{ type: '&', guid: selectors[0] }];
|
|
163
226
|
}
|
|
164
227
|
const data = await requester.GET({
|
|
165
228
|
url: this.restUrl,
|
|
229
|
+
headers: { ...this.headers },
|
|
166
230
|
dataType: 'json',
|
|
167
231
|
data: {
|
|
168
232
|
action: 'entity',
|
|
169
233
|
data: [
|
|
170
234
|
{ ...options, class: options.class.class },
|
|
171
|
-
...
|
|
235
|
+
...entityConstructorsToClassNames(selectors),
|
|
172
236
|
],
|
|
173
237
|
},
|
|
174
238
|
});
|
|
@@ -178,19 +242,36 @@ class Nymph {
|
|
|
178
242
|
return null;
|
|
179
243
|
}
|
|
180
244
|
async getEntities(options, ...selectors) {
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
245
|
+
let data = null;
|
|
246
|
+
try {
|
|
247
|
+
data = await requester.GET({
|
|
248
|
+
url: this.restUrl,
|
|
249
|
+
headers: { ...this.headers },
|
|
250
|
+
dataType: 'json',
|
|
251
|
+
data: {
|
|
252
|
+
action: 'entities',
|
|
253
|
+
data: [
|
|
254
|
+
{ ...options, class: options.class.class },
|
|
255
|
+
...entityConstructorsToClassNames(selectors),
|
|
256
|
+
],
|
|
257
|
+
},
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
catch (e) {
|
|
261
|
+
if (this.returnNullOnNotFound &&
|
|
262
|
+
e instanceof ClientError &&
|
|
263
|
+
e.status === 404) {
|
|
264
|
+
data = null;
|
|
265
|
+
}
|
|
266
|
+
else {
|
|
267
|
+
throw e;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
192
270
|
if (options.return && options.return === 'count') {
|
|
193
|
-
return Number(data);
|
|
271
|
+
return Number(data ?? 0);
|
|
272
|
+
}
|
|
273
|
+
if (data == null) {
|
|
274
|
+
return [];
|
|
194
275
|
}
|
|
195
276
|
if (options.return && options.return === 'guid') {
|
|
196
277
|
return data;
|
|
@@ -204,6 +285,7 @@ class Nymph {
|
|
|
204
285
|
}
|
|
205
286
|
let entity = EntityClass.factorySync();
|
|
206
287
|
if (this.weakCache) {
|
|
288
|
+
// Try to get it from cache.
|
|
207
289
|
const entityFromCache = this.cache.get(EntityClass, entityJSON.guid || '');
|
|
208
290
|
if (entityFromCache != null) {
|
|
209
291
|
entity = entityFromCache;
|
|
@@ -225,10 +307,10 @@ class Nymph {
|
|
|
225
307
|
}
|
|
226
308
|
initEntitiesFromData(item) {
|
|
227
309
|
if (Array.isArray(item)) {
|
|
310
|
+
// Recurse into lower arrays.
|
|
228
311
|
return item.map((entry) => this.initEntitiesFromData(entry));
|
|
229
312
|
}
|
|
230
|
-
else if (item instanceof Object &&
|
|
231
|
-
!(item instanceof this.getEntityClass('Entity'))) {
|
|
313
|
+
else if (item instanceof Object && !(item instanceof Entity)) {
|
|
232
314
|
if (item.hasOwnProperty('class') &&
|
|
233
315
|
item.hasOwnProperty('guid') &&
|
|
234
316
|
item.hasOwnProperty('cdate') &&
|
|
@@ -240,15 +322,18 @@ class Nymph {
|
|
|
240
322
|
}
|
|
241
323
|
else {
|
|
242
324
|
for (let [key, value] of Object.entries(item)) {
|
|
325
|
+
// @ts-ignore: Key comes from the object. It's fine.
|
|
243
326
|
item[key] = this.initEntitiesFromData(value);
|
|
244
327
|
}
|
|
245
328
|
}
|
|
246
329
|
}
|
|
330
|
+
// Not an entity or array, just return it.
|
|
247
331
|
return item;
|
|
248
332
|
}
|
|
249
333
|
async deleteEntity(entity, _plural = false) {
|
|
250
334
|
return await requester.DELETE({
|
|
251
335
|
url: this.restUrl,
|
|
336
|
+
headers: { ...this.headers },
|
|
252
337
|
dataType: 'json',
|
|
253
338
|
data: {
|
|
254
339
|
action: _plural ? 'entities' : 'entity',
|
|
@@ -270,6 +355,7 @@ class Nymph {
|
|
|
270
355
|
async serverCall(entity, method, params, stateless = false) {
|
|
271
356
|
const data = await requester.POST({
|
|
272
357
|
url: this.restUrl,
|
|
358
|
+
headers: { ...this.headers },
|
|
273
359
|
dataType: 'json',
|
|
274
360
|
data: {
|
|
275
361
|
action: 'method',
|
|
@@ -277,7 +363,7 @@ class Nymph {
|
|
|
277
363
|
entity,
|
|
278
364
|
stateless,
|
|
279
365
|
method,
|
|
280
|
-
params:
|
|
366
|
+
params: entitiesToReferences(entityConstructorsToClassNames(params)),
|
|
281
367
|
},
|
|
282
368
|
},
|
|
283
369
|
});
|
|
@@ -289,6 +375,7 @@ class Nymph {
|
|
|
289
375
|
async serverCallStatic(className, method, params) {
|
|
290
376
|
const data = await requester.POST({
|
|
291
377
|
url: this.restUrl,
|
|
378
|
+
headers: { ...this.headers },
|
|
292
379
|
dataType: 'json',
|
|
293
380
|
data: {
|
|
294
381
|
action: 'method',
|
|
@@ -296,17 +383,50 @@ class Nymph {
|
|
|
296
383
|
class: className,
|
|
297
384
|
static: true,
|
|
298
385
|
method: method,
|
|
299
|
-
params:
|
|
386
|
+
params: entitiesToReferences(entityConstructorsToClassNames(params)),
|
|
300
387
|
},
|
|
301
388
|
},
|
|
302
389
|
});
|
|
303
390
|
return this.initEntitiesFromData(data);
|
|
304
391
|
}
|
|
392
|
+
async serverCallStaticIterator(className, method, params) {
|
|
393
|
+
const iterable = await requester.POST_ITERATOR({
|
|
394
|
+
url: this.restUrl,
|
|
395
|
+
headers: { ...this.headers },
|
|
396
|
+
dataType: 'json',
|
|
397
|
+
data: {
|
|
398
|
+
action: 'method',
|
|
399
|
+
data: {
|
|
400
|
+
class: className,
|
|
401
|
+
static: true,
|
|
402
|
+
method: method,
|
|
403
|
+
iterator: true,
|
|
404
|
+
params: entitiesToReferences(entityConstructorsToClassNames(params)),
|
|
405
|
+
},
|
|
406
|
+
},
|
|
407
|
+
});
|
|
408
|
+
const that = this;
|
|
409
|
+
const iterator = {
|
|
410
|
+
abortController: iterable.abortController,
|
|
411
|
+
async *[Symbol.asyncIterator]() {
|
|
412
|
+
for await (let response of iterable) {
|
|
413
|
+
if (response instanceof Error) {
|
|
414
|
+
yield response;
|
|
415
|
+
}
|
|
416
|
+
else {
|
|
417
|
+
yield that.initEntitiesFromData(response);
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
},
|
|
421
|
+
};
|
|
422
|
+
return iterator;
|
|
423
|
+
}
|
|
305
424
|
on(event, callback) {
|
|
306
425
|
const prop = (event + 'Callbacks');
|
|
307
426
|
if (!(prop in this)) {
|
|
308
427
|
throw new Error('Invalid event type.');
|
|
309
428
|
}
|
|
429
|
+
// @ts-ignore: The callback should always be the right type here.
|
|
310
430
|
this[prop].push(callback);
|
|
311
431
|
return () => this.off(event, callback);
|
|
312
432
|
}
|
|
@@ -315,29 +435,25 @@ class Nymph {
|
|
|
315
435
|
if (!(prop in this)) {
|
|
316
436
|
return false;
|
|
317
437
|
}
|
|
438
|
+
// @ts-ignore: The callback should always be the right type here.
|
|
318
439
|
const i = this[prop].indexOf(callback);
|
|
319
440
|
if (i > -1) {
|
|
441
|
+
// @ts-ignore: The callback should always be the right type here.
|
|
320
442
|
this[prop].splice(i, 1);
|
|
321
443
|
}
|
|
322
444
|
return true;
|
|
323
445
|
}
|
|
324
|
-
setXsrfToken(token) {
|
|
325
|
-
requester.setXsrfToken(token);
|
|
326
|
-
}
|
|
327
446
|
}
|
|
328
|
-
|
|
329
|
-
class ClassNotAvailableError extends Error {
|
|
447
|
+
export class ClassNotAvailableError extends Error {
|
|
330
448
|
constructor(message) {
|
|
331
449
|
super(message);
|
|
332
450
|
this.name = 'ClassNotAvailableError';
|
|
333
451
|
}
|
|
334
452
|
}
|
|
335
|
-
|
|
336
|
-
class InvalidRequestError extends Error {
|
|
453
|
+
export class InvalidRequestError extends Error {
|
|
337
454
|
constructor(message) {
|
|
338
455
|
super(message);
|
|
339
456
|
this.name = 'InvalidRequestError';
|
|
340
457
|
}
|
|
341
458
|
}
|
|
342
|
-
exports.InvalidRequestError = InvalidRequestError;
|
|
343
459
|
//# sourceMappingURL=Nymph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Nymph.js","sourceRoot":"","sources":["../src/Nymph.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,22 +1,98 @@
|
|
|
1
|
-
import { EntityConstructor, EntityInterface } from './Entity.types';
|
|
1
|
+
import { EntityConstructor, EntityInterface } from './Entity.types.js';
|
|
2
2
|
export type NymphOptions = {
|
|
3
|
+
/**
|
|
4
|
+
* The URL of your Nymph REST server.
|
|
5
|
+
*/
|
|
3
6
|
restUrl: string;
|
|
7
|
+
/**
|
|
8
|
+
* The URL of your Nymph PubSub server.
|
|
9
|
+
*/
|
|
4
10
|
pubsubUrl?: string;
|
|
11
|
+
/**
|
|
12
|
+
* A fetch implementation.
|
|
13
|
+
*/
|
|
5
14
|
fetch?: WindowOrWorkerGlobalScope['fetch'];
|
|
15
|
+
/**
|
|
16
|
+
* A WebSocket implementation.
|
|
17
|
+
*/
|
|
6
18
|
WebSocket?: typeof WebSocket;
|
|
19
|
+
/**
|
|
20
|
+
* Return `null` or empty array instead of error when entity/ies not found.
|
|
21
|
+
*/
|
|
22
|
+
returnNullOnNotFound?: boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Whether to not output status messages to the console.
|
|
25
|
+
*/
|
|
7
26
|
noConsole?: boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Don't automatically try to connect to PubSub server.
|
|
29
|
+
*/
|
|
30
|
+
noAutoconnect?: boolean;
|
|
31
|
+
/**
|
|
32
|
+
* Use a WeakRef based cache of entities.
|
|
33
|
+
*
|
|
34
|
+
* This ensures all entities returned are the same instance if they have the
|
|
35
|
+
* same class and GUID. This also means that whenever an entity is returned
|
|
36
|
+
* from the server, the single instance in memory will be refreshed. This
|
|
37
|
+
* could have annoying results, like destroying dirty data (the dreaded
|
|
38
|
+
* triple-D).
|
|
39
|
+
*
|
|
40
|
+
* This could also be a potential source of memory leaks. Although the
|
|
41
|
+
* entities themselves are referenced weakly so they get garbage collected,
|
|
42
|
+
* the GUID used as a key and the WeakRef object itself are not weak
|
|
43
|
+
* references, so not destroyed when the instance is garbage collected.
|
|
44
|
+
*
|
|
45
|
+
* However, even with these caveats, this might help you if you have a big app
|
|
46
|
+
* with the same entities stored in several different places in memory. This
|
|
47
|
+
* can help to synchronize them correctly and avoid data conflicts.
|
|
48
|
+
*/
|
|
8
49
|
weakCache?: boolean;
|
|
50
|
+
/**
|
|
51
|
+
* Whether to renew tokens when a request is made.
|
|
52
|
+
*
|
|
53
|
+
* If you turn this off, the client will request that the server not renew an
|
|
54
|
+
* authentication token, even if it is within the renewal time of the
|
|
55
|
+
* expiration date.
|
|
56
|
+
*
|
|
57
|
+
* This defaults to true.
|
|
58
|
+
*/
|
|
59
|
+
renewTokens?: boolean;
|
|
9
60
|
};
|
|
10
61
|
export type EventType = 'request' | 'response';
|
|
11
62
|
export type RequestCallback = (url: string, options: RequestInit) => void;
|
|
12
63
|
export type ResponseCallback = (response: Response, text: string) => void;
|
|
13
64
|
export type Options<T extends EntityConstructor = EntityConstructor> = {
|
|
65
|
+
/**
|
|
66
|
+
* The Entity class to query.
|
|
67
|
+
*/
|
|
14
68
|
class: T;
|
|
69
|
+
/**
|
|
70
|
+
* The limit of entities to be returned. Not needed when using `getEntity`, as
|
|
71
|
+
* it always returns only one.
|
|
72
|
+
*/
|
|
15
73
|
limit?: number;
|
|
74
|
+
/**
|
|
75
|
+
* The offset from the first matching entity, in order, to start retrieving.
|
|
76
|
+
*/
|
|
16
77
|
offset?: number;
|
|
78
|
+
/**
|
|
79
|
+
* If true, entities will be retrieved from newest to oldest/largest to
|
|
80
|
+
* smallest (with regard to `sort`).
|
|
81
|
+
*/
|
|
17
82
|
reverse?: boolean;
|
|
18
|
-
|
|
83
|
+
/**
|
|
84
|
+
* How to sort the entities. Should be "cdate", "mdate", the name of a
|
|
85
|
+
* property, or null.
|
|
86
|
+
*/
|
|
87
|
+
sort?: 'cdate' | 'mdate' | string | null;
|
|
88
|
+
/**
|
|
89
|
+
* What to return, the entities with their data, just the GUIDs, or just a
|
|
90
|
+
* count.
|
|
91
|
+
*/
|
|
19
92
|
return?: 'entity' | 'guid' | 'count';
|
|
93
|
+
/**
|
|
94
|
+
* If true, Nymph will skip the cache and retrieve the entity from the DB.
|
|
95
|
+
*/
|
|
20
96
|
skipCache?: boolean;
|
|
21
97
|
};
|
|
22
98
|
export type Clause<C> = C | Exclude<C, undefined>[];
|
|
@@ -34,6 +110,8 @@ type PrimitiveSelector = {
|
|
|
34
110
|
'!equal'?: PrimitiveSelector['equal'];
|
|
35
111
|
contain?: [string, any];
|
|
36
112
|
'!contain'?: PrimitiveSelector['contain'];
|
|
113
|
+
search?: [string, string];
|
|
114
|
+
'!search'?: PrimitiveSelector['search'];
|
|
37
115
|
match?: [string, string];
|
|
38
116
|
'!match'?: PrimitiveSelector['match'];
|
|
39
117
|
imatch?: [string, string];
|
|
@@ -71,6 +149,8 @@ export type Selector = {
|
|
|
71
149
|
'!equal'?: Clause<OrWithTime<PrimitiveSelector['equal']>>;
|
|
72
150
|
contain?: Clause<OrWithTime<PrimitiveSelector['contain']>>;
|
|
73
151
|
'!contain'?: Clause<OrWithTime<PrimitiveSelector['contain']>>;
|
|
152
|
+
search?: Clause<PrimitiveSelector['search']>;
|
|
153
|
+
'!search'?: Clause<PrimitiveSelector['search']>;
|
|
74
154
|
match?: Clause<PrimitiveSelector['match']>;
|
|
75
155
|
'!match'?: Clause<PrimitiveSelector['match']>;
|
|
76
156
|
imatch?: Clause<PrimitiveSelector['imatch']>;
|
package/{lib → dist}/PubSub.d.ts
RENAMED
|
@@ -1,9 +1,12 @@
|
|
|
1
|
-
import Nymph from './Nymph';
|
|
2
|
-
import { NymphOptions, Options, Selector } from './Nymph.types';
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
1
|
+
import Nymph from './Nymph.js';
|
|
2
|
+
import type { NymphOptions, Options, Selector } from './Nymph.types.js';
|
|
3
|
+
import type { EntityInstanceType } from './Entity.js';
|
|
4
|
+
import type { EntityConstructor, EntityInterface } from './Entity.types.js';
|
|
5
|
+
import type { PubSubCallbacks, PubSubConnectCallback, PubSubCountCallback, PubSubDisconnectCallback, PubSubEventType, PubSubRejectCallback, PubSubResolveCallback, PubSubErrorCallback, PubSubSubscribable, PubSubUpdate } from './PubSub.types.js';
|
|
5
6
|
export default class PubSub {
|
|
6
7
|
private nymph;
|
|
8
|
+
private authToken;
|
|
9
|
+
private switchToken;
|
|
7
10
|
private connection;
|
|
8
11
|
private waitForConnectionTimeout;
|
|
9
12
|
private pubsubUrl;
|
|
@@ -11,16 +14,17 @@ export default class PubSub {
|
|
|
11
14
|
private subscriptions;
|
|
12
15
|
private connectCallbacks;
|
|
13
16
|
private disconnectCallbacks;
|
|
17
|
+
private errorCallbacks;
|
|
14
18
|
private noConsole;
|
|
15
19
|
constructor(nymphOptions: NymphOptions, nymph: Nymph);
|
|
16
20
|
subscribeEntities<T extends EntityConstructor = EntityConstructor>(options: Options<T> & {
|
|
17
21
|
return: 'guid';
|
|
18
22
|
}, ...selectors: Selector[]): PubSubSubscribable<PubSubUpdate<string[]>>;
|
|
19
|
-
subscribeEntities<T extends EntityConstructor = EntityConstructor>(options: Options<T>, ...selectors: Selector[]): PubSubSubscribable<PubSubUpdate<
|
|
23
|
+
subscribeEntities<T extends EntityConstructor = EntityConstructor>(options: Options<T>, ...selectors: Selector[]): PubSubSubscribable<PubSubUpdate<EntityInstanceType<T>[]>>;
|
|
20
24
|
subscribeEntity<T extends EntityConstructor = EntityConstructor>(options: Options<T> & {
|
|
21
25
|
return: 'guid';
|
|
22
26
|
}, ...selectors: Selector[]): PubSubSubscribable<PubSubUpdate<string | null>>;
|
|
23
|
-
subscribeEntity<T extends EntityConstructor = EntityConstructor>(options: Options<T>, ...selectors: Selector[]): PubSubSubscribable<PubSubUpdate<
|
|
27
|
+
subscribeEntity<T extends EntityConstructor = EntityConstructor>(options: Options<T>, ...selectors: Selector[]): PubSubSubscribable<PubSubUpdate<EntityInstanceType<T> | null>>;
|
|
24
28
|
subscribeUID(name: string): (resolve?: PubSubResolveCallback<number> | undefined, reject?: PubSubRejectCallback | undefined, count?: PubSubCountCallback | undefined) => {
|
|
25
29
|
unsubscribe: () => void;
|
|
26
30
|
};
|
|
@@ -34,6 +38,8 @@ export default class PubSub {
|
|
|
34
38
|
private _onclose;
|
|
35
39
|
private _send;
|
|
36
40
|
isConnectionOpen(): boolean;
|
|
41
|
+
isConnectionConnecting(): boolean;
|
|
42
|
+
isConnection(): boolean;
|
|
37
43
|
private _subscribeQuery;
|
|
38
44
|
private _subscribeUID;
|
|
39
45
|
private _sendQuery;
|
|
@@ -44,10 +50,10 @@ export default class PubSub {
|
|
|
44
50
|
private _unsubscribeUID;
|
|
45
51
|
private _sendUnQuery;
|
|
46
52
|
private _sendUnUID;
|
|
47
|
-
updateArray(
|
|
48
|
-
on<T extends PubSubEventType>(event: T, callback: T extends 'connect' ? PubSubConnectCallback : T extends 'disconnect' ? PubSubDisconnectCallback : never): () => boolean;
|
|
49
|
-
off<T extends PubSubEventType>(event: T, callback: T extends 'connect' ? PubSubConnectCallback : T extends 'disconnect' ? PubSubDisconnectCallback : never): boolean;
|
|
50
|
-
|
|
53
|
+
updateArray(current: EntityInterface[], update: PubSubUpdate<EntityInterface[]>): void;
|
|
54
|
+
on<T extends PubSubEventType>(event: T, callback: T extends 'connect' ? PubSubConnectCallback : T extends 'disconnect' ? PubSubDisconnectCallback : T extends 'error' ? PubSubErrorCallback : never): () => boolean;
|
|
55
|
+
off<T extends PubSubEventType>(event: T, callback: T extends 'connect' ? PubSubConnectCallback : T extends 'disconnect' ? PubSubDisconnectCallback : T extends 'error' ? PubSubErrorCallback : never): boolean;
|
|
56
|
+
authenticate(authToken: string | null, switchToken?: string | null): void;
|
|
51
57
|
}
|
|
52
58
|
export declare class PubSubSubscription<T> {
|
|
53
59
|
query: string;
|