@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.
@@ -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,EACX,MAAM,iBAAiB,CAAC;AAEzB,MAAM,MAAM,sBAAsB,GAAG,QAAQ,GAAG,YAAY,GAAG,MAAM,CAAC;AAEtE,MAAM,MAAM,yBAAyB,GAAG;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,qBAAqB,CAC/B,MAAM,SAAS,gBAAgB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAC9C,CAAC,SAAS,UAAU,CAAC,CAAC,EAAE,MAAM,CAAC,EAC/B,MAAM,SAAS,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,aAAa,CAAC,MAAM,EAAE,KAAK,CAAC,IAE1E;IACE,IAAI,EAAE,IAAI,CAAC;IACX,IAAI,EAAE,eAAe,CAAC,MAAM,EAAE,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;IACxE,WAAW,EAAE,yBAAyB,GAAG,IAAI,CAAC;CAC/C,GACD;IACE,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,eAAe,CAAC;IACvB,UAAU,EAAE,sBAAsB,CAAC;IACnC,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,yBAAyB,GAAG,IAAI,CAAC;CAC/C,CAAC;AAEN,MAAM,MAAM,sBAAsB,CAChC,MAAM,SAAS,gBAAgB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAC9C,CAAC,SAAS,UAAU,CAAC,CAAC,EAAE,MAAM,CAAC,EAC/B,MAAM,SAAS,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,aAAa,CAAC,MAAM,EAAE,KAAK,CAAC,IAC1E,CAAC,OAAO,EAAE,qBAAqB,CAAC,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,KAAK,IAAI,CAAC;AAEhE,MAAM,WAAW,sBAAsB,CACrC,MAAM,SAAS,gBAAgB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAC9C,CAAC,SAAS,UAAU,CAAC,CAAC,EAAE,MAAM,CAAC,EAC/B,MAAM,SAAS,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,aAAa,CAAC,MAAM,EAAE,KAAK,CAAC;IAE5E,sDAAsD;IACtD,KAAK,IAAI,IAAI,CAAC;IAEd,qDAAqD;IACrD,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC;IAE3B,uCAAuC;IACvC,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,qBAAqB,CAC7C,qBAAqB,CAAC,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,CACzC,CAAC;IAEF,oCAAoC;IACpC,QAAQ,CAAC,UAAU,EAAE,sBAAsB,CAAC;IAE5C,gFAAgF;IAChF,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAE3B,wFAAwF;IACxF,QAAQ,CAAC,WAAW,EAAE,yBAAyB,GAAG,IAAI,CAAC;CACxD;AAmHD,wBAAgB,SAAS,CACvB,MAAM,SAAS,gBAAgB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAC9C,CAAC,SAAS,UAAU,CAAC,CAAC,EAAE,MAAM,CAAC,EAC/B,MAAM,SAAS,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,aAAa,CAAC,MAAM,EAAE,KAAK,CAAC,EAE5E,KAAK,EAAE,CAAC,EACR,EAAE,KAAA,EACF,IAAI,EAAE;IAAE,OAAO,EAAE,WAAW,CAAC;IAAC,SAAS,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACjE,sBAAsB,CAAC,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,CA+M3C"}
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"]}
@@ -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":"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"}
1
+ {"version":3,"file":"subscribe.d.ts","sourceRoot":"","sources":["../../src/subscribe.ts"],"names":[],"mappings":"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"}
@@ -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.40",
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.40",
52
- "@instantdb/version": "v0.22.40"
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
  }