@instantdb/core 0.22.56 → 0.22.57-experimental.drewh-ssr.19489928339.1

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 (90) hide show
  1. package/__tests__/src/serializeSchema.test.ts +123 -0
  2. package/dist/commonjs/Reactor.d.ts +18 -1
  3. package/dist/commonjs/Reactor.d.ts.map +1 -1
  4. package/dist/commonjs/Reactor.js +108 -10
  5. package/dist/commonjs/Reactor.js.map +1 -1
  6. package/dist/commonjs/SyncTable.d.ts +140 -0
  7. package/dist/commonjs/SyncTable.d.ts.map +1 -0
  8. package/dist/commonjs/SyncTable.js +538 -0
  9. package/dist/commonjs/SyncTable.js.map +1 -0
  10. package/dist/commonjs/clientTypes.d.ts.map +1 -1
  11. package/dist/commonjs/clientTypes.js.map +1 -1
  12. package/dist/commonjs/createRouteHandler.d.ts +8 -0
  13. package/dist/commonjs/createRouteHandler.d.ts.map +1 -0
  14. package/dist/commonjs/createRouteHandler.js +57 -0
  15. package/dist/commonjs/createRouteHandler.js.map +1 -0
  16. package/dist/commonjs/framework.d.ts +75 -0
  17. package/dist/commonjs/framework.d.ts.map +1 -0
  18. package/dist/commonjs/framework.js +199 -0
  19. package/dist/commonjs/framework.js.map +1 -0
  20. package/dist/commonjs/index.d.ts +25 -1
  21. package/dist/commonjs/index.d.ts.map +1 -1
  22. package/dist/commonjs/index.js +25 -1
  23. package/dist/commonjs/index.js.map +1 -1
  24. package/dist/commonjs/instaql.d.ts +1 -0
  25. package/dist/commonjs/instaql.d.ts.map +1 -1
  26. package/dist/commonjs/instaql.js +9 -5
  27. package/dist/commonjs/instaql.js.map +1 -1
  28. package/dist/commonjs/parseSchemaFromJSON.d.ts +3 -0
  29. package/dist/commonjs/parseSchemaFromJSON.d.ts.map +1 -0
  30. package/dist/commonjs/parseSchemaFromJSON.js +148 -0
  31. package/dist/commonjs/parseSchemaFromJSON.js.map +1 -0
  32. package/dist/commonjs/store.d.ts +5 -0
  33. package/dist/commonjs/store.d.ts.map +1 -1
  34. package/dist/commonjs/store.js +11 -0
  35. package/dist/commonjs/store.js.map +1 -1
  36. package/dist/commonjs/utils/PersistedObject.d.ts +11 -5
  37. package/dist/commonjs/utils/PersistedObject.d.ts.map +1 -1
  38. package/dist/commonjs/utils/PersistedObject.js +12 -2
  39. package/dist/commonjs/utils/PersistedObject.js.map +1 -1
  40. package/dist/esm/Reactor.d.ts +18 -1
  41. package/dist/esm/Reactor.d.ts.map +1 -1
  42. package/dist/esm/Reactor.js +108 -10
  43. package/dist/esm/Reactor.js.map +1 -1
  44. package/dist/esm/SyncTable.d.ts +140 -0
  45. package/dist/esm/SyncTable.d.ts.map +1 -0
  46. package/dist/esm/SyncTable.js +498 -0
  47. package/dist/esm/SyncTable.js.map +1 -0
  48. package/dist/esm/clientTypes.d.ts.map +1 -1
  49. package/dist/esm/clientTypes.js.map +1 -1
  50. package/dist/esm/createRouteHandler.d.ts +8 -0
  51. package/dist/esm/createRouteHandler.d.ts.map +1 -0
  52. package/dist/esm/createRouteHandler.js +53 -0
  53. package/dist/esm/createRouteHandler.js.map +1 -0
  54. package/dist/esm/framework.d.ts +75 -0
  55. package/dist/esm/framework.d.ts.map +1 -0
  56. package/dist/esm/framework.js +159 -0
  57. package/dist/esm/framework.js.map +1 -0
  58. package/dist/esm/index.d.ts +25 -1
  59. package/dist/esm/index.d.ts.map +1 -1
  60. package/dist/esm/index.js +23 -2
  61. package/dist/esm/index.js.map +1 -1
  62. package/dist/esm/instaql.d.ts +1 -0
  63. package/dist/esm/instaql.d.ts.map +1 -1
  64. package/dist/esm/instaql.js +8 -5
  65. package/dist/esm/instaql.js.map +1 -1
  66. package/dist/esm/parseSchemaFromJSON.d.ts +3 -0
  67. package/dist/esm/parseSchemaFromJSON.d.ts.map +1 -0
  68. package/dist/esm/parseSchemaFromJSON.js +144 -0
  69. package/dist/esm/parseSchemaFromJSON.js.map +1 -0
  70. package/dist/esm/store.d.ts +5 -0
  71. package/dist/esm/store.d.ts.map +1 -1
  72. package/dist/esm/store.js +9 -3
  73. package/dist/esm/store.js.map +1 -1
  74. package/dist/esm/utils/PersistedObject.d.ts +11 -5
  75. package/dist/esm/utils/PersistedObject.d.ts.map +1 -1
  76. package/dist/esm/utils/PersistedObject.js +12 -2
  77. package/dist/esm/utils/PersistedObject.js.map +1 -1
  78. package/dist/standalone/index.js +1833 -1089
  79. package/dist/standalone/index.umd.cjs +3 -3
  80. package/package.json +2 -2
  81. package/src/Reactor.js +135 -13
  82. package/src/SyncTable.ts +821 -0
  83. package/src/clientTypes.ts +5 -1
  84. package/src/createRouteHandler.ts +44 -0
  85. package/src/framework.ts +281 -0
  86. package/src/index.ts +56 -0
  87. package/src/instaql.js +11 -5
  88. package/src/parseSchemaFromJSON.ts +176 -0
  89. package/src/store.js +11 -3
  90. package/src/utils/PersistedObject.ts +15 -6
