@instantdb/admin 1.0.1 → 1.0.2-branch-edge-runtime.24356557026.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commonjs/index.d.ts +4 -3
- package/dist/commonjs/index.d.ts.map +1 -1
- package/dist/commonjs/index.js +5 -2
- package/dist/commonjs/index.js.map +1 -1
- package/dist/commonjs/polyfill.d.ts +17 -0
- package/dist/commonjs/polyfill.d.ts.map +1 -0
- package/dist/commonjs/polyfill.js +26 -0
- package/dist/commonjs/polyfill.js.map +1 -0
- package/dist/commonjs/subscribe.d.ts.map +1 -1
- package/dist/commonjs/subscribe.js +3 -1
- package/dist/commonjs/subscribe.js.map +1 -1
- package/dist/esm/index.d.ts +4 -3
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +5 -3
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/polyfill.d.ts +17 -0
- package/dist/esm/polyfill.d.ts.map +1 -0
- package/dist/esm/polyfill.js +22 -0
- package/dist/esm/polyfill.js.map +1 -0
- package/dist/esm/subscribe.d.ts.map +1 -1
- package/dist/esm/subscribe.js +3 -1
- package/dist/esm/subscribe.js.map +1 -1
- package/package.json +4 -4
- package/src/index.ts +10 -2
- package/src/polyfill.ts +39 -0
- package/src/subscribe.ts +3 -1
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
// MessageEvent is not supported in the edge runtime, vercel
|
|
2
|
+
// defines its own MessageEvent that throws. There is no easy
|
|
3
|
+
// way to detect if MessageEvent is supported, so we just always
|
|
4
|
+
// polyfill by passing it in to eventsource.
|
|
5
|
+
export class MessageEventPolyfill extends Event {
|
|
6
|
+
data;
|
|
7
|
+
origin;
|
|
8
|
+
lastEventId;
|
|
9
|
+
source;
|
|
10
|
+
ports;
|
|
11
|
+
constructor(type, init) {
|
|
12
|
+
super(type);
|
|
13
|
+
this.data = init?.data ?? null;
|
|
14
|
+
this.origin = init?.origin ?? '';
|
|
15
|
+
this.lastEventId = init?.lastEventId ?? '';
|
|
16
|
+
this.source = init?.source ?? null;
|
|
17
|
+
this.ports = init?.ports ?? [];
|
|
18
|
+
}
|
|
19
|
+
/** @deprecated */
|
|
20
|
+
initMessageEvent(_type, _bubbles, _cancelable, _data, _origin, _lastEventId, _source, _ports) { }
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=polyfill.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"polyfill.js","sourceRoot":"","sources":["../../src/polyfill.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAC5D,6DAA6D;AAC7D,gEAAgE;AAChE,4CAA4C;AAC5C,MAAM,OAAO,oBAA8B,SAAQ,KAAK;IAC7C,IAAI,CAAI;IACR,MAAM,CAAS;IACf,WAAW,CAAS;IACpB,MAAM,CAA4B;IAClC,KAAK,CAA6B;IAC3C,YACE,IAAY,EACZ,IAMC;QAED,KAAK,CAAC,IAAI,CAAC,CAAC;QACZ,IAAI,CAAC,IAAI,GAAG,IAAI,EAAE,IAAI,IAAK,IAAU,CAAC;QACtC,IAAI,CAAC,MAAM,GAAG,IAAI,EAAE,MAAM,IAAI,EAAE,CAAC;QACjC,IAAI,CAAC,WAAW,GAAG,IAAI,EAAE,WAAW,IAAI,EAAE,CAAC;QAC3C,IAAI,CAAC,MAAM,GAAG,IAAI,EAAE,MAAM,IAAI,IAAI,CAAC;QACnC,IAAI,CAAC,KAAK,GAAG,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;IACjC,CAAC;IACD,kBAAkB;IAClB,gBAAgB,CACd,KAAa,EACb,QAAkB,EAClB,WAAqB,EACrB,KAAW,EACX,OAAgB,EAChB,YAAqB,EACrB,OAAmC,EACnC,MAAsB,IACrB,CAAC;CACL","sourcesContent":["// MessageEvent is not supported in the edge runtime, vercel\n// defines its own MessageEvent that throws. There is no easy\n// way to detect if MessageEvent is supported, so we just always\n// polyfill by passing it in to eventsource.\nexport class MessageEventPolyfill<T = any> extends Event {\n readonly data: T;\n readonly origin: string;\n readonly lastEventId: string;\n readonly source: MessageEventSource | null;\n readonly ports: ReadonlyArray<MessagePort>;\n constructor(\n type: string,\n init?: {\n data?: T;\n origin?: string;\n lastEventId?: string;\n source?: MessageEventSource | null;\n ports?: MessagePort[];\n },\n ) {\n super(type);\n this.data = init?.data ?? (null as T);\n this.origin = init?.origin ?? '';\n this.lastEventId = init?.lastEventId ?? '';\n this.source = init?.source ?? null;\n this.ports = init?.ports ?? [];\n }\n /** @deprecated */\n initMessageEvent(\n _type: string,\n _bubbles?: boolean,\n _cancelable?: boolean,\n _data?: any,\n _origin?: string,\n _lastEventId?: string,\n _source?: MessageEventSource | null,\n _ports?: MessagePort[],\n ) {}\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subscribe.d.ts","sourceRoot":"","sources":["../../src/subscribe.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,eAAe,EAEf,gBAAgB,EAChB,eAAe,EACf,UAAU,EACV,gBAAgB,EACjB,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"subscribe.d.ts","sourceRoot":"","sources":["../../src/subscribe.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,eAAe,EAEf,gBAAgB,EAChB,eAAe,EACf,UAAU,EACV,gBAAgB,EACjB,MAAM,iBAAiB,CAAC;AAGzB,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,QAAQ,SAAS,OAAO,GAAG,KAAK,IAE9B;IACE,IAAI,EAAE,IAAI,CAAC;IACX,IAAI,EAAE,eAAe,CAAC,MAAM,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;IAC3C,QAAQ,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IAC1C,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,QAAQ,SAAS,OAAO,GAAG,KAAK,IAC9B,CAAC,OAAO,EAAE,qBAAqB,CAAC,MAAM,EAAE,CAAC,EAAE,QAAQ,CAAC,KAAK,IAAI,CAAC;AAElE,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,QAAQ,SAAS,OAAO,GAAG,KAAK;IAEhC,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,QAAQ,CAAC,CAC3C,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;AAuJD,wBAAgB,SAAS,CACvB,MAAM,SAAS,gBAAgB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAC9C,CAAC,SAAS,UAAU,CAAC,CAAC,EAAE,MAAM,CAAC,EAC/B,QAAQ,SAAS,OAAO,EAExB,KAAK,EAAE,CAAC,EACR,EAAE,EAAE,sBAAsB,CAAC,MAAM,EAAE,CAAC,EAAE,QAAQ,CAAC,GAAG,SAAS,EAC3D,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,QAAQ,CAAC,CAoN7C"}
|
package/dist/esm/subscribe.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { EventSource } from 'eventsource';
|
|
1
|
+
import { EventSource } from '@instantdb/eventsource';
|
|
2
2
|
import version from "./version.js";
|
|
3
3
|
import { id, version as coreVersion, InstantAPIError, } from '@instantdb/core';
|
|
4
|
+
import { MessageEventPolyfill } from "./polyfill.js";
|
|
4
5
|
function makeAsyncIterator(subscribe, subscribeOnClose, unsubscribe, readyState) {
|
|
5
6
|
let wakeup = null;
|
|
6
7
|
let closed = false;
|
|
@@ -114,6 +115,7 @@ export function subscribe(query, cb, opts) {
|
|
|
114
115
|
// used for debugging
|
|
115
116
|
const localConnectionId = id();
|
|
116
117
|
const es = new EventSource(`${opts.apiURI}/admin/subscribe-query?local_connection_id=${localConnectionId}`, {
|
|
118
|
+
messageEvent: MessageEventPolyfill,
|
|
117
119
|
fetch(input, init) {
|
|
118
120
|
fetchErrorResponse = null;
|
|
119
121
|
return fetch(input, {
|
|
@@ -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 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 UseDates extends boolean = false,\n> =\n | {\n type: 'ok';\n data: InstaQLResponse<Schema, Q, UseDates>;\n pageInfo: PageInfoResponse<Q> | undefined;\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 UseDates extends boolean = false,\n> = (payload: SubscribeQueryPayload<Schema, Q, UseDates>) => void;\n\nexport interface SubscribeQueryResponse<\n Schema extends InstantSchemaDef<any, any, any>,\n Q extends ValidQuery<Q, Schema>,\n UseDates extends boolean = 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, UseDates>\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 UseDates extends boolean = false,\n>(\n subscribe: (cb: SubscribeQueryCallback<Schema, Q, UseDates>) => void,\n subscribeOnClose: (cb: () => void) => void,\n unsubscribe: (cb: SubscribeQueryCallback<Schema, Q, UseDates>) => void,\n readyState: () => SubscriptionReadyState,\n): AsyncGenerator<SubscribeQueryPayload<Schema, Q, UseDates>> {\n let wakeup: (() => void) | null = null;\n let closed = false;\n\n const backlog: SubscribeQueryPayload<Schema, Q, UseDates>[] = [];\n const handler: SubscribeQueryCallback<Schema, Q, UseDates> = (\n data: SubscribeQueryPayload<Schema, Q, UseDates>,\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 = (): Promise<{\n done: true;\n value: undefined;\n }> => {\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 (): Promise<\n IteratorResult<SubscribeQueryPayload<Schema, Q, UseDates>, undefined>\n > => {\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<void>((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 default:\n return 'connecting';\n }\n}\n\nfunction multiReadFetchResponse(r: Response) {\n let p: null | Promise<string> = 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 UseDates extends boolean,\n>(\n query: Q,\n cb: SubscribeQueryCallback<Schema, Q, UseDates> | undefined,\n opts: { headers: HeadersInit; inference: boolean; apiURI: string },\n): SubscribeQueryResponse<Schema, Q, UseDates> {\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, UseDates>[] = [];\n const onCloseSubscribers: (() => void)[] = [];\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, UseDates>) {\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
|
+
{"version":3,"file":"subscribe.js","sourceRoot":"","sources":["../../src/subscribe.ts"],"names":[],"mappings":"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","sourcesContent":["import { EventSource } from '@instantdb/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';\nimport { MessageEventPolyfill } from './polyfill.ts';\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 UseDates extends boolean = false,\n> =\n | {\n type: 'ok';\n data: InstaQLResponse<Schema, Q, UseDates>;\n pageInfo: PageInfoResponse<Q> | undefined;\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 UseDates extends boolean = false,\n> = (payload: SubscribeQueryPayload<Schema, Q, UseDates>) => void;\n\nexport interface SubscribeQueryResponse<\n Schema extends InstantSchemaDef<any, any, any>,\n Q extends ValidQuery<Q, Schema>,\n UseDates extends boolean = 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, UseDates>\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 UseDates extends boolean = false,\n>(\n subscribe: (cb: SubscribeQueryCallback<Schema, Q, UseDates>) => void,\n subscribeOnClose: (cb: () => void) => void,\n unsubscribe: (cb: SubscribeQueryCallback<Schema, Q, UseDates>) => void,\n readyState: () => SubscriptionReadyState,\n): AsyncGenerator<SubscribeQueryPayload<Schema, Q, UseDates>> {\n let wakeup: (() => void) | null = null;\n let closed = false;\n\n const backlog: SubscribeQueryPayload<Schema, Q, UseDates>[] = [];\n const handler: SubscribeQueryCallback<Schema, Q, UseDates> = (\n data: SubscribeQueryPayload<Schema, Q, UseDates>,\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 = (): Promise<{\n done: true;\n value: undefined;\n }> => {\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 (): Promise<\n IteratorResult<SubscribeQueryPayload<Schema, Q, UseDates>, undefined>\n > => {\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<void>((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 default:\n return 'connecting';\n }\n}\n\nfunction multiReadFetchResponse(r: Response) {\n let p: null | Promise<string> = 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 UseDates extends boolean,\n>(\n query: Q,\n cb: SubscribeQueryCallback<Schema, Q, UseDates> | undefined,\n opts: { headers: HeadersInit; inference: boolean; apiURI: string },\n): SubscribeQueryResponse<Schema, Q, UseDates> {\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 messageEvent: MessageEventPolyfill,\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, UseDates>[] = [];\n const onCloseSubscribers: (() => void)[] = [];\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, UseDates>) {\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": "1.0.1",
|
|
3
|
+
"version": "1.0.2-branch-edge-runtime.24356557026.1",
|
|
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,10 +48,10 @@
|
|
|
48
48
|
},
|
|
49
49
|
"dependencies": {
|
|
50
50
|
"cookie": "^1.1.1",
|
|
51
|
-
"eventsource": "
|
|
51
|
+
"@instantdb/eventsource": "4.1.0-2",
|
|
52
52
|
"uuid": "^11.1.0",
|
|
53
|
-
"@instantdb/core": "1.0.1",
|
|
54
|
-
"@instantdb/version": "1.0.1"
|
|
53
|
+
"@instantdb/core": "1.0.2-branch-edge-runtime.24356557026.1",
|
|
54
|
+
"@instantdb/version": "1.0.2-branch-edge-runtime.24356557026.1"
|
|
55
55
|
},
|
|
56
56
|
"scripts": {
|
|
57
57
|
"test": "vitest",
|
package/src/index.ts
CHANGED
|
@@ -18,6 +18,7 @@ import {
|
|
|
18
18
|
// core types
|
|
19
19
|
type User,
|
|
20
20
|
type Query,
|
|
21
|
+
InstantError,
|
|
21
22
|
|
|
22
23
|
// query types
|
|
23
24
|
type QueryResponse,
|
|
@@ -79,6 +80,7 @@ import {
|
|
|
79
80
|
type WritableStreamCtor,
|
|
80
81
|
type ReadableStreamCtor,
|
|
81
82
|
InstantWritableStream,
|
|
83
|
+
InstantReadableStream,
|
|
82
84
|
} from '@instantdb/core';
|
|
83
85
|
|
|
84
86
|
import version from './version.ts';
|
|
@@ -91,7 +93,8 @@ import {
|
|
|
91
93
|
SubscriptionReadyState,
|
|
92
94
|
} from './subscribe.ts';
|
|
93
95
|
import { parseCookie } from 'cookie';
|
|
94
|
-
import { EventSource } from 'eventsource';
|
|
96
|
+
import { EventSource } from '@instantdb/eventsource';
|
|
97
|
+
import { MessageEventPolyfill } from './polyfill.ts';
|
|
95
98
|
|
|
96
99
|
type DebugCheckResult = {
|
|
97
100
|
/** The ID of the record. */
|
|
@@ -110,6 +113,7 @@ type Config = {
|
|
|
110
113
|
apiURI?: string;
|
|
111
114
|
useDateObjects?: boolean;
|
|
112
115
|
disableValidation?: boolean;
|
|
116
|
+
verbose?: boolean;
|
|
113
117
|
};
|
|
114
118
|
|
|
115
119
|
export type InstantConfig<
|
|
@@ -331,6 +335,7 @@ function makeEventSourceWrapper(opts: {
|
|
|
331
335
|
|
|
332
336
|
#createEventSource(url: string): EventSource {
|
|
333
337
|
const es = new EventSource(url, {
|
|
338
|
+
messageEvent: MessageEventPolyfill,
|
|
334
339
|
fetch(input, init) {
|
|
335
340
|
return fetch(input, {
|
|
336
341
|
...init,
|
|
@@ -1046,7 +1051,9 @@ class Streams {
|
|
|
1046
1051
|
* console.log(chunk);
|
|
1047
1052
|
* }
|
|
1048
1053
|
*/
|
|
1049
|
-
createReadStream = (
|
|
1054
|
+
createReadStream = (
|
|
1055
|
+
opts: CreateReadStreamOpts,
|
|
1056
|
+
): InstantReadableStream<string> => {
|
|
1050
1057
|
return this.#ensureInstantStream().createReadStream(opts);
|
|
1051
1058
|
};
|
|
1052
1059
|
|
|
@@ -1608,6 +1615,7 @@ export {
|
|
|
1608
1615
|
type InstaQLParams,
|
|
1609
1616
|
type ValidQuery,
|
|
1610
1617
|
type Query,
|
|
1618
|
+
InstantError,
|
|
1611
1619
|
|
|
1612
1620
|
// query types
|
|
1613
1621
|
type QueryResponse,
|
package/src/polyfill.ts
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
// MessageEvent is not supported in the edge runtime, vercel
|
|
2
|
+
// defines its own MessageEvent that throws. There is no easy
|
|
3
|
+
// way to detect if MessageEvent is supported, so we just always
|
|
4
|
+
// polyfill by passing it in to eventsource.
|
|
5
|
+
export class MessageEventPolyfill<T = any> extends Event {
|
|
6
|
+
readonly data: T;
|
|
7
|
+
readonly origin: string;
|
|
8
|
+
readonly lastEventId: string;
|
|
9
|
+
readonly source: MessageEventSource | null;
|
|
10
|
+
readonly ports: ReadonlyArray<MessagePort>;
|
|
11
|
+
constructor(
|
|
12
|
+
type: string,
|
|
13
|
+
init?: {
|
|
14
|
+
data?: T;
|
|
15
|
+
origin?: string;
|
|
16
|
+
lastEventId?: string;
|
|
17
|
+
source?: MessageEventSource | null;
|
|
18
|
+
ports?: MessagePort[];
|
|
19
|
+
},
|
|
20
|
+
) {
|
|
21
|
+
super(type);
|
|
22
|
+
this.data = init?.data ?? (null as T);
|
|
23
|
+
this.origin = init?.origin ?? '';
|
|
24
|
+
this.lastEventId = init?.lastEventId ?? '';
|
|
25
|
+
this.source = init?.source ?? null;
|
|
26
|
+
this.ports = init?.ports ?? [];
|
|
27
|
+
}
|
|
28
|
+
/** @deprecated */
|
|
29
|
+
initMessageEvent(
|
|
30
|
+
_type: string,
|
|
31
|
+
_bubbles?: boolean,
|
|
32
|
+
_cancelable?: boolean,
|
|
33
|
+
_data?: any,
|
|
34
|
+
_origin?: string,
|
|
35
|
+
_lastEventId?: string,
|
|
36
|
+
_source?: MessageEventSource | null,
|
|
37
|
+
_ports?: MessagePort[],
|
|
38
|
+
) {}
|
|
39
|
+
}
|
package/src/subscribe.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { EventSource } from 'eventsource';
|
|
1
|
+
import { EventSource } from '@instantdb/eventsource';
|
|
2
2
|
import version from './version.ts';
|
|
3
3
|
import {
|
|
4
4
|
id,
|
|
@@ -10,6 +10,7 @@ import {
|
|
|
10
10
|
ValidQuery,
|
|
11
11
|
PageInfoResponse,
|
|
12
12
|
} from '@instantdb/core';
|
|
13
|
+
import { MessageEventPolyfill } from './polyfill.ts';
|
|
13
14
|
|
|
14
15
|
export type SubscriptionReadyState = 'closed' | 'connecting' | 'open';
|
|
15
16
|
|
|
@@ -237,6 +238,7 @@ export function subscribe<
|
|
|
237
238
|
const es = new EventSource(
|
|
238
239
|
`${opts.apiURI}/admin/subscribe-query?local_connection_id=${localConnectionId}`,
|
|
239
240
|
{
|
|
241
|
+
messageEvent: MessageEventPolyfill,
|
|
240
242
|
fetch(input, init) {
|
|
241
243
|
fetchErrorResponse = null;
|
|
242
244
|
return fetch(input, {
|