@instantdb/admin 0.22.40 → 0.22.41
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/dist/commonjs/subscribe.d.ts +2 -1
- package/dist/commonjs/subscribe.d.ts.map +1 -1
- package/dist/commonjs/subscribe.js +18 -0
- package/dist/commonjs/subscribe.js.map +1 -1
- package/dist/esm/subscribe.d.ts +2 -1
- package/dist/esm/subscribe.d.ts.map +1 -1
- package/dist/esm/subscribe.js +18 -0
- package/dist/esm/subscribe.js.map +1 -1
- package/package.json +3 -3
- package/src/subscribe.ts +35 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { InstantAPIError, InstantConfig, InstantSchemaDef, InstaQLResponse, ValidQuery } from '@instantdb/core';
|
|
1
|
+
import { InstantAPIError, InstantConfig, InstantSchemaDef, InstaQLResponse, ValidQuery, PageInfoResponse } from '@instantdb/core';
|
|
2
2
|
export type SubscriptionReadyState = 'closed' | 'connecting' | 'open';
|
|
3
3
|
export type SubscribeQuerySessionInfo = {
|
|
4
4
|
machineId: string;
|
|
@@ -7,6 +7,7 @@ export type SubscribeQuerySessionInfo = {
|
|
|
7
7
|
export type SubscribeQueryPayload<Schema extends InstantSchemaDef<any, any, any>, Q extends ValidQuery<Q, Schema>, Config extends InstantConfig<Schema, boolean> = InstantConfig<Schema, false>> = {
|
|
8
8
|
type: 'ok';
|
|
9
9
|
data: InstaQLResponse<Schema, Q, NonNullable<Config['useDateObjects']>>;
|
|
10
|
+
pageInfo: PageInfoResponse<Q>;
|
|
10
11
|
sessionInfo: SubscribeQuerySessionInfo | null;
|
|
11
12
|
} | {
|
|
12
13
|
type: 'error';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subscribe.d.ts","sourceRoot":"","sources":["../../src/subscribe.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,eAAe,EACf,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,UAAU,
|
|
1
|
+
{"version":3,"file":"subscribe.d.ts","sourceRoot":"","sources":["../../src/subscribe.ts"],"names":[],"mappings":"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"}
|
|
@@ -102,6 +102,21 @@ function multiReadFetchResponse(r) {
|
|
|
102
102
|
return p.then((x) => JSON.parse(x));
|
|
103
103
|
} });
|
|
104
104
|
}
|
|
105
|
+
function formatPageInfo(pageInfo) {
|
|
106
|
+
if (!pageInfo) {
|
|
107
|
+
return undefined;
|
|
108
|
+
}
|
|
109
|
+
const res = {};
|
|
110
|
+
for (const [k, v] of Object.entries(pageInfo)) {
|
|
111
|
+
res[k] = {
|
|
112
|
+
startCursor: v['start-cursor'],
|
|
113
|
+
endCursor: v['end-cursor'],
|
|
114
|
+
hasNextPage: v['has-next-page?'],
|
|
115
|
+
hasPreviousPage: v['has-previous-page?'],
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
return res;
|
|
119
|
+
}
|
|
105
120
|
function subscribe(query, cb, opts) {
|
|
106
121
|
let fetchErrorResponse;
|
|
107
122
|
let closed = false;
|
|
@@ -155,6 +170,7 @@ function subscribe(query, cb, opts) {
|
|
|
155
170
|
}
|
|
156
171
|
}
|
|
157
172
|
function handleMessage(msg) {
|
|
173
|
+
var _a, _b;
|
|
158
174
|
switch (msg.op) {
|
|
159
175
|
case 'sse-init': {
|
|
160
176
|
const machineId = msg['machine-id'];
|
|
@@ -166,6 +182,7 @@ function subscribe(query, cb, opts) {
|
|
|
166
182
|
deliver({
|
|
167
183
|
type: 'ok',
|
|
168
184
|
data: msg.result,
|
|
185
|
+
pageInfo: formatPageInfo((_a = msg['result-meta']) === null || _a === void 0 ? void 0 : _a['page-info']),
|
|
169
186
|
sessionInfo: sessionParams,
|
|
170
187
|
});
|
|
171
188
|
break;
|
|
@@ -175,6 +192,7 @@ function subscribe(query, cb, opts) {
|
|
|
175
192
|
deliver({
|
|
176
193
|
type: 'ok',
|
|
177
194
|
data: msg.computations[0]['instaql-result'],
|
|
195
|
+
pageInfo: formatPageInfo((_b = msg.computations[0]['result-meta']) === null || _b === void 0 ? void 0 : _b['page-info']),
|
|
178
196
|
sessionInfo: sessionParams,
|
|
179
197
|
});
|
|
180
198
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subscribe.js","sourceRoot":"","sources":["../../src/subscribe.ts"],"names":[],"mappings":"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","sourcesContent":["import { EventSource } from 'eventsource';\nimport version from './version.ts';\nimport {\n id,\n version as coreVersion,\n InstantAPIError,\n InstantConfig,\n InstantSchemaDef,\n InstaQLResponse,\n ValidQuery,\n} from '@instantdb/core';\n\nexport type SubscriptionReadyState = 'closed' | 'connecting' | 'open';\n\nexport type SubscribeQuerySessionInfo = {\n machineId: string;\n sessionId: string;\n};\n\nexport type SubscribeQueryPayload<\n Schema extends InstantSchemaDef<any, any, any>,\n Q extends ValidQuery<Q, Schema>,\n Config extends InstantConfig<Schema, boolean> = InstantConfig<Schema, false>,\n> =\n | {\n type: 'ok';\n data: InstaQLResponse<Schema, Q, NonNullable<Config['useDateObjects']>>;\n sessionInfo: SubscribeQuerySessionInfo | null;\n }\n | {\n type: 'error';\n error: InstantAPIError;\n readyState: SubscriptionReadyState;\n isClosed: boolean;\n sessionInfo: SubscribeQuerySessionInfo | null;\n };\n\nexport type SubscribeQueryCallback<\n Schema extends InstantSchemaDef<any, any, any>,\n Q extends ValidQuery<Q, Schema>,\n Config extends InstantConfig<Schema, boolean> = InstantConfig<Schema, false>,\n> = (payload: SubscribeQueryPayload<Schema, Q, Config>) => void;\n\nexport interface SubscribeQueryResponse<\n Schema extends InstantSchemaDef<any, any, any>,\n Q extends ValidQuery<Q, Schema>,\n Config extends InstantConfig<Schema, boolean> = InstantConfig<Schema, false>,\n> {\n /** Stop the subscription and close the connection. */\n close(): void;\n\n /** Warns when attempting to iterate synchronously */\n [Symbol.iterator](): never;\n\n /** Async iterator of query payloads */\n [Symbol.asyncIterator](): AsyncIterableIterator<\n SubscribeQueryPayload<Schema, Q, Config>\n >;\n\n /** Ready state of the connection */\n readonly readyState: SubscriptionReadyState;\n\n /** `true` if the connection is closed and no more payloads will be delivered */\n readonly isClosed: boolean;\n\n /** Debug info about the session. Will return null while the session is initializing. */\n readonly sessionInfo: SubscribeQuerySessionInfo | null;\n}\n\nfunction makeAsyncIterator<\n Schema extends InstantSchemaDef<any, any, any>,\n Q extends ValidQuery<Q, Schema>,\n Config extends InstantConfig<Schema, boolean> = InstantConfig<Schema, false>,\n>(\n subscribe: (cb: SubscribeQueryCallback<Schema, Q, Config>) => void,\n subscribeOnClose: (cb: () => void) => void,\n unsubscribe: (cb: SubscribeQueryCallback<Schema, Q, Config>) => void,\n readyState: () => SubscriptionReadyState,\n): AsyncGenerator<SubscribeQueryPayload<Schema, Q, Config>> {\n let wakeup = null;\n let closed = false;\n\n const backlog: SubscribeQueryPayload<Schema, Q, Config>[] = [];\n const handler: SubscribeQueryCallback<Schema, Q, Config> = (\n data: SubscribeQueryPayload<Schema, Q, Config>,\n ): void => {\n backlog.push(data);\n if (backlog.length > 100) {\n // Remove the oldest item to prevent the backlog\n // from growing forever. This is okay for live queries,\n // but we need some other machanism if we use this for\n // event-based subscriptions.\n backlog.shift();\n }\n if (wakeup) {\n wakeup();\n wakeup = null;\n }\n };\n\n subscribe(handler);\n\n const done = () => {\n unsubscribe(handler);\n return Promise.resolve({ done: true, value: undefined });\n };\n\n const onClose = () => {\n closed = true;\n if (wakeup) {\n wakeup();\n }\n done();\n };\n\n subscribeOnClose(onClose);\n\n const next = async () => {\n while (true) {\n if (readyState() === 'closed' || closed) {\n return done();\n }\n\n const nextValue = backlog.shift();\n if (nextValue) {\n return { value: nextValue, done: false };\n }\n\n const p = new Promise((resolve) => {\n wakeup = resolve;\n });\n\n await p;\n }\n };\n\n return {\n next,\n return: done,\n throw(error) {\n unsubscribe(handler);\n return Promise.reject(error);\n },\n [Symbol.asyncIterator]() {\n return this;\n },\n };\n}\n\nfunction esReadyState(es: EventSource): SubscriptionReadyState {\n switch (es.readyState) {\n case es.CLOSED: {\n return 'closed';\n }\n case es.CONNECTING: {\n return 'connecting';\n }\n case es.OPEN: {\n return 'open';\n }\n }\n}\n\nfunction multiReadFetchResponse(r) {\n let p = null;\n return {\n ...r,\n text() {\n if (!p) {\n p = r.text();\n }\n return p;\n },\n json() {\n if (!p) {\n p = r.text();\n }\n return p.then((x) => JSON.parse(x));\n },\n };\n}\n\nexport function subscribe<\n Schema extends InstantSchemaDef<any, any, any>,\n Q extends ValidQuery<Q, Schema>,\n Config extends InstantConfig<Schema, boolean> = InstantConfig<Schema, false>,\n>(\n query: Q,\n cb,\n opts: { headers: HeadersInit; inference: boolean; apiURI: string },\n): SubscribeQueryResponse<Schema, Q, Config> {\n let fetchErrorResponse;\n let closed = false;\n\n // Stable id that will stay the same across reconnects,\n // used for debugging\n const localConnectionId = id();\n\n const es = new EventSource(\n `${opts.apiURI}/admin/subscribe-query?local_connection_id=${localConnectionId}`,\n {\n fetch(input, init) {\n fetchErrorResponse = null;\n return fetch(input, {\n ...init,\n method: 'POST',\n headers: opts.headers,\n body: JSON.stringify({\n query: query,\n 'inference?': opts.inference,\n versions: {\n '@instantdb/admin': version,\n '@instantdb/core': coreVersion,\n },\n }),\n }).then((r) => {\n if (!r.ok) {\n fetchErrorResponse = multiReadFetchResponse(r);\n }\n return r;\n });\n },\n },\n );\n\n const subscribers: SubscribeQueryCallback<Schema, Q, Config>[] = [];\n const onCloseSubscribers = [];\n\n const subscribe = (cb) => {\n subscribers.push(cb);\n };\n\n const unsubscribe = (cb) => {\n subscribers.splice(subscribers.indexOf(cb), 1);\n };\n\n const subscribeOnClose = (cb) => {\n onCloseSubscribers.push(cb);\n };\n\n if (cb) {\n subscribe(cb);\n }\n\n let sessionParams: SubscribeQuerySessionInfo | null = null;\n\n function deliver(result: SubscribeQueryPayload<Schema, Q, Config>) {\n if (closed) {\n return;\n }\n for (const sub of subscribers) {\n try {\n sub(result);\n } catch (e) {\n console.error('Error in subscribeQuery callback', e);\n }\n }\n }\n\n function handleMessage(msg) {\n switch (msg.op) {\n case 'sse-init': {\n const machineId = msg['machine-id'];\n const sessionId = msg['session-id'];\n sessionParams = { machineId, sessionId };\n break;\n }\n case 'add-query-ok': {\n deliver({\n type: 'ok',\n data: msg.result,\n sessionInfo: sessionParams,\n });\n break;\n }\n case 'refresh-ok': {\n if (msg.computations.length) {\n deliver({\n type: 'ok',\n data: msg.computations[0]['instaql-result'],\n sessionInfo: sessionParams,\n });\n }\n break;\n }\n case 'error': {\n deliver({\n type: 'error',\n error: new InstantAPIError({ body: msg, status: msg.status }),\n get readyState() {\n return esReadyState(es);\n },\n get isClosed() {\n return esReadyState(es) === 'closed';\n },\n sessionInfo: sessionParams,\n });\n break;\n }\n }\n }\n\n es.onerror = (e) => {\n if (fetchErrorResponse) {\n fetchErrorResponse.text().then((t) => {\n let body = { type: undefined, message: t };\n try {\n body = JSON.parse(t);\n } catch (_e) {}\n deliver({\n type: 'error',\n error: new InstantAPIError({\n status: fetchErrorResponse.status,\n body,\n }),\n get readyState() {\n return esReadyState(es);\n },\n get isClosed() {\n return esReadyState(es) === 'closed';\n },\n sessionInfo: sessionParams,\n });\n });\n } else {\n const deliverError = () => {\n deliver({\n type: 'error',\n error: new InstantAPIError({\n status: e.code || 500,\n body: {\n type: undefined,\n message: e.message || 'Unknown error in subscribe query.',\n },\n }),\n get readyState() {\n return esReadyState(es);\n },\n get isClosed() {\n return esReadyState(es) === 'closed';\n },\n sessionInfo: sessionParams,\n });\n };\n if (es.readyState === EventSource.CLOSED) {\n deliverError();\n return;\n }\n\n setTimeout(() => {\n if (es.readyState !== EventSource.OPEN) {\n deliverError();\n }\n }, 5000);\n }\n };\n\n es.onmessage = (e) => {\n handleMessage(JSON.parse(e.data));\n };\n\n const close = () => {\n closed = true;\n for (const sub of onCloseSubscribers) {\n try {\n sub();\n } catch (e) {\n console.error('Error in onClose callback', e);\n }\n }\n es.close();\n };\n\n return {\n close: close,\n [Symbol.iterator]: () => {\n throw new Error(\n 'subscribeQuery does not support synchronous iteration. Use `for await` instead.',\n );\n },\n get sessionInfo() {\n return sessionParams;\n },\n get readyState() {\n return esReadyState(es);\n },\n get isClosed() {\n return esReadyState(es) === 'closed';\n },\n [Symbol.asyncIterator]: makeAsyncIterator.bind(\n this,\n subscribe,\n subscribeOnClose,\n unsubscribe,\n () => 1,\n ),\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"subscribe.js","sourceRoot":"","sources":["../../src/subscribe.ts"],"names":[],"mappings":"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","sourcesContent":["import { EventSource } from 'eventsource';\nimport version from './version.ts';\nimport {\n id,\n version as coreVersion,\n InstantAPIError,\n InstantConfig,\n InstantSchemaDef,\n InstaQLResponse,\n ValidQuery,\n PageInfoResponse,\n} from '@instantdb/core';\n\nexport type SubscriptionReadyState = 'closed' | 'connecting' | 'open';\n\nexport type SubscribeQuerySessionInfo = {\n machineId: string;\n sessionId: string;\n};\n\nexport type SubscribeQueryPayload<\n Schema extends InstantSchemaDef<any, any, any>,\n Q extends ValidQuery<Q, Schema>,\n Config extends InstantConfig<Schema, boolean> = InstantConfig<Schema, false>,\n> =\n | {\n type: 'ok';\n data: InstaQLResponse<Schema, Q, NonNullable<Config['useDateObjects']>>;\n pageInfo: PageInfoResponse<Q>;\n sessionInfo: SubscribeQuerySessionInfo | null;\n }\n | {\n type: 'error';\n error: InstantAPIError;\n readyState: SubscriptionReadyState;\n isClosed: boolean;\n sessionInfo: SubscribeQuerySessionInfo | null;\n };\n\nexport type SubscribeQueryCallback<\n Schema extends InstantSchemaDef<any, any, any>,\n Q extends ValidQuery<Q, Schema>,\n Config extends InstantConfig<Schema, boolean> = InstantConfig<Schema, false>,\n> = (payload: SubscribeQueryPayload<Schema, Q, Config>) => void;\n\nexport interface SubscribeQueryResponse<\n Schema extends InstantSchemaDef<any, any, any>,\n Q extends ValidQuery<Q, Schema>,\n Config extends InstantConfig<Schema, boolean> = InstantConfig<Schema, false>,\n> {\n /** Stop the subscription and close the connection. */\n close(): void;\n\n /** Warns when attempting to iterate synchronously */\n [Symbol.iterator](): never;\n\n /** Async iterator of query payloads */\n [Symbol.asyncIterator](): AsyncIterableIterator<\n SubscribeQueryPayload<Schema, Q, Config>\n >;\n\n /** Ready state of the connection */\n readonly readyState: SubscriptionReadyState;\n\n /** `true` if the connection is closed and no more payloads will be delivered */\n readonly isClosed: boolean;\n\n /** Debug info about the session. Will return null while the session is initializing. */\n readonly sessionInfo: SubscribeQuerySessionInfo | null;\n}\n\nfunction makeAsyncIterator<\n Schema extends InstantSchemaDef<any, any, any>,\n Q extends ValidQuery<Q, Schema>,\n Config extends InstantConfig<Schema, boolean> = InstantConfig<Schema, false>,\n>(\n subscribe: (cb: SubscribeQueryCallback<Schema, Q, Config>) => void,\n subscribeOnClose: (cb: () => void) => void,\n unsubscribe: (cb: SubscribeQueryCallback<Schema, Q, Config>) => void,\n readyState: () => SubscriptionReadyState,\n): AsyncGenerator<SubscribeQueryPayload<Schema, Q, Config>> {\n let wakeup = null;\n let closed = false;\n\n const backlog: SubscribeQueryPayload<Schema, Q, Config>[] = [];\n const handler: SubscribeQueryCallback<Schema, Q, Config> = (\n data: SubscribeQueryPayload<Schema, Q, Config>,\n ): void => {\n backlog.push(data);\n if (backlog.length > 100) {\n // Remove the oldest item to prevent the backlog\n // from growing forever. This is okay for live queries,\n // but we need some other machanism if we use this for\n // event-based subscriptions.\n backlog.shift();\n }\n if (wakeup) {\n wakeup();\n wakeup = null;\n }\n };\n\n subscribe(handler);\n\n const done = () => {\n unsubscribe(handler);\n return Promise.resolve({ done: true, value: undefined });\n };\n\n const onClose = () => {\n closed = true;\n if (wakeup) {\n wakeup();\n }\n done();\n };\n\n subscribeOnClose(onClose);\n\n const next = async () => {\n while (true) {\n if (readyState() === 'closed' || closed) {\n return done();\n }\n\n const nextValue = backlog.shift();\n if (nextValue) {\n return { value: nextValue, done: false };\n }\n\n const p = new Promise((resolve) => {\n wakeup = resolve;\n });\n\n await p;\n }\n };\n\n return {\n next,\n return: done,\n throw(error) {\n unsubscribe(handler);\n return Promise.reject(error);\n },\n [Symbol.asyncIterator]() {\n return this;\n },\n };\n}\n\nfunction esReadyState(es: EventSource): SubscriptionReadyState {\n switch (es.readyState) {\n case es.CLOSED: {\n return 'closed';\n }\n case es.CONNECTING: {\n return 'connecting';\n }\n case es.OPEN: {\n return 'open';\n }\n }\n}\n\nfunction multiReadFetchResponse(r) {\n let p = null;\n return {\n ...r,\n text() {\n if (!p) {\n p = r.text();\n }\n return p;\n },\n json() {\n if (!p) {\n p = r.text();\n }\n return p.then((x) => JSON.parse(x));\n },\n };\n}\n\ntype APIPageInfo = {\n [etype: string]: {\n 'start-cursor': [string, string, any, number];\n 'end-cursor': [string, string, any, number];\n 'has-next-page?': boolean;\n 'has-previous-page?': boolean;\n };\n};\n\nfunction formatPageInfo(\n pageInfo: APIPageInfo | null | undefined,\n): PageInfoResponse<any> | undefined {\n if (!pageInfo) {\n return undefined;\n }\n const res: PageInfoResponse<any> = {};\n\n for (const [k, v] of Object.entries(pageInfo)) {\n res[k] = {\n startCursor: v['start-cursor'],\n endCursor: v['end-cursor'],\n hasNextPage: v['has-next-page?'],\n hasPreviousPage: v['has-previous-page?'],\n };\n }\n\n return res;\n}\n\nexport function subscribe<\n Schema extends InstantSchemaDef<any, any, any>,\n Q extends ValidQuery<Q, Schema>,\n Config extends InstantConfig<Schema, boolean> = InstantConfig<Schema, false>,\n>(\n query: Q,\n cb,\n opts: { headers: HeadersInit; inference: boolean; apiURI: string },\n): SubscribeQueryResponse<Schema, Q, Config> {\n let fetchErrorResponse;\n let closed = false;\n\n // Stable id that will stay the same across reconnects,\n // used for debugging\n const localConnectionId = id();\n\n const es = new EventSource(\n `${opts.apiURI}/admin/subscribe-query?local_connection_id=${localConnectionId}`,\n {\n fetch(input, init) {\n fetchErrorResponse = null;\n return fetch(input, {\n ...init,\n method: 'POST',\n headers: opts.headers,\n body: JSON.stringify({\n query: query,\n 'inference?': opts.inference,\n versions: {\n '@instantdb/admin': version,\n '@instantdb/core': coreVersion,\n },\n }),\n }).then((r) => {\n if (!r.ok) {\n fetchErrorResponse = multiReadFetchResponse(r);\n }\n return r;\n });\n },\n },\n );\n\n const subscribers: SubscribeQueryCallback<Schema, Q, Config>[] = [];\n const onCloseSubscribers = [];\n\n const subscribe = (cb) => {\n subscribers.push(cb);\n };\n\n const unsubscribe = (cb) => {\n subscribers.splice(subscribers.indexOf(cb), 1);\n };\n\n const subscribeOnClose = (cb) => {\n onCloseSubscribers.push(cb);\n };\n\n if (cb) {\n subscribe(cb);\n }\n\n let sessionParams: SubscribeQuerySessionInfo | null = null;\n\n function deliver(result: SubscribeQueryPayload<Schema, Q, Config>) {\n if (closed) {\n return;\n }\n for (const sub of subscribers) {\n try {\n sub(result);\n } catch (e) {\n console.error('Error in subscribeQuery callback', e);\n }\n }\n }\n\n function handleMessage(msg) {\n switch (msg.op) {\n case 'sse-init': {\n const machineId = msg['machine-id'];\n const sessionId = msg['session-id'];\n sessionParams = { machineId, sessionId };\n break;\n }\n case 'add-query-ok': {\n deliver({\n type: 'ok',\n data: msg.result,\n pageInfo: formatPageInfo(msg['result-meta']?.['page-info']),\n sessionInfo: sessionParams,\n });\n break;\n }\n case 'refresh-ok': {\n if (msg.computations.length) {\n deliver({\n type: 'ok',\n data: msg.computations[0]['instaql-result'],\n pageInfo: formatPageInfo(\n msg.computations[0]['result-meta']?.['page-info'],\n ),\n sessionInfo: sessionParams,\n });\n }\n break;\n }\n case 'error': {\n deliver({\n type: 'error',\n error: new InstantAPIError({ body: msg, status: msg.status }),\n get readyState() {\n return esReadyState(es);\n },\n get isClosed() {\n return esReadyState(es) === 'closed';\n },\n sessionInfo: sessionParams,\n });\n break;\n }\n }\n }\n\n es.onerror = (e) => {\n if (fetchErrorResponse) {\n fetchErrorResponse.text().then((t) => {\n let body = { type: undefined, message: t };\n try {\n body = JSON.parse(t);\n } catch (_e) {}\n deliver({\n type: 'error',\n error: new InstantAPIError({\n status: fetchErrorResponse.status,\n body,\n }),\n get readyState() {\n return esReadyState(es);\n },\n get isClosed() {\n return esReadyState(es) === 'closed';\n },\n sessionInfo: sessionParams,\n });\n });\n } else {\n const deliverError = () => {\n deliver({\n type: 'error',\n error: new InstantAPIError({\n status: e.code || 500,\n body: {\n type: undefined,\n message: e.message || 'Unknown error in subscribe query.',\n },\n }),\n get readyState() {\n return esReadyState(es);\n },\n get isClosed() {\n return esReadyState(es) === 'closed';\n },\n sessionInfo: sessionParams,\n });\n };\n if (es.readyState === EventSource.CLOSED) {\n deliverError();\n return;\n }\n\n setTimeout(() => {\n if (es.readyState !== EventSource.OPEN) {\n deliverError();\n }\n }, 5000);\n }\n };\n\n es.onmessage = (e) => {\n handleMessage(JSON.parse(e.data));\n };\n\n const close = () => {\n closed = true;\n for (const sub of onCloseSubscribers) {\n try {\n sub();\n } catch (e) {\n console.error('Error in onClose callback', e);\n }\n }\n es.close();\n };\n\n return {\n close: close,\n [Symbol.iterator]: () => {\n throw new Error(\n 'subscribeQuery does not support synchronous iteration. Use `for await` instead.',\n );\n },\n get sessionInfo() {\n return sessionParams;\n },\n get readyState() {\n return esReadyState(es);\n },\n get isClosed() {\n return esReadyState(es) === 'closed';\n },\n [Symbol.asyncIterator]: makeAsyncIterator.bind(\n this,\n subscribe,\n subscribeOnClose,\n unsubscribe,\n () => 1,\n ),\n };\n}\n"]}
|
package/dist/esm/subscribe.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { InstantAPIError, InstantConfig, InstantSchemaDef, InstaQLResponse, ValidQuery } from '@instantdb/core';
|
|
1
|
+
import { InstantAPIError, InstantConfig, InstantSchemaDef, InstaQLResponse, ValidQuery, PageInfoResponse } from '@instantdb/core';
|
|
2
2
|
export type SubscriptionReadyState = 'closed' | 'connecting' | 'open';
|
|
3
3
|
export type SubscribeQuerySessionInfo = {
|
|
4
4
|
machineId: string;
|
|
@@ -7,6 +7,7 @@ export type SubscribeQuerySessionInfo = {
|
|
|
7
7
|
export type SubscribeQueryPayload<Schema extends InstantSchemaDef<any, any, any>, Q extends ValidQuery<Q, Schema>, Config extends InstantConfig<Schema, boolean> = InstantConfig<Schema, false>> = {
|
|
8
8
|
type: 'ok';
|
|
9
9
|
data: InstaQLResponse<Schema, Q, NonNullable<Config['useDateObjects']>>;
|
|
10
|
+
pageInfo: PageInfoResponse<Q>;
|
|
10
11
|
sessionInfo: SubscribeQuerySessionInfo | null;
|
|
11
12
|
} | {
|
|
12
13
|
type: 'error';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subscribe.d.ts","sourceRoot":"","sources":["../../src/subscribe.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,eAAe,EACf,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,UAAU,
|
|
1
|
+
{"version":3,"file":"subscribe.d.ts","sourceRoot":"","sources":["../../src/subscribe.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/subscribe.js
CHANGED
|
@@ -96,6 +96,21 @@ function multiReadFetchResponse(r) {
|
|
|
96
96
|
return p.then((x) => JSON.parse(x));
|
|
97
97
|
} });
|
|
98
98
|
}
|
|
99
|
+
function formatPageInfo(pageInfo) {
|
|
100
|
+
if (!pageInfo) {
|
|
101
|
+
return undefined;
|
|
102
|
+
}
|
|
103
|
+
const res = {};
|
|
104
|
+
for (const [k, v] of Object.entries(pageInfo)) {
|
|
105
|
+
res[k] = {
|
|
106
|
+
startCursor: v['start-cursor'],
|
|
107
|
+
endCursor: v['end-cursor'],
|
|
108
|
+
hasNextPage: v['has-next-page?'],
|
|
109
|
+
hasPreviousPage: v['has-previous-page?'],
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
return res;
|
|
113
|
+
}
|
|
99
114
|
export function subscribe(query, cb, opts) {
|
|
100
115
|
let fetchErrorResponse;
|
|
101
116
|
let closed = false;
|
|
@@ -149,6 +164,7 @@ export function subscribe(query, cb, opts) {
|
|
|
149
164
|
}
|
|
150
165
|
}
|
|
151
166
|
function handleMessage(msg) {
|
|
167
|
+
var _a, _b;
|
|
152
168
|
switch (msg.op) {
|
|
153
169
|
case 'sse-init': {
|
|
154
170
|
const machineId = msg['machine-id'];
|
|
@@ -160,6 +176,7 @@ export function subscribe(query, cb, opts) {
|
|
|
160
176
|
deliver({
|
|
161
177
|
type: 'ok',
|
|
162
178
|
data: msg.result,
|
|
179
|
+
pageInfo: formatPageInfo((_a = msg['result-meta']) === null || _a === void 0 ? void 0 : _a['page-info']),
|
|
163
180
|
sessionInfo: sessionParams,
|
|
164
181
|
});
|
|
165
182
|
break;
|
|
@@ -169,6 +186,7 @@ export function subscribe(query, cb, opts) {
|
|
|
169
186
|
deliver({
|
|
170
187
|
type: 'ok',
|
|
171
188
|
data: msg.computations[0]['instaql-result'],
|
|
189
|
+
pageInfo: formatPageInfo((_b = msg.computations[0]['result-meta']) === null || _b === void 0 ? void 0 : _b['page-info']),
|
|
172
190
|
sessionInfo: sessionParams,
|
|
173
191
|
});
|
|
174
192
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subscribe.js","sourceRoot":"","sources":["../../src/subscribe.ts"],"names":[],"mappings":"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","sourcesContent":["import { EventSource } from 'eventsource';\nimport version from './version.ts';\nimport {\n id,\n version as coreVersion,\n InstantAPIError,\n InstantConfig,\n InstantSchemaDef,\n InstaQLResponse,\n ValidQuery,\n} from '@instantdb/core';\n\nexport type SubscriptionReadyState = 'closed' | 'connecting' | 'open';\n\nexport type SubscribeQuerySessionInfo = {\n machineId: string;\n sessionId: string;\n};\n\nexport type SubscribeQueryPayload<\n Schema extends InstantSchemaDef<any, any, any>,\n Q extends ValidQuery<Q, Schema>,\n Config extends InstantConfig<Schema, boolean> = InstantConfig<Schema, false>,\n> =\n | {\n type: 'ok';\n data: InstaQLResponse<Schema, Q, NonNullable<Config['useDateObjects']>>;\n sessionInfo: SubscribeQuerySessionInfo | null;\n }\n | {\n type: 'error';\n error: InstantAPIError;\n readyState: SubscriptionReadyState;\n isClosed: boolean;\n sessionInfo: SubscribeQuerySessionInfo | null;\n };\n\nexport type SubscribeQueryCallback<\n Schema extends InstantSchemaDef<any, any, any>,\n Q extends ValidQuery<Q, Schema>,\n Config extends InstantConfig<Schema, boolean> = InstantConfig<Schema, false>,\n> = (payload: SubscribeQueryPayload<Schema, Q, Config>) => void;\n\nexport interface SubscribeQueryResponse<\n Schema extends InstantSchemaDef<any, any, any>,\n Q extends ValidQuery<Q, Schema>,\n Config extends InstantConfig<Schema, boolean> = InstantConfig<Schema, false>,\n> {\n /** Stop the subscription and close the connection. */\n close(): void;\n\n /** Warns when attempting to iterate synchronously */\n [Symbol.iterator](): never;\n\n /** Async iterator of query payloads */\n [Symbol.asyncIterator](): AsyncIterableIterator<\n SubscribeQueryPayload<Schema, Q, Config>\n >;\n\n /** Ready state of the connection */\n readonly readyState: SubscriptionReadyState;\n\n /** `true` if the connection is closed and no more payloads will be delivered */\n readonly isClosed: boolean;\n\n /** Debug info about the session. Will return null while the session is initializing. */\n readonly sessionInfo: SubscribeQuerySessionInfo | null;\n}\n\nfunction makeAsyncIterator<\n Schema extends InstantSchemaDef<any, any, any>,\n Q extends ValidQuery<Q, Schema>,\n Config extends InstantConfig<Schema, boolean> = InstantConfig<Schema, false>,\n>(\n subscribe: (cb: SubscribeQueryCallback<Schema, Q, Config>) => void,\n subscribeOnClose: (cb: () => void) => void,\n unsubscribe: (cb: SubscribeQueryCallback<Schema, Q, Config>) => void,\n readyState: () => SubscriptionReadyState,\n): AsyncGenerator<SubscribeQueryPayload<Schema, Q, Config>> {\n let wakeup = null;\n let closed = false;\n\n const backlog: SubscribeQueryPayload<Schema, Q, Config>[] = [];\n const handler: SubscribeQueryCallback<Schema, Q, Config> = (\n data: SubscribeQueryPayload<Schema, Q, Config>,\n ): void => {\n backlog.push(data);\n if (backlog.length > 100) {\n // Remove the oldest item to prevent the backlog\n // from growing forever. This is okay for live queries,\n // but we need some other machanism if we use this for\n // event-based subscriptions.\n backlog.shift();\n }\n if (wakeup) {\n wakeup();\n wakeup = null;\n }\n };\n\n subscribe(handler);\n\n const done = () => {\n unsubscribe(handler);\n return Promise.resolve({ done: true, value: undefined });\n };\n\n const onClose = () => {\n closed = true;\n if (wakeup) {\n wakeup();\n }\n done();\n };\n\n subscribeOnClose(onClose);\n\n const next = async () => {\n while (true) {\n if (readyState() === 'closed' || closed) {\n return done();\n }\n\n const nextValue = backlog.shift();\n if (nextValue) {\n return { value: nextValue, done: false };\n }\n\n const p = new Promise((resolve) => {\n wakeup = resolve;\n });\n\n await p;\n }\n };\n\n return {\n next,\n return: done,\n throw(error) {\n unsubscribe(handler);\n return Promise.reject(error);\n },\n [Symbol.asyncIterator]() {\n return this;\n },\n };\n}\n\nfunction esReadyState(es: EventSource): SubscriptionReadyState {\n switch (es.readyState) {\n case es.CLOSED: {\n return 'closed';\n }\n case es.CONNECTING: {\n return 'connecting';\n }\n case es.OPEN: {\n return 'open';\n }\n }\n}\n\nfunction multiReadFetchResponse(r) {\n let p = null;\n return {\n ...r,\n text() {\n if (!p) {\n p = r.text();\n }\n return p;\n },\n json() {\n if (!p) {\n p = r.text();\n }\n return p.then((x) => JSON.parse(x));\n },\n };\n}\n\nexport function subscribe<\n Schema extends InstantSchemaDef<any, any, any>,\n Q extends ValidQuery<Q, Schema>,\n Config extends InstantConfig<Schema, boolean> = InstantConfig<Schema, false>,\n>(\n query: Q,\n cb,\n opts: { headers: HeadersInit; inference: boolean; apiURI: string },\n): SubscribeQueryResponse<Schema, Q, Config> {\n let fetchErrorResponse;\n let closed = false;\n\n // Stable id that will stay the same across reconnects,\n // used for debugging\n const localConnectionId = id();\n\n const es = new EventSource(\n `${opts.apiURI}/admin/subscribe-query?local_connection_id=${localConnectionId}`,\n {\n fetch(input, init) {\n fetchErrorResponse = null;\n return fetch(input, {\n ...init,\n method: 'POST',\n headers: opts.headers,\n body: JSON.stringify({\n query: query,\n 'inference?': opts.inference,\n versions: {\n '@instantdb/admin': version,\n '@instantdb/core': coreVersion,\n },\n }),\n }).then((r) => {\n if (!r.ok) {\n fetchErrorResponse = multiReadFetchResponse(r);\n }\n return r;\n });\n },\n },\n );\n\n const subscribers: SubscribeQueryCallback<Schema, Q, Config>[] = [];\n const onCloseSubscribers = [];\n\n const subscribe = (cb) => {\n subscribers.push(cb);\n };\n\n const unsubscribe = (cb) => {\n subscribers.splice(subscribers.indexOf(cb), 1);\n };\n\n const subscribeOnClose = (cb) => {\n onCloseSubscribers.push(cb);\n };\n\n if (cb) {\n subscribe(cb);\n }\n\n let sessionParams: SubscribeQuerySessionInfo | null = null;\n\n function deliver(result: SubscribeQueryPayload<Schema, Q, Config>) {\n if (closed) {\n return;\n }\n for (const sub of subscribers) {\n try {\n sub(result);\n } catch (e) {\n console.error('Error in subscribeQuery callback', e);\n }\n }\n }\n\n function handleMessage(msg) {\n switch (msg.op) {\n case 'sse-init': {\n const machineId = msg['machine-id'];\n const sessionId = msg['session-id'];\n sessionParams = { machineId, sessionId };\n break;\n }\n case 'add-query-ok': {\n deliver({\n type: 'ok',\n data: msg.result,\n sessionInfo: sessionParams,\n });\n break;\n }\n case 'refresh-ok': {\n if (msg.computations.length) {\n deliver({\n type: 'ok',\n data: msg.computations[0]['instaql-result'],\n sessionInfo: sessionParams,\n });\n }\n break;\n }\n case 'error': {\n deliver({\n type: 'error',\n error: new InstantAPIError({ body: msg, status: msg.status }),\n get readyState() {\n return esReadyState(es);\n },\n get isClosed() {\n return esReadyState(es) === 'closed';\n },\n sessionInfo: sessionParams,\n });\n break;\n }\n }\n }\n\n es.onerror = (e) => {\n if (fetchErrorResponse) {\n fetchErrorResponse.text().then((t) => {\n let body = { type: undefined, message: t };\n try {\n body = JSON.parse(t);\n } catch (_e) {}\n deliver({\n type: 'error',\n error: new InstantAPIError({\n status: fetchErrorResponse.status,\n body,\n }),\n get readyState() {\n return esReadyState(es);\n },\n get isClosed() {\n return esReadyState(es) === 'closed';\n },\n sessionInfo: sessionParams,\n });\n });\n } else {\n const deliverError = () => {\n deliver({\n type: 'error',\n error: new InstantAPIError({\n status: e.code || 500,\n body: {\n type: undefined,\n message: e.message || 'Unknown error in subscribe query.',\n },\n }),\n get readyState() {\n return esReadyState(es);\n },\n get isClosed() {\n return esReadyState(es) === 'closed';\n },\n sessionInfo: sessionParams,\n });\n };\n if (es.readyState === EventSource.CLOSED) {\n deliverError();\n return;\n }\n\n setTimeout(() => {\n if (es.readyState !== EventSource.OPEN) {\n deliverError();\n }\n }, 5000);\n }\n };\n\n es.onmessage = (e) => {\n handleMessage(JSON.parse(e.data));\n };\n\n const close = () => {\n closed = true;\n for (const sub of onCloseSubscribers) {\n try {\n sub();\n } catch (e) {\n console.error('Error in onClose callback', e);\n }\n }\n es.close();\n };\n\n return {\n close: close,\n [Symbol.iterator]: () => {\n throw new Error(\n 'subscribeQuery does not support synchronous iteration. Use `for await` instead.',\n );\n },\n get sessionInfo() {\n return sessionParams;\n },\n get readyState() {\n return esReadyState(es);\n },\n get isClosed() {\n return esReadyState(es) === 'closed';\n },\n [Symbol.asyncIterator]: makeAsyncIterator.bind(\n this,\n subscribe,\n subscribeOnClose,\n unsubscribe,\n () => 1,\n ),\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"subscribe.js","sourceRoot":"","sources":["../../src/subscribe.ts"],"names":[],"mappings":"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","sourcesContent":["import { EventSource } from 'eventsource';\nimport version from './version.ts';\nimport {\n id,\n version as coreVersion,\n InstantAPIError,\n InstantConfig,\n InstantSchemaDef,\n InstaQLResponse,\n ValidQuery,\n PageInfoResponse,\n} from '@instantdb/core';\n\nexport type SubscriptionReadyState = 'closed' | 'connecting' | 'open';\n\nexport type SubscribeQuerySessionInfo = {\n machineId: string;\n sessionId: string;\n};\n\nexport type SubscribeQueryPayload<\n Schema extends InstantSchemaDef<any, any, any>,\n Q extends ValidQuery<Q, Schema>,\n Config extends InstantConfig<Schema, boolean> = InstantConfig<Schema, false>,\n> =\n | {\n type: 'ok';\n data: InstaQLResponse<Schema, Q, NonNullable<Config['useDateObjects']>>;\n pageInfo: PageInfoResponse<Q>;\n sessionInfo: SubscribeQuerySessionInfo | null;\n }\n | {\n type: 'error';\n error: InstantAPIError;\n readyState: SubscriptionReadyState;\n isClosed: boolean;\n sessionInfo: SubscribeQuerySessionInfo | null;\n };\n\nexport type SubscribeQueryCallback<\n Schema extends InstantSchemaDef<any, any, any>,\n Q extends ValidQuery<Q, Schema>,\n Config extends InstantConfig<Schema, boolean> = InstantConfig<Schema, false>,\n> = (payload: SubscribeQueryPayload<Schema, Q, Config>) => void;\n\nexport interface SubscribeQueryResponse<\n Schema extends InstantSchemaDef<any, any, any>,\n Q extends ValidQuery<Q, Schema>,\n Config extends InstantConfig<Schema, boolean> = InstantConfig<Schema, false>,\n> {\n /** Stop the subscription and close the connection. */\n close(): void;\n\n /** Warns when attempting to iterate synchronously */\n [Symbol.iterator](): never;\n\n /** Async iterator of query payloads */\n [Symbol.asyncIterator](): AsyncIterableIterator<\n SubscribeQueryPayload<Schema, Q, Config>\n >;\n\n /** Ready state of the connection */\n readonly readyState: SubscriptionReadyState;\n\n /** `true` if the connection is closed and no more payloads will be delivered */\n readonly isClosed: boolean;\n\n /** Debug info about the session. Will return null while the session is initializing. */\n readonly sessionInfo: SubscribeQuerySessionInfo | null;\n}\n\nfunction makeAsyncIterator<\n Schema extends InstantSchemaDef<any, any, any>,\n Q extends ValidQuery<Q, Schema>,\n Config extends InstantConfig<Schema, boolean> = InstantConfig<Schema, false>,\n>(\n subscribe: (cb: SubscribeQueryCallback<Schema, Q, Config>) => void,\n subscribeOnClose: (cb: () => void) => void,\n unsubscribe: (cb: SubscribeQueryCallback<Schema, Q, Config>) => void,\n readyState: () => SubscriptionReadyState,\n): AsyncGenerator<SubscribeQueryPayload<Schema, Q, Config>> {\n let wakeup = null;\n let closed = false;\n\n const backlog: SubscribeQueryPayload<Schema, Q, Config>[] = [];\n const handler: SubscribeQueryCallback<Schema, Q, Config> = (\n data: SubscribeQueryPayload<Schema, Q, Config>,\n ): void => {\n backlog.push(data);\n if (backlog.length > 100) {\n // Remove the oldest item to prevent the backlog\n // from growing forever. This is okay for live queries,\n // but we need some other machanism if we use this for\n // event-based subscriptions.\n backlog.shift();\n }\n if (wakeup) {\n wakeup();\n wakeup = null;\n }\n };\n\n subscribe(handler);\n\n const done = () => {\n unsubscribe(handler);\n return Promise.resolve({ done: true, value: undefined });\n };\n\n const onClose = () => {\n closed = true;\n if (wakeup) {\n wakeup();\n }\n done();\n };\n\n subscribeOnClose(onClose);\n\n const next = async () => {\n while (true) {\n if (readyState() === 'closed' || closed) {\n return done();\n }\n\n const nextValue = backlog.shift();\n if (nextValue) {\n return { value: nextValue, done: false };\n }\n\n const p = new Promise((resolve) => {\n wakeup = resolve;\n });\n\n await p;\n }\n };\n\n return {\n next,\n return: done,\n throw(error) {\n unsubscribe(handler);\n return Promise.reject(error);\n },\n [Symbol.asyncIterator]() {\n return this;\n },\n };\n}\n\nfunction esReadyState(es: EventSource): SubscriptionReadyState {\n switch (es.readyState) {\n case es.CLOSED: {\n return 'closed';\n }\n case es.CONNECTING: {\n return 'connecting';\n }\n case es.OPEN: {\n return 'open';\n }\n }\n}\n\nfunction multiReadFetchResponse(r) {\n let p = null;\n return {\n ...r,\n text() {\n if (!p) {\n p = r.text();\n }\n return p;\n },\n json() {\n if (!p) {\n p = r.text();\n }\n return p.then((x) => JSON.parse(x));\n },\n };\n}\n\ntype APIPageInfo = {\n [etype: string]: {\n 'start-cursor': [string, string, any, number];\n 'end-cursor': [string, string, any, number];\n 'has-next-page?': boolean;\n 'has-previous-page?': boolean;\n };\n};\n\nfunction formatPageInfo(\n pageInfo: APIPageInfo | null | undefined,\n): PageInfoResponse<any> | undefined {\n if (!pageInfo) {\n return undefined;\n }\n const res: PageInfoResponse<any> = {};\n\n for (const [k, v] of Object.entries(pageInfo)) {\n res[k] = {\n startCursor: v['start-cursor'],\n endCursor: v['end-cursor'],\n hasNextPage: v['has-next-page?'],\n hasPreviousPage: v['has-previous-page?'],\n };\n }\n\n return res;\n}\n\nexport function subscribe<\n Schema extends InstantSchemaDef<any, any, any>,\n Q extends ValidQuery<Q, Schema>,\n Config extends InstantConfig<Schema, boolean> = InstantConfig<Schema, false>,\n>(\n query: Q,\n cb,\n opts: { headers: HeadersInit; inference: boolean; apiURI: string },\n): SubscribeQueryResponse<Schema, Q, Config> {\n let fetchErrorResponse;\n let closed = false;\n\n // Stable id that will stay the same across reconnects,\n // used for debugging\n const localConnectionId = id();\n\n const es = new EventSource(\n `${opts.apiURI}/admin/subscribe-query?local_connection_id=${localConnectionId}`,\n {\n fetch(input, init) {\n fetchErrorResponse = null;\n return fetch(input, {\n ...init,\n method: 'POST',\n headers: opts.headers,\n body: JSON.stringify({\n query: query,\n 'inference?': opts.inference,\n versions: {\n '@instantdb/admin': version,\n '@instantdb/core': coreVersion,\n },\n }),\n }).then((r) => {\n if (!r.ok) {\n fetchErrorResponse = multiReadFetchResponse(r);\n }\n return r;\n });\n },\n },\n );\n\n const subscribers: SubscribeQueryCallback<Schema, Q, Config>[] = [];\n const onCloseSubscribers = [];\n\n const subscribe = (cb) => {\n subscribers.push(cb);\n };\n\n const unsubscribe = (cb) => {\n subscribers.splice(subscribers.indexOf(cb), 1);\n };\n\n const subscribeOnClose = (cb) => {\n onCloseSubscribers.push(cb);\n };\n\n if (cb) {\n subscribe(cb);\n }\n\n let sessionParams: SubscribeQuerySessionInfo | null = null;\n\n function deliver(result: SubscribeQueryPayload<Schema, Q, Config>) {\n if (closed) {\n return;\n }\n for (const sub of subscribers) {\n try {\n sub(result);\n } catch (e) {\n console.error('Error in subscribeQuery callback', e);\n }\n }\n }\n\n function handleMessage(msg) {\n switch (msg.op) {\n case 'sse-init': {\n const machineId = msg['machine-id'];\n const sessionId = msg['session-id'];\n sessionParams = { machineId, sessionId };\n break;\n }\n case 'add-query-ok': {\n deliver({\n type: 'ok',\n data: msg.result,\n pageInfo: formatPageInfo(msg['result-meta']?.['page-info']),\n sessionInfo: sessionParams,\n });\n break;\n }\n case 'refresh-ok': {\n if (msg.computations.length) {\n deliver({\n type: 'ok',\n data: msg.computations[0]['instaql-result'],\n pageInfo: formatPageInfo(\n msg.computations[0]['result-meta']?.['page-info'],\n ),\n sessionInfo: sessionParams,\n });\n }\n break;\n }\n case 'error': {\n deliver({\n type: 'error',\n error: new InstantAPIError({ body: msg, status: msg.status }),\n get readyState() {\n return esReadyState(es);\n },\n get isClosed() {\n return esReadyState(es) === 'closed';\n },\n sessionInfo: sessionParams,\n });\n break;\n }\n }\n }\n\n es.onerror = (e) => {\n if (fetchErrorResponse) {\n fetchErrorResponse.text().then((t) => {\n let body = { type: undefined, message: t };\n try {\n body = JSON.parse(t);\n } catch (_e) {}\n deliver({\n type: 'error',\n error: new InstantAPIError({\n status: fetchErrorResponse.status,\n body,\n }),\n get readyState() {\n return esReadyState(es);\n },\n get isClosed() {\n return esReadyState(es) === 'closed';\n },\n sessionInfo: sessionParams,\n });\n });\n } else {\n const deliverError = () => {\n deliver({\n type: 'error',\n error: new InstantAPIError({\n status: e.code || 500,\n body: {\n type: undefined,\n message: e.message || 'Unknown error in subscribe query.',\n },\n }),\n get readyState() {\n return esReadyState(es);\n },\n get isClosed() {\n return esReadyState(es) === 'closed';\n },\n sessionInfo: sessionParams,\n });\n };\n if (es.readyState === EventSource.CLOSED) {\n deliverError();\n return;\n }\n\n setTimeout(() => {\n if (es.readyState !== EventSource.OPEN) {\n deliverError();\n }\n }, 5000);\n }\n };\n\n es.onmessage = (e) => {\n handleMessage(JSON.parse(e.data));\n };\n\n const close = () => {\n closed = true;\n for (const sub of onCloseSubscribers) {\n try {\n sub();\n } catch (e) {\n console.error('Error in onClose callback', e);\n }\n }\n es.close();\n };\n\n return {\n close: close,\n [Symbol.iterator]: () => {\n throw new Error(\n 'subscribeQuery does not support synchronous iteration. Use `for await` instead.',\n );\n },\n get sessionInfo() {\n return sessionParams;\n },\n get readyState() {\n return esReadyState(es);\n },\n get isClosed() {\n return esReadyState(es) === 'closed';\n },\n [Symbol.asyncIterator]: makeAsyncIterator.bind(\n this,\n subscribe,\n subscribeOnClose,\n unsubscribe,\n () => 1,\n ),\n };\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@instantdb/admin",
|
|
3
|
-
"version": "v0.22.
|
|
3
|
+
"version": "v0.22.41",
|
|
4
4
|
"description": "Admin SDK for Instant DB",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"homepage": "https://github.com/instantdb/instant/tree/main/client/packages/admin",
|
|
@@ -48,8 +48,8 @@
|
|
|
48
48
|
},
|
|
49
49
|
"dependencies": {
|
|
50
50
|
"eventsource": "^4.0.0",
|
|
51
|
-
"@instantdb/core": "v0.22.
|
|
52
|
-
"@instantdb/version": "v0.22.
|
|
51
|
+
"@instantdb/core": "v0.22.41",
|
|
52
|
+
"@instantdb/version": "v0.22.41"
|
|
53
53
|
},
|
|
54
54
|
"scripts": {
|
|
55
55
|
"test": "vitest",
|
package/src/subscribe.ts
CHANGED
|
@@ -8,6 +8,7 @@ import {
|
|
|
8
8
|
InstantSchemaDef,
|
|
9
9
|
InstaQLResponse,
|
|
10
10
|
ValidQuery,
|
|
11
|
+
PageInfoResponse,
|
|
11
12
|
} from '@instantdb/core';
|
|
12
13
|
|
|
13
14
|
export type SubscriptionReadyState = 'closed' | 'connecting' | 'open';
|
|
@@ -25,6 +26,7 @@ export type SubscribeQueryPayload<
|
|
|
25
26
|
| {
|
|
26
27
|
type: 'ok';
|
|
27
28
|
data: InstaQLResponse<Schema, Q, NonNullable<Config['useDateObjects']>>;
|
|
29
|
+
pageInfo: PageInfoResponse<Q>;
|
|
28
30
|
sessionInfo: SubscribeQuerySessionInfo | null;
|
|
29
31
|
}
|
|
30
32
|
| {
|
|
@@ -180,6 +182,35 @@ function multiReadFetchResponse(r) {
|
|
|
180
182
|
};
|
|
181
183
|
}
|
|
182
184
|
|
|
185
|
+
type APIPageInfo = {
|
|
186
|
+
[etype: string]: {
|
|
187
|
+
'start-cursor': [string, string, any, number];
|
|
188
|
+
'end-cursor': [string, string, any, number];
|
|
189
|
+
'has-next-page?': boolean;
|
|
190
|
+
'has-previous-page?': boolean;
|
|
191
|
+
};
|
|
192
|
+
};
|
|
193
|
+
|
|
194
|
+
function formatPageInfo(
|
|
195
|
+
pageInfo: APIPageInfo | null | undefined,
|
|
196
|
+
): PageInfoResponse<any> | undefined {
|
|
197
|
+
if (!pageInfo) {
|
|
198
|
+
return undefined;
|
|
199
|
+
}
|
|
200
|
+
const res: PageInfoResponse<any> = {};
|
|
201
|
+
|
|
202
|
+
for (const [k, v] of Object.entries(pageInfo)) {
|
|
203
|
+
res[k] = {
|
|
204
|
+
startCursor: v['start-cursor'],
|
|
205
|
+
endCursor: v['end-cursor'],
|
|
206
|
+
hasNextPage: v['has-next-page?'],
|
|
207
|
+
hasPreviousPage: v['has-previous-page?'],
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
return res;
|
|
212
|
+
}
|
|
213
|
+
|
|
183
214
|
export function subscribe<
|
|
184
215
|
Schema extends InstantSchemaDef<any, any, any>,
|
|
185
216
|
Q extends ValidQuery<Q, Schema>,
|
|
@@ -269,6 +300,7 @@ export function subscribe<
|
|
|
269
300
|
deliver({
|
|
270
301
|
type: 'ok',
|
|
271
302
|
data: msg.result,
|
|
303
|
+
pageInfo: formatPageInfo(msg['result-meta']?.['page-info']),
|
|
272
304
|
sessionInfo: sessionParams,
|
|
273
305
|
});
|
|
274
306
|
break;
|
|
@@ -278,6 +310,9 @@ export function subscribe<
|
|
|
278
310
|
deliver({
|
|
279
311
|
type: 'ok',
|
|
280
312
|
data: msg.computations[0]['instaql-result'],
|
|
313
|
+
pageInfo: formatPageInfo(
|
|
314
|
+
msg.computations[0]['result-meta']?.['page-info'],
|
|
315
|
+
),
|
|
281
316
|
sessionInfo: sessionParams,
|
|
282
317
|
});
|
|
283
318
|
}
|