@@ -0,0 +1,123 @@
1
+ import { expect, test } from 'vitest';
2
+ import { i } from '../../src/schema';
3
+ import { parseSchemaFromJSON } from '../../src/parseSchemaFromJSON';
4
+ import { InstantSchemaDef } from '../../src/schemaTypes';
5
+
6
+ const schema = i.schema({
7
+ entities: {
8
+ users: i.entity({
9
+ name: i.string(),
10
+ email: i.string().indexed().unique(),
11
+ bio: i.string().optional(),
12
+ // this is a convenient way to typecheck custom JSON fields
13
+ // though we should probably have a backend solution for this
14
+ stuff: i.json<{ custom: string }>(),
15
+ junk: i.any(),
16
+ }),
17
+ posts: i.entity({
18
+ title: i.string().optional(),
19
+ body: i.string(),
20
+ }),
21
+ comments: i.entity({
22
+ body: i.string().indexed(),
23
+ likes: i.number(),
24
+ }),
25
+
26
+ birthdays: i.entity({
27
+ date: i.date(),
28
+ message: i.string(),
29
+ prizes: i.json<string | number>(),
30
+ }),
31
+ },
32
+ links: {
33
+ usersPosts: {
34
+ forward: {
35
+ on: 'users',
36
+ has: 'many',
37
+ label: 'posts',
38
+ },
39
+ reverse: {
40
+ on: 'posts',
41
+ has: 'one',
42
+ label: 'author',
43
+ },
44
+ },
45
+ postsComments: {
46
+ forward: {
47
+ on: 'posts',
48
+ has: 'many',
49
+ label: 'comments',
50
+ },
51
+ reverse: {
52
+ on: 'comments',
53
+ has: 'one',
54
+ label: 'post',
55
+ },
56
+ },
57
+ friendships: {
58
+ forward: {
59
+ on: 'users',
60
+ has: 'many',
61
+ label: 'friends',
62
+ },
63
+ reverse: {
64
+ on: 'users',
65
+ has: 'many',
66
+ label: '_friends',
67
+ },
68
+ },
69
+ referrals: {
70
+ forward: {
71
+ on: 'users',
72
+ has: 'many',
73
+ label: 'referred',
74
+ },
75
+ reverse: {
76
+ on: 'users',
77
+ has: 'one',
78
+ label: 'referrer',
79
+ },
80
+ },
81
+ },
82
+ rooms: {
83
+ chat: {
84
+ presence: i.entity({
85
+ name: i.string(),
86
+ status: i.string(),
87
+ }),
88
+ topics: {
89
+ sendEmoji: i.entity({
90
+ emoji: i.string(),
91
+ }),
92
+ },
93
+ },
94
+ },
95
+ });
96
+
97
+ type AnySchema = InstantSchemaDef<any, any, any>;
98
+
99
+ // compare schemas by stringifying them with json and comparing the strings
100
+ const compareSchemas = (schema1: AnySchema, schema2: AnySchema) => {
101
+ expect(JSON.stringify(schema1, null, 2)).toBe(
102
+ JSON.stringify(schema2, null, 2),
103
+ );
104
+ };
105
+
106
+ test('ability to parse stringified schema into real schema object', () => {
107
+ const stringified = JSON.stringify(schema, null, 2);
108
+ const parsed = JSON.parse(stringified);
109
+ console.log(stringified);
110
+
111
+ const otherSide = parseSchemaFromJSON(parsed);
112
+
113
+ compareSchemas(schema, otherSide);
114
+
115
+ expect(schema.entities.comments.links).toEqual(
116
+ otherSide.entities.comments.links,
117
+ );
118
+ expect(schema.entities.comments.asType).toEqual(
119
+ otherSide.entities.comments.asType,
120
+ );
121
+
122
+ expect(schema).toStrictEqual(otherSide);
123
+ });
@@ -75,6 +75,7 @@ export default class Reactor<RoomSchema extends import("./presence.ts").RoomSche
75
75
  _inFlightMutationEventIds: Set<any>;
