@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.
@@ -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;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,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,CAmN7C"}
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"}
@@ -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": "^4.0.0",
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 = (opts: CreateReadStreamOpts): ReadableStream<string> => {
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,
@@ -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, {