@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.
- package/__tests__/src/serializeSchema.test.ts +123 -0
- package/dist/commonjs/Reactor.d.ts +18 -1
- package/dist/commonjs/Reactor.d.ts.map +1 -1
- package/dist/commonjs/Reactor.js +108 -10
- package/dist/commonjs/Reactor.js.map +1 -1
- package/dist/commonjs/SyncTable.d.ts +140 -0
- package/dist/commonjs/SyncTable.d.ts.map +1 -0
- package/dist/commonjs/SyncTable.js +538 -0
- package/dist/commonjs/SyncTable.js.map +1 -0
- package/dist/commonjs/clientTypes.d.ts.map +1 -1
- package/dist/commonjs/clientTypes.js.map +1 -1
- package/dist/commonjs/createRouteHandler.d.ts +8 -0
- package/dist/commonjs/createRouteHandler.d.ts.map +1 -0
- package/dist/commonjs/createRouteHandler.js +57 -0
- package/dist/commonjs/createRouteHandler.js.map +1 -0
- package/dist/commonjs/framework.d.ts +75 -0
- package/dist/commonjs/framework.d.ts.map +1 -0
- package/dist/commonjs/framework.js +199 -0
- package/dist/commonjs/framework.js.map +1 -0
- package/dist/commonjs/index.d.ts +25 -1
- package/dist/commonjs/index.d.ts.map +1 -1
- package/dist/commonjs/index.js +25 -1
- package/dist/commonjs/index.js.map +1 -1
- package/dist/commonjs/instaql.d.ts +1 -0
- package/dist/commonjs/instaql.d.ts.map +1 -1
- package/dist/commonjs/instaql.js +9 -5
- package/dist/commonjs/instaql.js.map +1 -1
- package/dist/commonjs/parseSchemaFromJSON.d.ts +3 -0
- package/dist/commonjs/parseSchemaFromJSON.d.ts.map +1 -0
- package/dist/commonjs/parseSchemaFromJSON.js +148 -0
- package/dist/commonjs/parseSchemaFromJSON.js.map +1 -0
- package/dist/commonjs/store.d.ts +5 -0
- package/dist/commonjs/store.d.ts.map +1 -1
- package/dist/commonjs/store.js +11 -0
- package/dist/commonjs/store.js.map +1 -1
- package/dist/commonjs/utils/PersistedObject.d.ts +11 -5
- package/dist/commonjs/utils/PersistedObject.d.ts.map +1 -1
- package/dist/commonjs/utils/PersistedObject.js +12 -2
- package/dist/commonjs/utils/PersistedObject.js.map +1 -1
- package/dist/esm/Reactor.d.ts +18 -1
- package/dist/esm/Reactor.d.ts.map +1 -1
- package/dist/esm/Reactor.js +108 -10
- package/dist/esm/Reactor.js.map +1 -1
- package/dist/esm/SyncTable.d.ts +140 -0
- package/dist/esm/SyncTable.d.ts.map +1 -0
- package/dist/esm/SyncTable.js +498 -0
- package/dist/esm/SyncTable.js.map +1 -0
- package/dist/esm/clientTypes.d.ts.map +1 -1
- package/dist/esm/clientTypes.js.map +1 -1
- package/dist/esm/createRouteHandler.d.ts +8 -0
- package/dist/esm/createRouteHandler.d.ts.map +1 -0
- package/dist/esm/createRouteHandler.js +53 -0
- package/dist/esm/createRouteHandler.js.map +1 -0
- package/dist/esm/framework.d.ts +75 -0
- package/dist/esm/framework.d.ts.map +1 -0
- package/dist/esm/framework.js +159 -0
- package/dist/esm/framework.js.map +1 -0
- package/dist/esm/index.d.ts +25 -1
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +23 -2
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/instaql.d.ts +1 -0
- package/dist/esm/instaql.d.ts.map +1 -1
- package/dist/esm/instaql.js +8 -5
- package/dist/esm/instaql.js.map +1 -1
- package/dist/esm/parseSchemaFromJSON.d.ts +3 -0
- package/dist/esm/parseSchemaFromJSON.d.ts.map +1 -0
- package/dist/esm/parseSchemaFromJSON.js +144 -0
- package/dist/esm/parseSchemaFromJSON.js.map +1 -0
- package/dist/esm/store.d.ts +5 -0
- package/dist/esm/store.d.ts.map +1 -1
- package/dist/esm/store.js +9 -3
- package/dist/esm/store.js.map +1 -1
- package/dist/esm/utils/PersistedObject.d.ts +11 -5
- package/dist/esm/utils/PersistedObject.d.ts.map +1 -1
- package/dist/esm/utils/PersistedObject.js +12 -2
- package/dist/esm/utils/PersistedObject.js.map +1 -1
- package/dist/standalone/index.js +1833 -1089
- package/dist/standalone/index.umd.cjs +3 -3
- package/package.json +2 -2
- package/src/Reactor.js +135 -13
- package/src/SyncTable.ts +821 -0
- package/src/clientTypes.ts +5 -1
- package/src/createRouteHandler.ts +44 -0
- package/src/framework.ts +281 -0
- package/src/index.ts +56 -0
- package/src/instaql.js +11 -5
- package/src/parseSchemaFromJSON.ts +176 -0
- package/src/store.js +11 -3
- 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":"
|
|
1
|
+
{"version":3,"file":"Reactor.d.ts","sourceRoot":"","sources":["../../src/Reactor.js"],"names":[],"mappings":"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"}
|
package/dist/commonjs/Reactor.js
CHANGED
|
@@ -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
|
-
|
|
654
|
+
}
|
|
655
|
+
case 'add-query-exists': {
|
|
614
656
|
this.notifyOneQueryOnce((0, weakHash_ts_1.default)(msg.q));
|
|
615
657
|
break;
|
|
616
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1131
|
+
let store = result.store;
|
|
1132
|
+
const { pageInfo, aggregate, processedTxId } = result;
|
|
1059
1133
|
const mutations = this._rewriteMutationsSorted(store.attrs, pendingMutations);
|
|
1060
|
-
|
|
1061
|
-
|
|
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 = {};
|