76
76
  queryCacheLimit: any;
77
77
  versions: any;
78
+ _syncTable: SyncTable;
78
79
  _beforeUnload(): void;
79
80
  updateSchema(schema: any): void;
80
81
  _reactorStats(): {
@@ -107,6 +108,17 @@ export default class Reactor<RoomSchema extends import("./presence.ts").RoomSche
107
108
  */
108
109
  _onMergePendingMutations: (storageMuts: any, inMemoryMuts: any) => void;
109
110
  _flushEnqueuedRoomData(roomId: any): void;
111
+ /**
112
+ * Does the same thing as add-query-ok
113
+ * but called as a result of receiving query info from ssr
114
+ * @param {any} q
115
+ * @param {{ triples: any; pageInfo: any; }} result
116
+ * @param {boolean} enableCardinalityInference
117
+ */
118
+ _addQueryData(q: any, result: {
119
+ triples: any;
120
+ pageInfo: any;
121
+ }, enableCardinalityInference: boolean): void;
110
122
  _handleReceive(connId: any, msg: any): void;
111
123
  _sessionId: any;
112
124
  /**
@@ -125,6 +137,9 @@ export default class Reactor<RoomSchema extends import("./presence.ts").RoomSche
125
137
  _setAttrs(attrs: any): void;
126
138
  getPreviousResult: (q: any) => any;
127
139
  _startQuerySub(q: any, hash: any): string;
140
+ subscribeTable(q: any, cb: any): (opts?: {
141
+ keepSubscription?: boolean | null | undefined;
142
+ } | null | undefined) => void;
128
143
  /**
129
144
  * When a user subscribes to a query the following side effects occur:
130
145
  *
@@ -144,7 +159,7 @@ export default class Reactor<RoomSchema extends import("./presence.ts").RoomSche
144
159
  _rewriteMutationsSorted(attrs: any, muts: any): any[];
145
160
  optimisticAttrs(): any;
146
161
  /** Runs instaql on a query and a store */
147
- dataForQuery(hash: any): any;
162
+ dataForQuery(hash: any, applyOptimistic?: boolean): any;
148
163
  _applyOptimisticUpdates(store: any, mutations: any, processedTxId: any): any;
149
164
  /** Re-run instaql and call all callbacks with new data */
150
165
  notifyOne: (hash: any) => void;
@@ -238,6 +253,7 @@ export default class Reactor<RoomSchema extends import("./presence.ts").RoomSche
238
253
  }>;
