@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.
Files changed (69) hide show
  1. package/CHANGELOG.md +452 -0
  2. package/README.md +6 -6
  3. package/asyncitertest.js +53 -0
  4. package/dist/Entity.d.ts +156 -0
  5. package/{lib → dist}/Entity.js +202 -104
  6. package/dist/Entity.js.map +1 -0
  7. package/dist/Entity.types.d.ts +218 -0
  8. package/dist/Entity.types.js +2 -0
  9. package/{lib → dist}/EntityWeakCache.d.ts +1 -1
  10. package/{lib → dist}/EntityWeakCache.js +5 -9
  11. package/dist/EntityWeakCache.js.map +1 -0
  12. package/{lib → dist}/HttpRequester.d.ts +18 -4
  13. package/dist/HttpRequester.js +365 -0
  14. package/dist/HttpRequester.js.map +1 -0
  15. package/{lib → dist}/Nymph.d.ts +48 -11
  16. package/{lib → dist}/Nymph.js +167 -51
  17. package/dist/Nymph.js.map +1 -0
  18. package/{lib → dist}/Nymph.types.d.ts +82 -2
  19. package/dist/Nymph.types.js +2 -0
  20. package/{lib → dist}/PubSub.d.ts +16 -10
  21. package/{lib → dist}/PubSub.js +172 -108
  22. package/dist/PubSub.js.map +1 -0
  23. package/{lib → dist}/PubSub.types.d.ts +8 -3
  24. package/dist/PubSub.types.js +2 -0
  25. package/{lib → dist}/entityRefresh.d.ts +1 -1
  26. package/{lib → dist}/entityRefresh.js +21 -13
  27. package/dist/entityRefresh.js.map +1 -0
  28. package/dist/index.d.ts +13 -0
  29. package/dist/index.js +13 -2
  30. package/dist/index.js.map +1 -1
  31. package/{lib → dist}/utils.d.ts +1 -1
  32. package/{lib → dist}/utils.js +28 -21
  33. package/dist/utils.js.map +1 -0
  34. package/jest.config.js +11 -2
  35. package/package.json +23 -27
  36. package/src/Entity.ts +173 -107
  37. package/src/Entity.types.ts +29 -47
  38. package/src/EntityWeakCache.ts +8 -6
  39. package/src/HttpRequester.ts +268 -31
  40. package/src/Nymph.ts +191 -88
  41. package/src/Nymph.types.ts +51 -2
  42. package/src/PubSub.ts +214 -141
  43. package/src/PubSub.types.ts +10 -5
  44. package/src/entityRefresh.ts +6 -6
  45. package/src/index.ts +10 -10
  46. package/src/utils.ts +12 -5
  47. package/tsconfig.json +6 -4
  48. package/typedoc.json +4 -0
  49. package/dist/index.js.LICENSE.txt +0 -8
  50. package/lib/Entity.d.ts +0 -51
  51. package/lib/Entity.js.map +0 -1
  52. package/lib/Entity.types.d.ts +0 -65
  53. package/lib/Entity.types.js +0 -3
  54. package/lib/EntityWeakCache.js.map +0 -1
  55. package/lib/HttpRequester.js +0 -190
  56. package/lib/HttpRequester.js.map +0 -1
  57. package/lib/Nymph.js.map +0 -1
  58. package/lib/Nymph.types.js +0 -3
  59. package/lib/PubSub.js.map +0 -1
  60. package/lib/PubSub.types.js +0 -3
  61. package/lib/entityRefresh.js.map +0 -1
  62. package/lib/index.d.ts +0 -13
  63. package/lib/index.js +0 -34
  64. package/lib/index.js.map +0 -1
  65. package/lib/utils.js.map +0 -1
  66. package/webpack.config.js +0 -28
  67. /package/{lib → dist}/Entity.types.js.map +0 -0
  68. /package/{lib → dist}/Nymph.types.js.map +0 -0
  69. /package/{lib → dist}/PubSub.types.js.map +0 -0
@@ -1,27 +1,52 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
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
- this.Entity = this.addEntityClass(Entity_1.default);
24
- requester = new HttpRequester_1.default('fetch' in NymphOptions ? NymphOptions.fetch : undefined);
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
- if (className in this.entityClasses) {
49
- return this.entityClasses[className];
84
+ let key = null;
85
+ if (typeof className === 'string') {
86
+ key = className;
87
+ }
88
+ else {
89
+ key = className.class;
50
90
  }
51
- throw new ClassNotAvailableError("Tried to get class that's not available: " + className);
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
- const data = (await this.getEntityData(options, ...selectors));
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 === this.getEntityClass('Entity')) {
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
- ...(0, utils_1.entityConstructorsToClassNames)(selectors),
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
- const data = await requester.GET({
182
- url: this.restUrl,
183
- dataType: 'json',
184
- data: {
185
- action: 'entities',
186
- data: [
187
- { ...options, class: options.class.class },
188
- ...(0, utils_1.entityConstructorsToClassNames)(selectors),
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: (0, utils_1.entitiesToReferences)((0, utils_1.entityConstructorsToClassNames)(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: (0, utils_1.entitiesToReferences)((0, utils_1.entityConstructorsToClassNames)(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
- exports.default = Nymph;
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
- exports.ClassNotAvailableError = ClassNotAvailableError;
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
- sort?: 'cdate' | 'mdate';
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']>;
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=Nymph.types.js.map
@@ -1,9 +1,12 @@
1
- import Nymph from './Nymph';
2
- import { NymphOptions, Options, Selector } from './Nymph.types';
3
- import { EntityConstructor, EntityInterface } from './Entity.types';
4
- import { PubSubCallbacks, PubSubConnectCallback, PubSubCountCallback, PubSubDisconnectCallback, PubSubEventType, PubSubRejectCallback, PubSubResolveCallback, PubSubSubscribable, PubSubUpdate } from './PubSub.types';
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<ReturnType<T['factorySync']>[]>>;
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<ReturnType<T['factorySync']> | null>>;
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(oldArr: EntityInterface[], update: PubSubUpdate<EntityInterface[]>): void;
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
- setToken(token: string | null): void;
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;