239
254
  _hasCurrentUser(): Promise<boolean>;
240
255
  changeCurrentUser(newUser: any): Promise<void>;
256
+ syncUserToEndpoint(user: any): Promise<void>;
241
257
  updateUser(newUser: any): void;
242
258
  sendMagicCode({ email }: {
243
259
  email: any;
@@ -332,6 +348,7 @@ export type TransportType = import("./Connection.ts").TransportType;
332
348
  export type EventSourceConstructor = import("./Connection.ts").EventSourceConstructor;
333
349
  import { PersistedObject } from './utils/PersistedObject.ts';
334
350
  import { Deferred } from './utils/Deferred.js';
351
+ import { SyncTable } from './SyncTable.ts';
335
352
  import * as authAPI from './authAPI.ts';
336
353
  import * as StorageApi from './StorageAPI.ts';
337
354
  import IndexedDBStorage from './IndexedDBStorage.ts';
@@ -1 +1 @@
1
- {"version":3,"file":"Reactor.d.ts","sourceRoot":"","sources":["../../src/Reactor.js"],"names":[],"mappings":"AAuJA;;GAEG;AACH,6BAFwD,UAAU,SAArD,OAAQ,eAAe,EAAE,eAAgB;IA8DpD,sJA+FC;IA1JD,WAAM;IACN,mBAAiB;IACjB,qBAAoB;IACpB,eAA2B;IAE3B,8BAA8B;IAC9B,gCAAU;IACV,8BAA8B;IAC9B,uCAAiB;IAEjB,wEAAwE;IACxE,UADW,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC;QAAE,CAAC,EAAE,GAAG,CAAC;QAAC,EAAE,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,GAAG,CAAA;KAAE,CAAC,CAAC,CACtD;IACd,gFAAgF;IAChF,eADW,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC;QAAE,CAAC,EAAE,GAAG,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,QAAQ,CAAA;KAAE,CAAC,CAAC,CACzD;IACnB,eAAa;IACb,gBAAc;IACd,wBAAsB;IACtB,2BAAyB;IACzB,YAAO;IACP,gBAAW;IACX,qCAAkC;IAClC,yBAA2B;IAC3B,4BAAwB;IACxB,yBAAyB;IACzB,YADW,UAAU,CACV;IACX,4BAA4B;IAC5B,gBADW,aAAa,CACF;IAEtB,qCAAqC;IACrC,cADW,sBAAsB,CACpB;IACb,6BAA6B;IAC7B,OADW,OAAO,GAAG,IAAI,CACZ;IACb,qBAAsB;IACtB,mBAAqB;IACrB,yDAAyD;IACzD,wBADW,OAAO,CAAC,IAAI,GAAG;QAAC,KAAK,EAAE;YAAC,OAAO,EAAE,MAAM,CAAA;SAAC,CAAA;KAAC,CAAC,CACvB;IAE9B,+DAA+D;IAC/D,YADW,IAAI,GAAG,OAAO,sBAAsB,EAAE,SAAS,CACxC;IAElB,yCAAyC;IACzC,mBADU,gBAAgB,GAAG,SAAS,CACpB;IAElB,iEAAiE;IACjE,QADW,MAAM,CAAC,MAAM,EAAE;QAAC,WAAW,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,GAAG,CAAA;KAAC,CAAC,CACjD;IACZ,sCAAsC;IACtC,oBADW,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CACV;IACxB,cAAe;IACf,uBAAqB;IACrB,mBAAoB;IACpB;;;;MAA4E;IAC5E,wBAAsB;IACtB,uBAAwB;IACxB,qBAAqB;IACrB,MADW,MAAM,CACZ;IACL,8BAAyB;IACzB,sCAAiC;IACjC,oCAAsC;IAYpC,qBAAwD;IAYxD,cAAmE;IA0HrE,sBAIC;IAnDD,gCAOC;IAED;;;;MAMC;IAED,iCA4BC;IAQD;;;;OAIG;IACH,2BAJW,UAAU,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAI,OAAO,WACxD,MAAM,aACN;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,CAAA;KAAC,QA+B5E;IAED,wCAIC;IAED;;;;OAIG;IACH,oBAAqB,iBAAY,EAAE,iBAAY,UA0C7C;IAEF;;;OAGG;IACH,2BAA4B,gBAAW,EAAE,iBAAY,UAanD;IAEF,0CAgBC;IAED,4CAgNC;IA9LK,gBAAmC;IAgMzC;;;;OAIG;IACH,6BAJW,SAAS,GAAG,OAAO,WACnB,MAAM,YACN;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,CAAA;KAAC,QAoB3E;IAED,oCA2DC;IAED,oEAKC;IAED,4BAOC;IAKD,oBAAqB,MAAC,SAGpB;IAEF,0CAUC;IAED;;;;;;;;;OASG;IACH,uDAuBC;IAED,2CAwCC;IAED,sDAQC;IAED,8CAMC;IAED,uCAUC;IAaD,kEA6EC;IAED,sDAEC;IAKD,uBAoCC;IAED,0CAA0C;IAC1C,6BA2CC;IAED,6EAOC;IAED,0DAA0D;IAC1D,YAAa,SAAI,UASf;IAEF,qBAAsB,SAAI,UAQxB;IAEF,mBAAoB,SAAI,EAAE,UAAK,UAG7B;IAEF,mCAAmC;IACnC,kBAIC;IAED,wBAGC;IAED,wEAAwE;IACxE,SAAU,WAAM,kBAqBd;IAEF;;;;OAIG;IACH,UAAW,SAJA,GAIO,EAAE,QAHT,GAGc,kBAuBvB;IAEF,iBAIC;IAED;;;;;;OAMG;IACH,iDAqCC;IAKD,4DAA4D;IAC5D,8BA0BC;IAED;;OAEG;IACH,wCAgBC;IAED;;;;OAIG;IACH,wCAsBC;IAED,qCAKC;IAED,kDAkBC;IAED,mBAAoB,MAAC,UA+BnB;IAEF,sBAAuB,MAAC,UAmBtB;IAEF,oBAAqB,MAAC,UAWpB;IAEF,+BAsBE;IAEF,oBAAqB,MAAC,UAgCpB;IAEF,qBAqDC;IAED;;;;;;;;;OASG;IACH,oCAYC;IAID,8BAoDC;IAED;;;OAGG;IACH;;;;OA+CC;IAED;eA39CkC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAC;OA69ClD;IAED,+CAMC;IAED,mCAgBC;IAED,wBAMC;IAED,+CAQC;IAED,oCAUC;IAED,gCAEC;IAED,0CAEC;IAED,wBAIC;IAED,8CAEC;IAED,yCAEC;IAED;;;;MAEC;IAED,gCAGC;IAED;;;OAcC;IAED,oCAGC;IAED,+CAiBC;IAED,+BAcC;IAED;;+CAMC;IAED;;;wCAYC;IAED,uEAQC;IAED,iDAOC;IAED,8DAoBC;IAED,kCAIC;IAED;;;;;;;OAOG;IACH,oDAJG;QAAuB,UAAU,EAAzB,MAAM;QACS,WAAW,EAA1B,MAAM;KACd,GAAU,MAAM,CAKlB;IAED;;;;OAIG;IACH,6CAHG;QAAuB,IAAI,EAAnB,MAAM;QACU,YAAY,GAA5B,MAAM;KAChB,mCAaA;IAED,oBAGC;IAED;;;;;OAKG;IACH,kDAJG;QAAuB,UAAU,EAAzB,MAAM;QACS,OAAO,EAAtB,MAAM;QAC6B,KAAK,GAAxC,MAAM,GAAG,IAAI,GAAG,SAAS;KACnC,mCAeA;IAKD;;;;OAIG;IACH,iBAJW,MAAM,oBACN,GAAG,GAAG,IAAI,GAAG,SAAS,cA4BhC;IAED,gCAiBC;IAMD;;;;;;;;;;;MAUC;IAGD,oEAsBC;IAED,8CAMC;IAED,2CAGC;IAED,iCAEC;IAED,0DAKC;IAGD,8EAuBC;IAED,uCAIC;IAED,oDAaC;IAED,mDAyBC;IAED,gDAWC;IAKD;;;;;aAeC;IAED,uEAQC;IAED,6DAoBC;IAED,4DAWC;IAKD,oFAWC;IAED,8DAWC;IAKD,+CAaC;IAED,wCAWC;CACF;qBArtEa,OAAO,gBAAgB,EAAE,MAAM;;4BAE/B,OAAO,iBAAiB,EAAE,aAAa;qCACvC,OAAO,iBAAiB,EAAE,sBAAsB;gCAtB9B,4BAA4B;yBADnC,qBAAqB;yBAJrB,cAAc;4BACX,iBAAiB;6BAHhB,uBAAuB;kCAClB,4BAA4B"}
1
+ {"version":3,"file":"Reactor.d.ts","sourceRoot":"","sources":["../../src/Reactor.js"],"names":[],"mappings":"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"}
@@ -82,6 +82,7 @@ const InstantError_ts_1 = require("./InstantError.js");
82
82
  const fetch_ts_1 = require("./utils/fetch.js");
83
83
  const uuid_1 = require("uuid");
84
84
  const Connection_ts_1 = require("./Connection.js");
85
+ const SyncTable_ts_1 = require("./SyncTable.js");
85
86
  /** @typedef {import('./utils/log.ts').Logger} Logger */
86
87
  /** @typedef {import('./Connection.ts').Connection} Connection */
87
88
  /** @typedef {import('./Connection.ts').TransportType} TransportType */
@@ -473,9 +474,18 @@ class Reactor {
473
474
  }));
474
475
  }
475
476
  this._initStorage(Storage);
477
+ this._syncTable = new SyncTable_ts_1.SyncTable(this._trySendAuthed.bind(this), this._persister, {
478
+ useDateObjects: this.config.useDateObjects,
479
+ }, this._log, (triples) => s.createStore(this.attrs, triples, this.config.enableCardinalityInference, this._linkIndex, this.config.useDateObjects));
476
480
  this._oauthCallbackResponse = this._oauthLoginInit();
477
481
  // kick off a request to cache it
478
- this.getCurrentUser();
482
+ this.getCurrentUser().then((userInfo) => {
483
+ this.syncUserToEndpoint(userInfo.user);
484
+ });
485
+ setInterval(() => __awaiter(this, void 0, void 0, function* () {
486
+ const currentUser = yield this.getCurrentUser();
487
+ this.syncUserToEndpoint(currentUser.user);
488
+ }), 1000 * 60 * 20);
479
489
  NetworkListener.getIsOnline().then((isOnline) => {
480
490
  this._isOnline = isOnline;
481
491
  this._startSocket();
@@ -531,6 +541,7 @@ class Reactor {
531
541
  for (const cb of this._beforeUnloadCbs) {
532
542
  cb();
533
543
  }
544
+ this._syncTable.beforeUnload();
534
545
  }
535
546
  /**
536
547
  * @param {'enqueued' | 'pending' | 'synced' | 'timeout' | 'error' } status
@@ -586,6 +597,36 @@ class Reactor {
586
597
  }
587
598
  }
588
599
  }
600
+ /**
601
+ * Does the same thing as add-query-ok
602
+ * but called as a result of receiving query info from ssr
603
+ * @param {any} q
604
+ * @param {{ triples: any; pageInfo: any; }} result
605
+ * @param {boolean} enableCardinalityInference
606
+ */
607
+ _addQueryData(q, result, enableCardinalityInference) {
608
+ if (!this.attrs) {
609
+ throw new Error('Attrs in reactor have not been set');
610
+ }
611
+ const queryHash = (0, weakHash_ts_1.default)(q);
612
+ const store = s.createStore(this.attrs, result.triples, enableCardinalityInference, this._linkIndex, this.config.useDateObjects);
613
+ this.querySubs.set((prev) => {
614
+ prev[queryHash] = {
615
+ result: {
616
+ store,
617
+ pageInfo: result.pageInfo,
618
+ processedTxId: undefined,
619
+ isExternal: true,
620
+ },
621
+ q,
622
+ };
623
+ return prev;
624
+ });
625
+ this._cleanupPendingMutationsQueries();
626
+ this.notifyOne(queryHash);
627
+ this.notifyOneQueryOnce(queryHash);
628
+ this._cleanupPendingMutationsTimeout();
629
+ }
589
630
  _handleReceive(connId, msg) {
590
631
  var _a, _b, _c, _d, _e, _f;
591
632
  // opt-out, enabled by default if schema
@@ -597,7 +638,7 @@ class Reactor {
597
638
  this._log.info('[receive]', connId, msg.op, msg);
598
639
  }
599
640
  switch (msg.op) {
600
- case 'init-ok':
641
+ case 'init-ok': {
601
642
  this._setStatus(STATUS.AUTHENTICATED);
602
643
  this._reconnectTimeoutMs = 0;
603
644
  this._setAttrs(msg.attrs);
@@ -610,10 +651,12 @@ class Reactor {
610
651
  this._tryJoinRoom(roomId, enqueuedUserPresence);
611
652
  }
612
653
  break;
613
- case 'add-query-exists':
654
+ }
655
+ case 'add-query-exists': {
614
656
  this.notifyOneQueryOnce((0, weakHash_ts_1.default)(msg.q));
615
657
  break;
616
- case 'add-query-ok':
658
+ }
659
+ case 'add-query-ok': {
617
660
  const { q, result } = msg;
618
661
  const hash = (0, weakHash_ts_1.default)(q);
619
662
  const pageInfo = (_d = (_c = result === null || result === void 0 ? void 0 : result[0]) === null || _c === void 0 ? void 0 : _c.data) === null || _d === void 0 ? void 0 : _d['page-info'];
@@ -634,7 +677,24 @@ class Reactor {
634
677
  this.notifyOneQueryOnce(hash);
635
678
  this._cleanupPendingMutationsTimeout();
636
679
  break;
637
- case 'refresh-ok':
680
+ }
681
+ case 'start-sync-ok': {
682
+ this._syncTable.onStartSyncOk(msg);
683
+ break;
684
+ }
685
+ case 'sync-load-batch': {
686
+ this._syncTable.onSyncLoadBatch(msg);
687
+ break;
688
+ }
689
+ case 'sync-init-finish': {
690
+ this._syncTable.onSyncInitFinish(msg);
691
+ break;
692
+ }
693
+ case 'sync-update-triples': {
694
+ this._syncTable.onSyncUpdateTriples(msg);
695
+ break;
696
+ }
697
+ case 'refresh-ok': {
638
698
  const { computations, attrs } = msg;
639
699
  const processedTxId = msg['processed-tx-id'];
640
700
  if (attrs) {
@@ -672,6 +732,7 @@ class Reactor {
672
732
  this.notifyOne(hash);
673
733
  });
674
734
  break;
735
+ }
675
736
  case 'transact-ok': {
676
737
  const { 'client-event-id': eventId, 'tx-id': txId } = msg;
677
738
  this._inFlightMutationEventIds.delete(eventId);
@@ -746,6 +807,7 @@ class Reactor {
746
807
  this._handleReceiveError(msg);
747
808
  break;
748
809
  default:
810
+ this._log.info('Uknown op', msg.op, msg);
749
811
  break;
750
812
  }
751
813
  }
@@ -773,7 +835,7 @@ class Reactor {
773
835
  }
774
836
  }
775
837
  _handleReceiveError(msg) {
776
- var _a, _b, _c, _d, _e;
838
+ var _a, _b, _c, _d, _e, _f, _g;
777
839
  console.log('error', msg);
778
840
  const eventId = msg['client-event-id'];
779
841
  // This might not be a mutation, but it can't hurt to delete it
@@ -810,6 +872,14 @@ class Reactor {
810
872
  this.notifyAll();
811
873
  return;
812
874
  }
875
+ if (((_f = msg['original-event']) === null || _f === void 0 ? void 0 : _f.op) === 'resync-table') {
876
+ this._syncTable.onResyncError(msg);
877
+ return;
878
+ }
879
+ if (((_g = msg['original-event']) === null || _g === void 0 ? void 0 : _g.op) === 'start-sync') {
880
+ this._syncTable.onStartSyncError(msg);
881
+ return;
882
+ }
813
883
  // We've caught some error which has no corresponding listener.
814
884
  // Let's console.error to let the user know.
815
885
  const errorObj = Object.assign({}, msg);
@@ -845,6 +915,9 @@ class Reactor {
845
915
  this._trySendAuthed(eventId, { op: 'add-query', q });
846
916
  return eventId;
847
917
  }
918
+ subscribeTable(q, cb) {
919
+ return this._syncTable.subscribe(q, cb);
920
+ }
848
921
  /**
849
922
  * When a user subscribes to a query the following side effects occur:
850
923
  *
@@ -1033,7 +1106,7 @@ class Reactor {
1033
1106
  return attrsRecord;
1034
1107
  }
1035
1108
  /** Runs instaql on a query and a store */
1036
- dataForQuery(hash) {
1109
+ dataForQuery(hash, applyOptimistic = true) {
1037
1110
  const errorMessage = this._errorMessage;
1038
1111
  if (errorMessage) {
1039
1112
  return { error: errorMessage };
@@ -1055,10 +1128,13 @@ class Reactor {
1055
1128
  pendingMutationsVersion === cached.pendingMutationsVersion) {
1056
1129
  return cached.data;
1057
1130
  }
1058
- const { store, pageInfo, aggregate, processedTxId } = result;
1131
+ let store = result.store;
1132
+ const { pageInfo, aggregate, processedTxId } = result;
1059
1133
  const mutations = this._rewriteMutationsSorted(store.attrs, pendingMutations);
1060
- const newStore = this._applyOptimisticUpdates(store, mutations, processedTxId);
1061
- const resp = (0, instaql_js_1.default)({ store: newStore, pageInfo, aggregate }, q);
1134
+ if (applyOptimistic) {
1135
+ store = this._applyOptimisticUpdates(store, mutations, processedTxId);
1136
+ }
1137
+ const resp = (0, instaql_js_1.default)({ store: store, pageInfo, aggregate }, q);
1062
1138
  this._dataForQueryCache[hash] = {
1063
1139
  querySubVersion,
1064
1140
  pendingMutationsVersion,
@@ -1154,6 +1230,7 @@ class Reactor {
1154
1230
  this._sendMutation(eventId, mut);
1155
1231
  }
1156
1232
  });
1233
+ this._syncTable.flushPending();
1157
1234
  }
1158
1235
  /**
1159
1236
  * Clean up pendingMutations that all queries have seen
@@ -1512,7 +1589,28 @@ class Reactor {
1512
1589
  }
1513
1590
  });
1514
1591
  }
1592
+ syncUserToEndpoint(user) {
1593
+ return __awaiter(this, void 0, void 0, function* () {
1594
+ if (this.config.cookieEndpoint) {
1595
+ try {
1596
+ fetch(this.config.cookieEndpoint + '/sync-auth', {
1597
+ method: 'POST',
1598
+ body: JSON.stringify({
1599
+ user: user,
1600
+ }),
1601
+ headers: {
1602
+ 'Content-Type': 'application/json',
1603
+ },
1604
+ });
1605
+ }
1606
+ catch (error) {
1607
+ console.error('Error syncing user with external endpoint', error);
1608
+ }
1609
+ }
1610
+ });
1611
+ }
1515
1612
  updateUser(newUser) {
1613
+ this.syncUserToEndpoint(newUser);
1516
1614
  const newV = { error: undefined, user: newUser };
1517
1615
  this._currentUserCached = Object.assign({ isLoading: false }, newV);
1518
1616
  this._dataForQueryCache = {};