@altertable/data-app 0.64.0 → 0.65.0

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.
Files changed (47) hide show
  1. package/AGENTS.md +3 -0
  2. package/README.md +1 -1
  3. package/dist/chunks/{contract-xtxza1fy.js → contract-a061yj6r.js} +2 -2
  4. package/dist/chunks/contract-awa2d5b1.js +272 -0
  5. package/dist/chunks/contract-awa2d5b1.js.map +12 -0
  6. package/dist/chunks/{contract-zr3jd7mr.js → contract-g6hky7x6.js} +93 -72
  7. package/dist/chunks/contract-g6hky7x6.js.map +12 -0
  8. package/dist/chunks/{contract-mwe7gnmh.js → contract-sm7j7k95.js} +109 -73
  9. package/dist/chunks/contract-sm7j7k95.js.map +14 -0
  10. package/dist/client/index.js +2 -2
  11. package/dist/embed/index.js +19 -9
  12. package/dist/embed/index.js.map +3 -3
  13. package/dist/react/embed/index.js +5 -2
  14. package/dist/react/embed/index.js.map +3 -3
  15. package/dist/react/index.js +715 -443
  16. package/dist/react/index.js.map +13 -10
  17. package/dist/types/client/iframe.d.ts +2 -0
  18. package/dist/types/client/index.d.ts +1 -0
  19. package/dist/types/client/logger.d.ts +6 -0
  20. package/dist/types/core/bridge-endpoint.d.ts +21 -0
  21. package/dist/types/core/bridge.d.ts +137 -16
  22. package/dist/types/core/logger.d.ts +12 -0
  23. package/dist/types/embed/host.d.ts +6 -2
  24. package/dist/types/embed/index.d.ts +1 -0
  25. package/dist/types/embed/source.d.ts +1 -1
  26. package/dist/types/react/embed/bridge.d.ts +1 -1
  27. package/dist/types/react/index.d.ts +1 -0
  28. package/dist/types/react/ui/AppToolbar.d.ts +3 -1
  29. package/dist/types/react/ui/DataApp.d.ts +6 -1
  30. package/dist/types/react/ui/ExportControl.d.ts +4 -0
  31. package/dist/types/react/ui/Toast.d.ts +8 -0
  32. package/dist/types/react/ui/csv-export.d.ts +19 -0
  33. package/dist/types/react/ui/icons.d.ts +1 -0
  34. package/dist/worker.js +381 -79
  35. package/docs/app-authoring.md +28 -2
  36. package/docs/embed.md +1 -1
  37. package/docs/hosted-apps.md +2 -2
  38. package/docs/layout.md +31 -0
  39. package/docs/local-data-apps.md +1 -1
  40. package/docs/react.md +64 -2
  41. package/examples/starter-data-app/index.tsx +50 -32
  42. package/package.json +2 -1
  43. package/dist/chunks/contract-cxr9t12b.js +0 -18
  44. package/dist/chunks/contract-cxr9t12b.js.map +0 -10
  45. package/dist/chunks/contract-mwe7gnmh.js.map +0 -13
  46. package/dist/chunks/contract-zr3jd7mr.js.map +0 -12
  47. /package/dist/chunks/{contract-xtxza1fy.js.map → contract-a061yj6r.js.map} +0 -0
@@ -2,13 +2,11 @@ import {
2
2
  DataSourceError2
3
3
  } from "./contract-yxbjea23.js";
4
4
  import {
5
- BRIDGE,
6
5
  PARENT_PARAM,
7
6
  MAX_PENDING,
8
7
  REQUEST_TIMEOUT_MS,
9
- isBridgeMessage,
10
- validId
11
- } from "./contract-cxr9t12b.js";
8
+ createBridgeEndpoint
9
+ } from "./contract-awa2d5b1.js";
12
10
  import {
13
11
  MessageRoutingError2,
14
12
  defineDataQueryRoute2,
@@ -81,6 +79,46 @@ function createMessageClient2(routes, transport) {
81
79
  };
82
80
  }
83
81
 
82
+ // src/client/logger.ts
83
+ function createBridgeLogger(enabled, send) {
84
+ function resolve(args) {
85
+ if (args.length === 1 && typeof args[0] === "function") {
86
+ const value = args[0]();
87
+ return Array.isArray(value) ? value : [value];
88
+ }
89
+ return args.map((arg) => typeof arg === "function" ? arg() : arg);
90
+ }
91
+ function write(method, args) {
92
+ if (!enabled())
93
+ return;
94
+ try {
95
+ send({ method, args: resolve(args) });
96
+ } catch {}
97
+ }
98
+ return {
99
+ log: (...args) => write("log", args),
100
+ info: (...args) => write("info", args),
101
+ warn: (...args) => write("warn", args),
102
+ error: (...args) => write("error", args)
103
+ };
104
+ }
105
+ function logBridgeMessage(logger, message) {
106
+ if (message.type === "runtime:log")
107
+ return;
108
+ logger.log(() => {
109
+ const metadata = { type: message.type };
110
+ if ("id" in message)
111
+ metadata.id = message.id;
112
+ if (message.type === "bridge:request") {
113
+ metadata.route = message.route;
114
+ const payload = message.payload;
115
+ if (message.route === "data:query" && payload && typeof payload === "object" && "operation" in payload && typeof payload.operation === "string")
116
+ metadata.operation = payload.operation;
117
+ }
118
+ return ["Sending message to parent", metadata];
119
+ });
120
+ }
121
+
84
122
  // src/client/iframe.ts
85
123
  function rethrowDataMessageError(error) {
86
124
  if (error instanceof MessageRoutingError2)
@@ -103,67 +141,61 @@ function createIframeTransport2({
103
141
  const pending = new Map;
104
142
  let hostState;
105
143
  const stateListeners = new Set;
106
- function send(message) {
107
- frame.parent.postMessage({ channel: BRIDGE, version: 1, documentId, sessionId, token, ...message }, parentOrigin);
108
- }
144
+ const logger = createBridgeLogger(() => !disposed && !!sessionId && !!hostState && typeof hostState === "object" && ("logging" in hostState) && hostState.logging === true, (entry) => send("runtimeLog", { payload: entry }));
145
+ const endpoint = createBridgeEndpoint({
146
+ role: "app",
147
+ origin: parentOrigin,
148
+ source: () => frame.parent,
149
+ opaque: mode === "bundle",
150
+ context: () => ({ documentId, sessionId, token }),
151
+ post(message) {
152
+ frame.parent.postMessage(message, parentOrigin);
153
+ logBridgeMessage(logger, message);
154
+ },
155
+ handlers: {
156
+ connect(message) {
157
+ if (mode === "bundle")
158
+ token = message.token;
159
+ send("ready", {});
160
+ },
161
+ initialize(message) {
162
+ if (sessionId && sessionId !== message.sessionId) {
163
+ for (const entry of pending.values())
164
+ entry.reject(new DataAppError2("The preview reconnected. Retry the request.", "bridge_reset"));
165
+ }
166
+ const first = !sessionId;
167
+ sessionId = message.sessionId;
168
+ receiveState(message.state);
169
+ if (first)
170
+ for (const entry of pending.values())
171
+ entry.start();
172
+ if (disposed)
173
+ return;
174
+ if (mode === "url")
175
+ send("runtimeReady", {});
176
+ },
177
+ stateUpdate(message) {
178
+ receiveState(message.state);
179
+ },
180
+ scriptLoad(message) {
181
+ if (mode === "bundle")
182
+ loadScript?.(message.javascript);
183
+ },
184
+ result(message) {
185
+ pending.get(message.id)?.resolve(message.response);
186
+ },
187
+ error(message) {
188
+ pending.get(message.id)?.reject(new MessageRoutingError2(message.code, message.message, message.requestId));
189
+ }
190
+ }
191
+ });
192
+ const send = endpoint.send;
193
+ const receive = endpoint.receive;
109
194
  function receiveState(state) {
110
195
  hostState = state;
111
196
  for (const listener of stateListeners)
112
197
  listener(state);
113
198
  }
114
- function receive(event) {
115
- if (event.origin !== parentOrigin || event.source !== frame.parent || !isBridgeMessage(event.data))
116
- return;
117
- const message = event.data;
118
- if (message.type === "bridge:connect") {
119
- if (mode === "bundle") {
120
- if (!validId(message.token))
121
- return;
122
- token = message.token;
123
- }
124
- send({ type: "bridge:ready" });
125
- return;
126
- }
127
- if (mode === "bundle" && (!token || message.token !== token))
128
- return;
129
- if (message.documentId !== documentId)
130
- return;
131
- if (message.type === "bridge:initialize" && validId(message.sessionId)) {
132
- if (sessionId && sessionId !== message.sessionId) {
133
- for (const entry of pending.values())
134
- entry.reject(new DataAppError2("The preview reconnected. Retry the request.", "bridge_reset"));
135
- }
136
- const first = !sessionId;
137
- sessionId = message.sessionId;
138
- if (first)
139
- for (const entry of pending.values())
140
- entry.start();
141
- receiveState(message.state);
142
- if (mode === "url")
143
- send({ type: "runtime:ready" });
144
- return;
145
- }
146
- if (!sessionId || message.sessionId !== sessionId)
147
- return;
148
- if (message.type === "state:update") {
149
- receiveState(message.state);
150
- return;
151
- }
152
- if (message.type === "script:load" && mode === "bundle" && typeof message.javascript === "string") {
153
- loadScript?.(message.javascript);
154
- return;
155
- }
156
- if (typeof message.id !== "string")
157
- return;
158
- const entry = pending.get(message.id);
159
- if (!entry)
160
- return;
161
- if (message.type === "bridge:result" && "response" in message) {
162
- entry.resolve(message.response);
163
- } else if (message.type === "bridge:error" && typeof message.code === "string" && typeof message.message === "string") {
164
- entry.reject(new MessageRoutingError2(message.code, message.message, typeof message.requestId === "string" ? message.requestId : undefined));
165
- }
166
- }
167
199
  frame.addEventListener("message", receive);
168
200
  function requestMessage(message, signal) {
169
201
  return new Promise((resolve, reject) => {
@@ -182,13 +214,13 @@ function createIframeTransport2({
182
214
  }
183
215
  function abort() {
184
216
  if (sent)
185
- send({ type: "bridge:cancel", id });
217
+ send("cancel", { id });
186
218
  cleanup();
187
219
  reject(signal?.reason);
188
220
  }
189
221
  const timer = setTimeout(() => {
190
222
  if (sent)
191
- send({ type: "bridge:cancel", id });
223
+ send("cancel", { id });
192
224
  cleanup();
193
225
  reject(new DataAppError2(sessionId ? "The data request timed out." : "The preview shell is unavailable. Reload the preview.", sessionId ? "timeout" : "bridge_unavailable"));
194
226
  }, timeoutMs);
@@ -197,8 +229,7 @@ function createIframeTransport2({
197
229
  if (sent)
198
230
  return;
199
231
  try {
200
- send({
201
- type: "bridge:request",
232
+ send("request", {
202
233
  id,
203
234
  route: message.route,
204
235
  payload: message.payload
@@ -222,8 +253,8 @@ function createIframeTransport2({
222
253
  signal?.addEventListener("abort", abort, { once: true });
223
254
  if (sessionId)
224
255
  entry.start();
225
- else
226
- send({ type: "bridge:ready" });
256
+ else if (mode === "url" || token)
257
+ send("ready", {});
227
258
  });
228
259
  }
229
260
  const messages = createMessageClient2({ "data:query": defineDataQueryRoute2(), "data:sql": sqlQueryRoute2 }, requestMessage);
@@ -231,20 +262,22 @@ function createIframeTransport2({
231
262
  return messages.request("data:query", { operation, input }, { signal }).catch(rethrowDataMessageError);
232
263
  }
233
264
  function disconnect() {
234
- send({ type: "bridge:disconnect" });
265
+ if (sessionId)
266
+ send("disconnect", {});
235
267
  sessionId = undefined;
236
268
  for (const entry of pending.values())
237
269
  entry.reject(new DataAppError2("The preview has closed.", "bridge_closed"));
238
270
  }
239
271
  function resume(event) {
240
- if (event.persisted)
241
- send({ type: "bridge:ready" });
272
+ if (event.persisted && (mode === "url" || token))
273
+ send("ready", {});
242
274
  }
243
275
  function dispose() {
244
276
  if (disposed)
245
277
  return;
246
278
  disconnect();
247
279
  disposed = true;
280
+ endpoint.dispose();
248
281
  frame.removeEventListener("message", receive);
249
282
  frame.removeEventListener("pagehide", disconnect);
250
283
  frame.removeEventListener("pageshow", resume);
@@ -253,8 +286,9 @@ function createIframeTransport2({
253
286
  frame.addEventListener("pagehide", disconnect);
254
287
  frame.addEventListener("pageshow", resume);
255
288
  if (mode === "url")
256
- send({ type: "bridge:ready" });
289
+ send("ready", {});
257
290
  return {
291
+ logger,
258
292
  request: requestMessage,
259
293
  transport: queryOperation,
260
294
  lakehouse: {
@@ -274,10 +308,12 @@ function createIframeTransport2({
274
308
  };
275
309
  },
276
310
  ready() {
277
- send({ type: "runtime:ready" });
311
+ if (!disposed && sessionId)
312
+ send("runtimeReady", {});
278
313
  },
279
314
  fail() {
280
- send({ type: "runtime:error" });
315
+ if (!disposed && sessionId)
316
+ send("runtimeError", {});
281
317
  }
282
318
  };
283
319
  }
@@ -519,4 +555,4 @@ function toDataOperationFailure(error, aborted = false) {
519
555
 
520
556
  export { DataAppError2, createHttpTransport2, createMessageClient2, createIframeTransport2, localFrameBridge, installDataAppTransport2, getDataAppTransport2, executeDataOperation, toDataOperationFailure };
521
557
 
522
- //# debugId=4AB92B621002707764756E2164756E21
558
+ //# debugId=07C270EAF2B6B13764756E2164756E21
@@ -0,0 +1,14 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/client/transport.ts", "../src/client/messages.ts", "../src/client/logger.ts", "../src/client/iframe.ts", "../src/core/operation.ts"],
4
+ "sourcesContent": [
5
+ "import type { TransportResponse } from '@/src/core/bridge';\n\nexport type DataTransport = (\n operation: string,\n input: unknown,\n signal?: AbortSignal\n) => Promise<TransportResponse>;\n\n// A bootstrap and its app may bundle independent copies in the same window.\nconst errorBrand = Symbol.for('@altertable/data-app/DataAppError');\n\nexport class DataAppError extends Error {\n readonly [errorBrand] = true;\n\n static [Symbol.hasInstance](value: unknown): boolean {\n return (\n value instanceof Error &&\n (value as { [errorBrand]?: unknown })[errorBrand] === true\n );\n }\n\n constructor(\n message: string,\n public readonly code: string,\n public readonly requestId?: string\n ) {\n super(message);\n this.name = 'DataAppError';\n }\n}\n\nexport function createHttpTransport({\n endpoint = '/api/data',\n fetch: request = globalThis.fetch,\n}: {\n endpoint?: string;\n fetch?: typeof fetch;\n} = {}): DataTransport {\n async function requestData(\n operation: string,\n input: unknown,\n signal?: AbortSignal\n ): Promise<TransportResponse> {\n const response = await request(\n `${endpoint.replace(/\\/$/, '')}/${encodeURIComponent(operation)}`,\n {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(input),\n signal,\n }\n );\n try {\n return { status: response.status, body: await response.json() };\n } catch (error) {\n if (signal?.aborted) throw error;\n throw new DataAppError(\n response.ok ? 'The data response was invalid.' : 'Could not load data.',\n response.ok ? 'invalid_response' : 'request_failed'\n );\n }\n }\n\n return requestData;\n}\n",
6
+ "import {\n MessageRoutingError,\n type MessageInput,\n type MessageOutput,\n type MessageRoutes,\n type MessageTransport,\n} from '@/src/core/messages';\n\n/** Both ends validate using the same contracts; the transport owns delivery and cancellation. */\nexport function createMessageClient<const Routes extends MessageRoutes>(\n routes: Routes,\n transport: MessageTransport\n) {\n return {\n async request<\n Name extends keyof Routes & string,\n const Input extends MessageInput<NoInfer<Routes[Name]>>,\n >(\n route: Name,\n payload: Input,\n { signal }: { signal?: AbortSignal } = {}\n ): Promise<MessageOutput<Routes[Name], Input>> {\n signal?.throwIfAborted();\n if (!Object.hasOwn(routes, route))\n throw new MessageRoutingError(\n 'unknown_route',\n 'Unknown message route.'\n );\n const contract = routes[route]!;\n let input: unknown;\n try {\n input = contract.input(payload);\n } catch {\n throw new MessageRoutingError(\n 'invalid_payload',\n 'Invalid message payload.'\n );\n }\n const response = await transport({ route, payload: input }, signal);\n signal?.throwIfAborted();\n try {\n return contract.output(response, input as never) as MessageOutput<\n Routes[Name],\n Input\n >;\n } catch (error) {\n if (error instanceof MessageRoutingError) throw error;\n throw new MessageRoutingError(\n 'invalid_response',\n 'Invalid message response.'\n );\n }\n },\n };\n}\n",
7
+ "import type { BridgeMessage } from '@/src/core/bridge';\nimport { type DataAppLogger, type LogEntry } from '@/src/core/logger';\n\n/** Lazy arguments run in the iframe; only resolved values cross the bridge. */\nexport function createBridgeLogger(\n enabled: () => boolean,\n send: (entry: LogEntry) => void\n): DataAppLogger {\n function resolve(args: unknown[]): unknown[] {\n if (args.length === 1 && typeof args[0] === 'function') {\n const value: unknown = args[0]();\n return Array.isArray(value) ? value : [value];\n }\n return args.map(arg => (typeof arg === 'function' ? arg() : arg));\n }\n\n function write(method: keyof DataAppLogger, args: unknown[]) {\n if (!enabled()) return;\n try {\n send({ method, args: resolve(args) });\n } catch {\n // Logging must not interrupt the app or recursively log delivery failures.\n }\n }\n\n return {\n log: (...args) => write('log', args),\n info: (...args) => write('info', args),\n warn: (...args) => write('warn', args),\n error: (...args) => write('error', args),\n };\n}\n\n/** Log only delivery metadata; payloads and session credentials stay private. */\nexport function logBridgeMessage(\n logger: DataAppLogger,\n message: BridgeMessage\n) {\n if (message.type === 'runtime:log') return;\n logger.log(() => {\n const metadata: {\n type: BridgeMessage['type'];\n id?: string;\n route?: string;\n operation?: string;\n } = { type: message.type };\n if ('id' in message) metadata.id = message.id;\n if (message.type === 'bridge:request') {\n metadata.route = message.route;\n const payload = message.payload;\n if (\n message.route === 'data:query' &&\n payload &&\n typeof payload === 'object' &&\n 'operation' in payload &&\n typeof payload.operation === 'string'\n )\n metadata.operation = payload.operation;\n }\n return ['Sending message to parent', metadata];\n });\n}\n",
8
+ "import { createBridgeEndpoint } from '@/src/core/bridge-endpoint';\nimport {\n PARENT_PARAM,\n MAX_PENDING,\n REQUEST_TIMEOUT_MS,\n type TransportResponse,\n} from '@/src/core/bridge';\nimport {\n defineDataQueryRoute,\n sqlQueryRoute,\n MessageRoutingError,\n type RoutedMessage,\n} from '@/src/core/messages';\nimport type { Lakehouse } from '@/src/core/contract';\nimport { createMessageClient } from '@/src/client/messages';\nimport { DataAppError } from '@/src/client/transport';\nimport { createBridgeLogger, logBridgeMessage } from '@/src/client/logger';\n\ntype Pending = {\n start: () => void;\n reject: (error: unknown) => void;\n resolve: (value: unknown) => void;\n};\n\n/** Data clients expose one error type for HTTP and message delivery. */\nfunction rethrowDataMessageError(error: unknown): never {\n if (error instanceof MessageRoutingError)\n throw new DataAppError(error.message, error.code, error.requestId);\n throw error;\n}\n\n/** One bridge per document, shared by all clients and retained across module hot replacement. */\nexport function createIframeTransport({\n parentOrigin,\n window: frame = window,\n timeoutMs = REQUEST_TIMEOUT_MS,\n mode = 'url',\n loadScript,\n}: {\n parentOrigin: string;\n window?: Window;\n timeoutMs?: number;\n mode?: 'url' | 'bundle';\n loadScript?: (javascript: string) => void;\n}) {\n if (new URL(parentOrigin).origin !== parentOrigin)\n throw new Error('Expected an exact parent origin.');\n const documentId = crypto.randomUUID();\n let token: string | undefined;\n let sessionId: string | undefined;\n let disposed = false;\n const pending = new Map<string, Pending>();\n let hostState: unknown;\n const stateListeners = new Set<(state: unknown) => void>();\n const logger = createBridgeLogger(\n () =>\n !disposed &&\n !!sessionId &&\n !!hostState &&\n typeof hostState === 'object' &&\n 'logging' in hostState &&\n hostState.logging === true,\n entry => send('runtimeLog', { payload: entry })\n );\n\n const endpoint = createBridgeEndpoint({\n role: 'app',\n origin: parentOrigin,\n source: () => frame.parent,\n opaque: mode === 'bundle',\n context: () => ({ documentId, sessionId, token }),\n post(message) {\n frame.parent.postMessage(message, parentOrigin);\n logBridgeMessage(logger, message);\n },\n handlers: {\n connect(message) {\n if (mode === 'bundle') token = message.token;\n send('ready', {});\n },\n initialize(message) {\n if (sessionId && sessionId !== message.sessionId) {\n for (const entry of pending.values())\n entry.reject(\n new DataAppError(\n 'The preview reconnected. Retry the request.',\n 'bridge_reset'\n )\n );\n }\n const first = !sessionId;\n sessionId = message.sessionId;\n receiveState(message.state);\n if (first) for (const entry of pending.values()) entry.start();\n if (disposed) return;\n if (mode === 'url') send('runtimeReady', {});\n },\n stateUpdate(message) {\n receiveState(message.state);\n },\n scriptLoad(message) {\n if (mode === 'bundle') loadScript?.(message.javascript);\n },\n result(message) {\n pending.get(message.id)?.resolve(message.response);\n },\n error(message) {\n pending\n .get(message.id)\n ?.reject(\n new MessageRoutingError(\n message.code,\n message.message,\n message.requestId\n )\n );\n },\n },\n });\n const send = endpoint.send;\n const receive = endpoint.receive;\n\n function receiveState(state: unknown) {\n hostState = state;\n for (const listener of stateListeners) listener(state);\n }\n\n frame.addEventListener('message', receive);\n\n function requestMessage(\n message: RoutedMessage,\n signal?: AbortSignal\n ): Promise<unknown> {\n return new Promise((resolve, reject) => {\n if (disposed)\n return reject(\n new DataAppError('The preview has closed.', 'bridge_closed')\n );\n if (signal?.aborted) return reject(signal.reason);\n if (pending.size >= MAX_PENDING)\n return reject(\n new DataAppError('Too many pending data requests.', 'bridge_busy')\n );\n const id = crypto.randomUUID();\n let sent = false;\n\n function cleanup() {\n clearTimeout(timer);\n signal?.removeEventListener('abort', abort);\n pending.delete(id);\n }\n\n function abort() {\n if (sent) send('cancel', { id });\n cleanup();\n reject(signal?.reason);\n }\n\n const timer = setTimeout(() => {\n if (sent) send('cancel', { id });\n cleanup();\n reject(\n new DataAppError(\n sessionId\n ? 'The data request timed out.'\n : 'The preview shell is unavailable. Reload the preview.',\n sessionId ? 'timeout' : 'bridge_unavailable'\n )\n );\n }, timeoutMs);\n const entry: Pending = {\n start() {\n if (sent) return;\n try {\n send('request', {\n id,\n route: message.route,\n payload: message.payload,\n });\n sent = true;\n } catch {\n cleanup();\n reject(\n new DataAppError(\n 'The message payload could not be sent.',\n 'invalid_payload'\n )\n );\n }\n },\n resolve(value) {\n cleanup();\n resolve(value);\n },\n reject(error) {\n cleanup();\n reject(error);\n },\n };\n pending.set(id, entry);\n signal?.addEventListener('abort', abort, { once: true });\n if (sessionId) entry.start();\n else if (mode === 'url' || token) send('ready', {});\n });\n }\n\n const messages = createMessageClient(\n { 'data:query': defineDataQueryRoute(), 'data:sql': sqlQueryRoute },\n requestMessage\n );\n\n function queryOperation(\n operation: string,\n input: unknown,\n signal?: AbortSignal\n ): Promise<TransportResponse> {\n return messages\n .request('data:query', { operation, input }, { signal })\n .catch(rethrowDataMessageError);\n }\n\n function disconnect() {\n if (sessionId) send('disconnect', {});\n sessionId = undefined;\n for (const entry of pending.values())\n entry.reject(\n new DataAppError('The preview has closed.', 'bridge_closed')\n );\n }\n\n function resume(event: PageTransitionEvent) {\n if (event.persisted && (mode === 'url' || token)) send('ready', {});\n }\n\n function dispose() {\n if (disposed) return;\n disconnect();\n disposed = true;\n endpoint.dispose();\n frame.removeEventListener('message', receive);\n frame.removeEventListener('pagehide', disconnect);\n frame.removeEventListener('pageshow', resume);\n stateListeners.clear();\n }\n\n frame.addEventListener('pagehide', disconnect);\n frame.addEventListener('pageshow', resume);\n if (mode === 'url') send('ready', {});\n\n return {\n logger,\n request: requestMessage,\n transport: queryOperation,\n lakehouse: {\n queryAll(statement, { limit, signal }) {\n return messages\n .request('data:sql', { statement, limit }, { signal })\n .catch(rethrowDataMessageError);\n },\n } satisfies Lakehouse,\n dispose,\n mode,\n snapshot() {\n return hostState;\n },\n subscribe(listener: (state: unknown) => void) {\n stateListeners.add(listener);\n\n return () => {\n stateListeners.delete(listener);\n };\n },\n ready() {\n if (!disposed && sessionId) send('runtimeReady', {});\n },\n fail() {\n if (!disposed && sessionId) send('runtimeError', {});\n },\n };\n}\n\nexport type IframeTransport = ReturnType<typeof createIframeTransport>;\n\nconst bridgeKey = Symbol.for('altertable.localFrameBridge');\nconst installedKey = Symbol.for('altertable.installedTransport');\ntype LocalBridge = Pick<\n ReturnType<typeof createIframeTransport>,\n 'transport'\n> & { connect?: () => Promise<ReturnType<typeof createIframeTransport>> };\ntype FrameWindow = Window & {\n [bridgeKey]?: LocalBridge;\n [installedKey]?: ReturnType<typeof createIframeTransport>;\n};\n\n/** The URL opts into local preview; only same-origin server configuration establishes trust. */\nexport function localFrameBridge(window?: Window): LocalBridge | undefined {\n const activeWindow =\n window ??\n (typeof globalThis.window === 'undefined' ? undefined : globalThis.window);\n if (!activeWindow) return undefined;\n const frame = activeWindow as FrameWindow;\n if (frame[bridgeKey]) return frame[bridgeKey];\n const parentOrigin =\n new URL(frame.location.href).searchParams.get(PARENT_PARAM) ?? '';\n if (!parentOrigin) return undefined;\n\n async function connect(parentOrigin: string) {\n try {\n const response = await frame.fetch('/__altertable/parent', {\n signal: AbortSignal.timeout(5000),\n });\n const config = (await response.json()) as { origin?: unknown };\n if (\n !response.ok ||\n config.origin !== parentOrigin ||\n frame.parent === frame\n )\n throw new Error('Invalid local parent configuration.');\n // Another owner can install a trusted bridge while configuration is pending.\n if (frame[installedKey]) return frame[installedKey];\n if (frame[bridgeKey] !== proxy)\n throw new Error('Preview transport owner changed.');\n const bridge = createIframeTransport({ parentOrigin, window: frame });\n frame[bridgeKey] = bridge;\n frame[installedKey] = bridge;\n\n return bridge;\n } catch {\n throw new DataAppError(\n 'The preview shell could not be verified. Open the URL printed by altertable app dev.',\n 'bridge_unavailable'\n );\n }\n }\n\n let connection: Promise<ReturnType<typeof createIframeTransport>> | undefined;\n\n function getConnection() {\n const installed = frame[installedKey];\n if (installed) return Promise.resolve(installed);\n if (!connection) {\n const attempt = connect(parentOrigin);\n connection = attempt;\n // Clear only this failed attempt; retained proxy references can explicitly retry.\n void attempt.catch(() => {\n if (connection === attempt) connection = undefined;\n });\n }\n\n return connection;\n }\n\n const proxy: LocalBridge = {\n async transport(operation, input, signal) {\n signal?.throwIfAborted();\n const attempt = getConnection();\n let abort: (() => void) | undefined;\n try {\n const bridge = signal\n ? await Promise.race([\n attempt,\n new Promise<never>((_, reject) => {\n const requestSignal = signal;\n\n function handleAbort() {\n reject(requestSignal.reason);\n }\n\n abort = handleAbort;\n requestSignal.addEventListener('abort', handleAbort, {\n once: true,\n });\n }),\n ])\n : await attempt;\n signal?.throwIfAborted();\n\n return bridge.transport(operation, input, signal);\n } finally {\n if (abort) signal?.removeEventListener('abort', abort);\n }\n },\n connect: getConnection,\n };\n frame[bridgeKey] = proxy;\n // Static mounting still verifies eagerly, without an unhandled rejection.\n void getConnection().catch(() => {});\n\n return proxy;\n}\n\n/** Install an explicitly trusted transport for hosted apps and their URL-backed controls. */\nexport function installDataAppTransport(\n bridge: ReturnType<typeof createIframeTransport>,\n frame: Window = window\n) {\n const target = frame as FrameWindow;\n if (target[installedKey])\n throw new Error('A data app transport is already installed.');\n target[bridgeKey] = bridge;\n target[installedKey] = bridge;\n\n return () => {\n if (target[bridgeKey] === bridge) delete target[bridgeKey];\n if (target[installedKey] === bridge) delete target[installedKey];\n bridge.dispose();\n };\n}\n\n/** The bootstrap installs this before executing app code. URL apps can install an explicit connection. */\nexport function getDataAppTransport(frame: Window = window) {\n return (frame as FrameWindow)[installedKey];\n}\n",
9
+ "import { DataSourceError } from '@/src/core/contract';\nimport type {\n DataOperations,\n DisclosedQuery,\n Lakehouse,\n OperationContext,\n DataQueryBody,\n} from '@/src/core/operation-types';\n\ntype Operation = DataOperations[string];\ntype OperationExecutionOptions = {\n operationName: string;\n lakehouse: Lakehouse;\n signal: AbortSignal;\n /** Include query evidence in the response; this does not keep browser-owned SQL private. */\n includeSql: boolean;\n requestId: string;\n};\n\n/** Shared operation execution. Adapters own authorization, delivery, and public errors. */\nexport async function executeDataOperation(\n operation: Operation,\n value: unknown,\n {\n operationName,\n lakehouse,\n signal: requestSignal,\n includeSql,\n requestId,\n }: OperationExecutionOptions\n) {\n requestSignal.throwIfAborted();\n let input: unknown;\n try {\n input = operation.input(value);\n } catch {\n throw new OperationInputError();\n }\n\n const signal = AbortSignal.any([\n requestSignal,\n AbortSignal.timeout(operation.policy.maxDurationMs),\n ]);\n const execution = createOperationLakehouse(\n operation,\n lakehouse,\n signal,\n operationName\n );\n try {\n const output = await runOperation(operation, input, {\n lakehouse: execution.lakehouse,\n signal,\n });\n const body: DataQueryBody<unknown> = {\n data: operation.output(output),\n requestId,\n queriedAt: new Date().toISOString(),\n queryIds: execution.queryIds,\n ...(operation.policy.exposeSql && includeSql\n ? { queries: execution.queries }\n : {}),\n };\n const serializedBody = JSON.stringify(body);\n const responseBytes = new TextEncoder().encode(serializedBody).byteLength;\n if (responseBytes > (operation.policy.maxResponseBytes ?? 1_000_000))\n throw new Error('Response exceeds byte limit.');\n\n return { body, serializedBody };\n } catch (error) {\n if (signal.aborted && !(error instanceof DataSourceError))\n throw new OperationTimeoutError();\n throw error;\n }\n}\n\n/** Query evidence follows statement invocation order; query IDs retain completion order. */\nfunction createOperationLakehouse(\n operation: Operation,\n source: Lakehouse,\n signal: AbortSignal,\n operationName: string\n) {\n const queryIds: string[] = [];\n const queries: DisclosedQuery[] = [];\n const lakehouse: Lakehouse = {\n async queryAll(statement, options) {\n if (!Number.isInteger(options.limit) || options.limit < 1)\n throw new Error('Query needs a positive row limit.');\n if (\n operation.queryNames &&\n !Object.values(operation.queryNames).includes(options.name ?? '')\n )\n throw new Error(\n `Query name is not registered for operation ${operationName}.`\n );\n const query: DisclosedQuery = {\n name: options.name ?? `Query ${queries.length + 1}`,\n statement,\n };\n queries.push(query);\n const limit = Math.min(options.limit, operation.policy.maxQueryRows);\n let result;\n try {\n result = await source.queryAll(statement, {\n limit,\n signal: AbortSignal.any([signal, options.signal]),\n });\n } catch (error) {\n if (error instanceof DataSourceError) error.queryName = query.name;\n throw error;\n }\n if (result.rows.length > limit)\n throw new Error('Result exceeds row limit.');\n if (result.queryId) {\n query.queryId = result.queryId;\n queryIds.push(result.queryId);\n }\n\n return result;\n },\n };\n\n return { lakehouse, queries, queryIds };\n}\n\n/** Settle cancellation even when operation code or its lakehouse ignores the signal. */\nasync function runOperation(\n operation: Operation,\n input: unknown,\n { lakehouse, signal }: OperationContext\n) {\n let abort: (() => void) | undefined;\n try {\n signal.throwIfAborted();\n const cancelled = new Promise<never>((_, reject) => {\n function rejectAborted() {\n reject(new Error('Request aborted.'));\n }\n abort = rejectAborted;\n signal.addEventListener('abort', rejectAborted, { once: true });\n if (signal.aborted) rejectAborted();\n });\n\n return await Promise.race([\n cancelled,\n Promise.resolve().then(() => {\n signal.throwIfAborted();\n\n return operation.run({ lakehouse, signal }, input as never);\n }),\n ]);\n } finally {\n if (abort) signal.removeEventListener('abort', abort);\n }\n}\n\nclass OperationTimeoutError extends Error {}\n\nclass OperationInputError extends Error {}\n\nconst sourceErrorMessages = {\n unauthorized:\n 'This app could not authenticate its data connection. Contact the app owner.',\n forbidden:\n 'This app cannot access the requested data. Contact the app owner.',\n rate_limited: 'The lakehouse is busy. Wait a moment and retry.',\n query_rejected:\n \"A lakehouse query was rejected. Check the app's data operation.\",\n unavailable: 'The lakehouse is unavailable. Check the connection and retry.',\n};\n\nexport function toDataOperationFailure(error: unknown, aborted = false) {\n if (error instanceof OperationInputError)\n return {\n status: 400,\n code: 'invalid_input',\n message: \"Check this operation's inputs.\",\n };\n if (error instanceof DataSourceError)\n return {\n status: error.reason === 'rate_limited' ? 429 : 502,\n code: `source_${error.reason}`,\n message: sourceErrorMessages[error.reason],\n };\n const timedOut = aborted || error instanceof OperationTimeoutError;\n return {\n status: timedOut ? 504 : 502,\n code: timedOut ? 'timeout' : 'query_failed',\n message: timedOut\n ? 'The data request timed out.'\n : 'The data request failed.',\n };\n}\n"
10
+ ],
11
+ "mappings": ";;;;;;;;;;;;;;;;AASA,IAAM,aAAa,OAAO,IAAI,mCAAmC;AAAA;AAE1D,MAAM,sBAAqB,MAAM;AAAA,EAYpB;AAAA,EACA;AAAA,GAZR,cAAc;AAAA,UAEhB,OAAO,YAAY,CAAC,OAAyB;AAAA,IACnD,OACE,iBAAiB,SAChB,MAAqC,gBAAgB;AAAA;AAAA,EAI1D,WAAW,CACT,SACgB,MACA,WAChB;AAAA,IACA,MAAM,OAAO;AAAA,IAHG;AAAA,IACA;AAAA,IAGhB,KAAK,OAAO;AAAA;AAEhB;AAEO,SAAS,oBAAmB;AAAA,EACjC,WAAW;AAAA,EACX,OAAO,UAAU,WAAW;AAAA,IAI1B,CAAC,GAAkB;AAAA,EACrB,eAAe,WAAW,CACxB,WACA,OACA,QAC4B;AAAA,IAC5B,MAAM,WAAW,MAAM,QACrB,GAAG,SAAS,QAAQ,OAAO,EAAE,KAAK,mBAAmB,SAAS,KAC9D;AAAA,MACE,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAC9C,MAAM,KAAK,UAAU,KAAK;AAAA,MAC1B;AAAA,IACF,CACF;AAAA,IACA,IAAI;AAAA,MACF,OAAO,EAAE,QAAQ,SAAS,QAAQ,MAAM,MAAM,SAAS,KAAK,EAAE;AAAA,MAC9D,OAAO,OAAO;AAAA,MACd,IAAI,QAAQ;AAAA,QAAS,MAAM;AAAA,MAC3B,MAAM,IAAI,cACR,SAAS,KAAK,mCAAmC,wBACjD,SAAS,KAAK,qBAAqB,gBACrC;AAAA;AAAA;AAAA,EAIJ,OAAO;AAAA;;;ACtDF,SAAS,oBAAuD,CACrE,QACA,WACA;AAAA,EACA,OAAO;AAAA,SACC,QAGL,CACC,OACA,WACE,WAAqC,CAAC,GACK;AAAA,MAC7C,QAAQ,eAAe;AAAA,MACvB,IAAI,CAAC,OAAO,OAAO,QAAQ,KAAK;AAAA,QAC9B,MAAM,IAAI,qBACR,iBACA,wBACF;AAAA,MACF,MAAM,WAAW,OAAO;AAAA,MACxB,IAAI;AAAA,MACJ,IAAI;AAAA,QACF,QAAQ,SAAS,MAAM,OAAO;AAAA,QAC9B,MAAM;AAAA,QACN,MAAM,IAAI,qBACR,mBACA,0BACF;AAAA;AAAA,MAEF,MAAM,WAAW,MAAM,UAAU,EAAE,OAAO,SAAS,MAAM,GAAG,MAAM;AAAA,MAClE,QAAQ,eAAe;AAAA,MACvB,IAAI;AAAA,QACF,OAAO,SAAS,OAAO,UAAU,KAAc;AAAA,QAI/C,OAAO,OAAO;AAAA,QACd,IAAI,iBAAiB;AAAA,UAAqB,MAAM;AAAA,QAChD,MAAM,IAAI,qBACR,oBACA,2BACF;AAAA;AAAA;AAAA,EAGN;AAAA;;;ACjDK,SAAS,kBAAkB,CAChC,SACA,MACe;AAAA,EACf,SAAS,OAAO,CAAC,MAA4B;AAAA,IAC3C,IAAI,KAAK,WAAW,KAAK,OAAO,KAAK,OAAO,YAAY;AAAA,MACtD,MAAM,QAAiB,KAAK,GAAG;AAAA,MAC/B,OAAO,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC,KAAK;AAAA,IAC9C;AAAA,IACA,OAAO,KAAK,IAAI,SAAQ,OAAO,QAAQ,aAAa,IAAI,IAAI,GAAI;AAAA;AAAA,EAGlE,SAAS,KAAK,CAAC,QAA6B,MAAiB;AAAA,IAC3D,IAAI,CAAC,QAAQ;AAAA,MAAG;AAAA,IAChB,IAAI;AAAA,MACF,KAAK,EAAE,QAAQ,MAAM,QAAQ,IAAI,EAAE,CAAC;AAAA,MACpC,MAAM;AAAA;AAAA,EAKV,OAAO;AAAA,IACL,KAAK,IAAI,SAAS,MAAM,OAAO,IAAI;AAAA,IACnC,MAAM,IAAI,SAAS,MAAM,QAAQ,IAAI;AAAA,IACrC,MAAM,IAAI,SAAS,MAAM,QAAQ,IAAI;AAAA,IACrC,OAAO,IAAI,SAAS,MAAM,SAAS,IAAI;AAAA,EACzC;AAAA;AAIK,SAAS,gBAAgB,CAC9B,QACA,SACA;AAAA,EACA,IAAI,QAAQ,SAAS;AAAA,IAAe;AAAA,EACpC,OAAO,IAAI,MAAM;AAAA,IACf,MAAM,WAKF,EAAE,MAAM,QAAQ,KAAK;AAAA,IACzB,IAAI,QAAQ;AAAA,MAAS,SAAS,KAAK,QAAQ;AAAA,IAC3C,IAAI,QAAQ,SAAS,kBAAkB;AAAA,MACrC,SAAS,QAAQ,QAAQ;AAAA,MACzB,MAAM,UAAU,QAAQ;AAAA,MACxB,IACE,QAAQ,UAAU,gBAClB,WACA,OAAO,YAAY,YACnB,eAAe,WACf,OAAO,QAAQ,cAAc;AAAA,QAE7B,SAAS,YAAY,QAAQ;AAAA,IACjC;AAAA,IACA,OAAO,CAAC,6BAA6B,QAAQ;AAAA,GAC9C;AAAA;;;ACnCH,SAAS,uBAAuB,CAAC,OAAuB;AAAA,EACtD,IAAI,iBAAiB;AAAA,IACnB,MAAM,IAAI,cAAa,MAAM,SAAS,MAAM,MAAM,MAAM,SAAS;AAAA,EACnE,MAAM;AAAA;AAID,SAAS,sBAAqB;AAAA,EACnC;AAAA,EACA,QAAQ,QAAQ;AAAA,EAChB,YAAY;AAAA,EACZ,OAAO;AAAA,EACP;AAAA,GAOC;AAAA,EACD,IAAI,IAAI,IAAI,YAAY,EAAE,WAAW;AAAA,IACnC,MAAM,IAAI,MAAM,kCAAkC;AAAA,EACpD,MAAM,aAAa,OAAO,WAAW;AAAA,EACrC,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI,WAAW;AAAA,EACf,MAAM,UAAU,IAAI;AAAA,EACpB,IAAI;AAAA,EACJ,MAAM,iBAAiB,IAAI;AAAA,EAC3B,MAAM,SAAS,mBACb,MACE,CAAC,YACD,CAAC,CAAC,aACF,CAAC,CAAC,aACF,OAAO,cAAc,aACrB,aAAa,cACb,UAAU,YAAY,MACxB,WAAS,KAAK,cAAc,EAAE,SAAS,MAAM,CAAC,CAChD;AAAA,EAEA,MAAM,WAAW,qBAAqB;AAAA,IACpC,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,QAAQ,MAAM,MAAM;AAAA,IACpB,QAAQ,SAAS;AAAA,IACjB,SAAS,OAAO,EAAE,YAAY,WAAW,MAAM;AAAA,IAC/C,IAAI,CAAC,SAAS;AAAA,MACZ,MAAM,OAAO,YAAY,SAAS,YAAY;AAAA,MAC9C,iBAAiB,QAAQ,OAAO;AAAA;AAAA,IAElC,UAAU;AAAA,MACR,OAAO,CAAC,SAAS;AAAA,QACf,IAAI,SAAS;AAAA,UAAU,QAAQ,QAAQ;AAAA,QACvC,KAAK,SAAS,CAAC,CAAC;AAAA;AAAA,MAElB,UAAU,CAAC,SAAS;AAAA,QAClB,IAAI,aAAa,cAAc,QAAQ,WAAW;AAAA,UAChD,WAAW,SAAS,QAAQ,OAAO;AAAA,YACjC,MAAM,OACJ,IAAI,cACF,+CACA,cACF,CACF;AAAA,QACJ;AAAA,QACA,MAAM,QAAQ,CAAC;AAAA,QACf,YAAY,QAAQ;AAAA,QACpB,aAAa,QAAQ,KAAK;AAAA,QAC1B,IAAI;AAAA,UAAO,WAAW,SAAS,QAAQ,OAAO;AAAA,YAAG,MAAM,MAAM;AAAA,QAC7D,IAAI;AAAA,UAAU;AAAA,QACd,IAAI,SAAS;AAAA,UAAO,KAAK,gBAAgB,CAAC,CAAC;AAAA;AAAA,MAE7C,WAAW,CAAC,SAAS;AAAA,QACnB,aAAa,QAAQ,KAAK;AAAA;AAAA,MAE5B,UAAU,CAAC,SAAS;AAAA,QAClB,IAAI,SAAS;AAAA,UAAU,aAAa,QAAQ,UAAU;AAAA;AAAA,MAExD,MAAM,CAAC,SAAS;AAAA,QACd,QAAQ,IAAI,QAAQ,EAAE,GAAG,QAAQ,QAAQ,QAAQ;AAAA;AAAA,MAEnD,KAAK,CAAC,SAAS;AAAA,QACb,QACG,IAAI,QAAQ,EAAE,GACb,OACA,IAAI,qBACF,QAAQ,MACR,QAAQ,SACR,QAAQ,SACV,CACF;AAAA;AAAA,IAEN;AAAA,EACF,CAAC;AAAA,EACD,MAAM,OAAO,SAAS;AAAA,EACtB,MAAM,UAAU,SAAS;AAAA,EAEzB,SAAS,YAAY,CAAC,OAAgB;AAAA,IACpC,YAAY;AAAA,IACZ,WAAW,YAAY;AAAA,MAAgB,SAAS,KAAK;AAAA;AAAA,EAGvD,MAAM,iBAAiB,WAAW,OAAO;AAAA,EAEzC,SAAS,cAAc,CACrB,SACA,QACkB;AAAA,IAClB,OAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AAAA,MACtC,IAAI;AAAA,QACF,OAAO,OACL,IAAI,cAAa,2BAA2B,eAAe,CAC7D;AAAA,MACF,IAAI,QAAQ;AAAA,QAAS,OAAO,OAAO,OAAO,MAAM;AAAA,MAChD,IAAI,QAAQ,QAAQ;AAAA,QAClB,OAAO,OACL,IAAI,cAAa,mCAAmC,aAAa,CACnE;AAAA,MACF,MAAM,KAAK,OAAO,WAAW;AAAA,MAC7B,IAAI,OAAO;AAAA,MAEX,SAAS,OAAO,GAAG;AAAA,QACjB,aAAa,KAAK;AAAA,QAClB,QAAQ,oBAAoB,SAAS,KAAK;AAAA,QAC1C,QAAQ,OAAO,EAAE;AAAA;AAAA,MAGnB,SAAS,KAAK,GAAG;AAAA,QACf,IAAI;AAAA,UAAM,KAAK,UAAU,EAAE,GAAG,CAAC;AAAA,QAC/B,QAAQ;AAAA,QACR,OAAO,QAAQ,MAAM;AAAA;AAAA,MAGvB,MAAM,QAAQ,WAAW,MAAM;AAAA,QAC7B,IAAI;AAAA,UAAM,KAAK,UAAU,EAAE,GAAG,CAAC;AAAA,QAC/B,QAAQ;AAAA,QACR,OACE,IAAI,cACF,YACI,gCACA,yDACJ,YAAY,YAAY,oBAC1B,CACF;AAAA,SACC,SAAS;AAAA,MACZ,MAAM,QAAiB;AAAA,QACrB,KAAK,GAAG;AAAA,UACN,IAAI;AAAA,YAAM;AAAA,UACV,IAAI;AAAA,YACF,KAAK,WAAW;AAAA,cACd;AAAA,cACA,OAAO,QAAQ;AAAA,cACf,SAAS,QAAQ;AAAA,YACnB,CAAC;AAAA,YACD,OAAO;AAAA,YACP,MAAM;AAAA,YACN,QAAQ;AAAA,YACR,OACE,IAAI,cACF,0CACA,iBACF,CACF;AAAA;AAAA;AAAA,QAGJ,OAAO,CAAC,OAAO;AAAA,UACb,QAAQ;AAAA,UACR,QAAQ,KAAK;AAAA;AAAA,QAEf,MAAM,CAAC,OAAO;AAAA,UACZ,QAAQ;AAAA,UACR,OAAO,KAAK;AAAA;AAAA,MAEhB;AAAA,MACA,QAAQ,IAAI,IAAI,KAAK;AAAA,MACrB,QAAQ,iBAAiB,SAAS,OAAO,EAAE,MAAM,KAAK,CAAC;AAAA,MACvD,IAAI;AAAA,QAAW,MAAM,MAAM;AAAA,MACtB,SAAI,SAAS,SAAS;AAAA,QAAO,KAAK,SAAS,CAAC,CAAC;AAAA,KACnD;AAAA;AAAA,EAGH,MAAM,WAAW,qBACf,EAAE,cAAc,sBAAqB,GAAG,YAAY,eAAc,GAClE,cACF;AAAA,EAEA,SAAS,cAAc,CACrB,WACA,OACA,QAC4B;AAAA,IAC5B,OAAO,SACJ,QAAQ,cAAc,EAAE,WAAW,MAAM,GAAG,EAAE,OAAO,CAAC,EACtD,MAAM,uBAAuB;AAAA;AAAA,EAGlC,SAAS,UAAU,GAAG;AAAA,IACpB,IAAI;AAAA,MAAW,KAAK,cAAc,CAAC,CAAC;AAAA,IACpC,YAAY;AAAA,IACZ,WAAW,SAAS,QAAQ,OAAO;AAAA,MACjC,MAAM,OACJ,IAAI,cAAa,2BAA2B,eAAe,CAC7D;AAAA;AAAA,EAGJ,SAAS,MAAM,CAAC,OAA4B;AAAA,IAC1C,IAAI,MAAM,cAAc,SAAS,SAAS;AAAA,MAAQ,KAAK,SAAS,CAAC,CAAC;AAAA;AAAA,EAGpE,SAAS,OAAO,GAAG;AAAA,IACjB,IAAI;AAAA,MAAU;AAAA,IACd,WAAW;AAAA,IACX,WAAW;AAAA,IACX,SAAS,QAAQ;AAAA,IACjB,MAAM,oBAAoB,WAAW,OAAO;AAAA,IAC5C,MAAM,oBAAoB,YAAY,UAAU;AAAA,IAChD,MAAM,oBAAoB,YAAY,MAAM;AAAA,IAC5C,eAAe,MAAM;AAAA;AAAA,EAGvB,MAAM,iBAAiB,YAAY,UAAU;AAAA,EAC7C,MAAM,iBAAiB,YAAY,MAAM;AAAA,EACzC,IAAI,SAAS;AAAA,IAAO,KAAK,SAAS,CAAC,CAAC;AAAA,EAEpC,OAAO;AAAA,IACL;AAAA,IACA,SAAS;AAAA,IACT,WAAW;AAAA,IACX,WAAW;AAAA,MACT,QAAQ,CAAC,aAAa,OAAO,UAAU;AAAA,QACrC,OAAO,SACJ,QAAQ,YAAY,EAAE,WAAW,MAAM,GAAG,EAAE,OAAO,CAAC,EACpD,MAAM,uBAAuB;AAAA;AAAA,IAEpC;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ,GAAG;AAAA,MACT,OAAO;AAAA;AAAA,IAET,SAAS,CAAC,UAAoC;AAAA,MAC5C,eAAe,IAAI,QAAQ;AAAA,MAE3B,OAAO,MAAM;AAAA,QACX,eAAe,OAAO,QAAQ;AAAA;AAAA;AAAA,IAGlC,KAAK,GAAG;AAAA,MACN,IAAI,CAAC,YAAY;AAAA,QAAW,KAAK,gBAAgB,CAAC,CAAC;AAAA;AAAA,IAErD,IAAI,GAAG;AAAA,MACL,IAAI,CAAC,YAAY;AAAA,QAAW,KAAK,gBAAgB,CAAC,CAAC;AAAA;AAAA,EAEvD;AAAA;AAKF,IAAM,YAAY,OAAO,IAAI,6BAA6B;AAC1D,IAAM,eAAe,OAAO,IAAI,+BAA+B;AAWxD,SAAS,gBAAgB,CAAC,SAA0C;AAAA,EACzE,MAAM,eACJ,YACC,OAAO,WAAW,WAAW,cAAc,YAAY,WAAW;AAAA,EACrE,IAAI,CAAC;AAAA,IAAc;AAAA,EACnB,MAAM,QAAQ;AAAA,EACd,IAAI,MAAM;AAAA,IAAY,OAAO,MAAM;AAAA,EACnC,MAAM,eACJ,IAAI,IAAI,MAAM,SAAS,IAAI,EAAE,aAAa,IAAI,YAAY,KAAK;AAAA,EACjE,IAAI,CAAC;AAAA,IAAc;AAAA,EAEnB,eAAe,OAAO,CAAC,cAAsB;AAAA,IAC3C,IAAI;AAAA,MACF,MAAM,WAAW,MAAM,MAAM,MAAM,wBAAwB;AAAA,QACzD,QAAQ,YAAY,QAAQ,IAAI;AAAA,MAClC,CAAC;AAAA,MACD,MAAM,SAAU,MAAM,SAAS,KAAK;AAAA,MACpC,IACE,CAAC,SAAS,MACV,OAAO,WAAW,gBAClB,MAAM,WAAW;AAAA,QAEjB,MAAM,IAAI,MAAM,qCAAqC;AAAA,MAEvD,IAAI,MAAM;AAAA,QAAe,OAAO,MAAM;AAAA,MACtC,IAAI,MAAM,eAAe;AAAA,QACvB,MAAM,IAAI,MAAM,kCAAkC;AAAA,MACpD,MAAM,SAAS,uBAAsB,EAAE,cAAc,QAAQ,MAAM,CAAC;AAAA,MACpE,MAAM,aAAa;AAAA,MACnB,MAAM,gBAAgB;AAAA,MAEtB,OAAO;AAAA,MACP,MAAM;AAAA,MACN,MAAM,IAAI,cACR,wFACA,oBACF;AAAA;AAAA;AAAA,EAIJ,IAAI;AAAA,EAEJ,SAAS,aAAa,GAAG;AAAA,IACvB,MAAM,YAAY,MAAM;AAAA,IACxB,IAAI;AAAA,MAAW,OAAO,QAAQ,QAAQ,SAAS;AAAA,IAC/C,IAAI,CAAC,YAAY;AAAA,MACf,MAAM,UAAU,QAAQ,YAAY;AAAA,MACpC,aAAa;AAAA,MAER,QAAQ,MAAM,MAAM;AAAA,QACvB,IAAI,eAAe;AAAA,UAAS,aAAa;AAAA,OAC1C;AAAA,IACH;AAAA,IAEA,OAAO;AAAA;AAAA,EAGT,MAAM,QAAqB;AAAA,SACnB,UAAS,CAAC,WAAW,OAAO,QAAQ;AAAA,MACxC,QAAQ,eAAe;AAAA,MACvB,MAAM,UAAU,cAAc;AAAA,MAC9B,IAAI;AAAA,MACJ,IAAI;AAAA,QACF,MAAM,SAAS,SACX,MAAM,QAAQ,KAAK;AAAA,UACjB;AAAA,UACA,IAAI,QAAe,CAAC,GAAG,WAAW;AAAA,YAChC,MAAM,gBAAgB;AAAA,YAEtB,SAAS,WAAW,GAAG;AAAA,cACrB,OAAO,cAAc,MAAM;AAAA;AAAA,YAG7B,QAAQ;AAAA,YACR,cAAc,iBAAiB,SAAS,aAAa;AAAA,cACnD,MAAM;AAAA,YACR,CAAC;AAAA,WACF;AAAA,QACH,CAAC,IACD,MAAM;AAAA,QACV,QAAQ,eAAe;AAAA,QAEvB,OAAO,OAAO,UAAU,WAAW,OAAO,MAAM;AAAA,gBAChD;AAAA,QACA,IAAI;AAAA,UAAO,QAAQ,oBAAoB,SAAS,KAAK;AAAA;AAAA;AAAA,IAGzD,SAAS;AAAA,EACX;AAAA,EACA,MAAM,aAAa;AAAA,EAEd,cAAc,EAAE,MAAM,MAAM,EAAE;AAAA,EAEnC,OAAO;AAAA;AAIF,SAAS,wBAAuB,CACrC,QACA,QAAgB,QAChB;AAAA,EACA,MAAM,SAAS;AAAA,EACf,IAAI,OAAO;AAAA,IACT,MAAM,IAAI,MAAM,4CAA4C;AAAA,EAC9D,OAAO,aAAa;AAAA,EACpB,OAAO,gBAAgB;AAAA,EAEvB,OAAO,MAAM;AAAA,IACX,IAAI,OAAO,eAAe;AAAA,MAAQ,OAAO,OAAO;AAAA,IAChD,IAAI,OAAO,kBAAkB;AAAA,MAAQ,OAAO,OAAO;AAAA,IACnD,OAAO,QAAQ;AAAA;AAAA;AAKZ,SAAS,oBAAmB,CAAC,QAAgB,QAAQ;AAAA,EAC1D,OAAQ,MAAsB;AAAA;;;ACvYhC,eAAsB,oBAAoB,CACxC,WACA;AAAA,EAEE;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,GAEF;AAAA,EACA,cAAc,eAAe;AAAA,EAC7B,IAAI;AAAA,EACJ,IAAI;AAAA,IACF,QAAQ,UAAU,MAAM,KAAK;AAAA,IAC7B,MAAM;AAAA,IACN,MAAM,IAAI;AAAA;AAAA,EAGZ,MAAM,SAAS,YAAY,IAAI;AAAA,IAC7B;AAAA,IACA,YAAY,QAAQ,UAAU,OAAO,aAAa;AAAA,EACpD,CAAC;AAAA,EACD,MAAM,YAAY,yBAChB,WACA,WACA,QACA,aACF;AAAA,EACA,IAAI;AAAA,IACF,MAAM,SAAS,MAAM,aAAa,WAAW,OAAO;AAAA,MAClD,WAAW,UAAU;AAAA,MACrB;AAAA,IACF,CAAC;AAAA,IACD,MAAM,OAA+B;AAAA,MACnC,MAAM,UAAU,OAAO,MAAM;AAAA,MAC7B;AAAA,MACA,WAAW,IAAI,KAAK,EAAE,YAAY;AAAA,MAClC,UAAU,UAAU;AAAA,SAChB,UAAU,OAAO,aAAa,aAC9B,EAAE,SAAS,UAAU,QAAQ,IAC7B,CAAC;AAAA,IACP;AAAA,IACA,MAAM,iBAAiB,KAAK,UAAU,IAAI;AAAA,IAC1C,MAAM,gBAAgB,IAAI,YAAY,EAAE,OAAO,cAAc,EAAE;AAAA,IAC/D,IAAI,iBAAiB,UAAU,OAAO,oBAAoB;AAAA,MACxD,MAAM,IAAI,MAAM,8BAA8B;AAAA,IAEhD,OAAO,EAAE,MAAM,eAAe;AAAA,IAC9B,OAAO,OAAO;AAAA,IACd,IAAI,OAAO,WAAW,EAAE,iBAAiB;AAAA,MACvC,MAAM,IAAI;AAAA,IACZ,MAAM;AAAA;AAAA;AAKV,SAAS,wBAAwB,CAC/B,WACA,QACA,QACA,eACA;AAAA,EACA,MAAM,WAAqB,CAAC;AAAA,EAC5B,MAAM,UAA4B,CAAC;AAAA,EACnC,MAAM,YAAuB;AAAA,SACrB,SAAQ,CAAC,WAAW,SAAS;AAAA,MACjC,IAAI,CAAC,OAAO,UAAU,QAAQ,KAAK,KAAK,QAAQ,QAAQ;AAAA,QACtD,MAAM,IAAI,MAAM,mCAAmC;AAAA,MACrD,IACE,UAAU,cACV,CAAC,OAAO,OAAO,UAAU,UAAU,EAAE,SAAS,QAAQ,QAAQ,EAAE;AAAA,QAEhE,MAAM,IAAI,MACR,8CAA8C,gBAChD;AAAA,MACF,MAAM,QAAwB;AAAA,QAC5B,MAAM,QAAQ,QAAQ,SAAS,QAAQ,SAAS;AAAA,QAChD;AAAA,MACF;AAAA,MACA,QAAQ,KAAK,KAAK;AAAA,MAClB,MAAM,QAAQ,KAAK,IAAI,QAAQ,OAAO,UAAU,OAAO,YAAY;AAAA,MACnE,IAAI;AAAA,MACJ,IAAI;AAAA,QACF,SAAS,MAAM,OAAO,SAAS,WAAW;AAAA,UACxC;AAAA,UACA,QAAQ,YAAY,IAAI,CAAC,QAAQ,QAAQ,MAAM,CAAC;AAAA,QAClD,CAAC;AAAA,QACD,OAAO,OAAO;AAAA,QACd,IAAI,iBAAiB;AAAA,UAAiB,MAAM,YAAY,MAAM;AAAA,QAC9D,MAAM;AAAA;AAAA,MAER,IAAI,OAAO,KAAK,SAAS;AAAA,QACvB,MAAM,IAAI,MAAM,2BAA2B;AAAA,MAC7C,IAAI,OAAO,SAAS;AAAA,QAClB,MAAM,UAAU,OAAO;AAAA,QACvB,SAAS,KAAK,OAAO,OAAO;AAAA,MAC9B;AAAA,MAEA,OAAO;AAAA;AAAA,EAEX;AAAA,EAEA,OAAO,EAAE,WAAW,SAAS,SAAS;AAAA;AAIxC,eAAe,YAAY,CACzB,WACA,SACE,WAAW,UACb;AAAA,EACA,IAAI;AAAA,EACJ,IAAI;AAAA,IACF,OAAO,eAAe;AAAA,IACtB,MAAM,YAAY,IAAI,QAAe,CAAC,GAAG,WAAW;AAAA,MAClD,SAAS,aAAa,GAAG;AAAA,QACvB,OAAO,IAAI,MAAM,kBAAkB,CAAC;AAAA;AAAA,MAEtC,QAAQ;AAAA,MACR,OAAO,iBAAiB,SAAS,eAAe,EAAE,MAAM,KAAK,CAAC;AAAA,MAC9D,IAAI,OAAO;AAAA,QAAS,cAAc;AAAA,KACnC;AAAA,IAED,OAAO,MAAM,QAAQ,KAAK;AAAA,MACxB;AAAA,MACA,QAAQ,QAAQ,EAAE,KAAK,MAAM;AAAA,QAC3B,OAAO,eAAe;AAAA,QAEtB,OAAO,UAAU,IAAI,EAAE,WAAW,OAAO,GAAG,KAAc;AAAA,OAC3D;AAAA,IACH,CAAC;AAAA,YACD;AAAA,IACA,IAAI;AAAA,MAAO,OAAO,oBAAoB,SAAS,KAAK;AAAA;AAAA;AAAA;AAIxD,MAAM,8BAA8B,MAAM;AAAC;AAAA;AAE3C,MAAM,4BAA4B,MAAM;AAAC;AAEzC,IAAM,sBAAsB;AAAA,EAC1B,cACE;AAAA,EACF,WACE;AAAA,EACF,cAAc;AAAA,EACd,gBACE;AAAA,EACF,aAAa;AACf;AAEO,SAAS,sBAAsB,CAAC,OAAgB,UAAU,OAAO;AAAA,EACtE,IAAI,iBAAiB;AAAA,IACnB,OAAO;AAAA,MACL,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,EACF,IAAI,iBAAiB;AAAA,IACnB,OAAO;AAAA,MACL,QAAQ,MAAM,WAAW,iBAAiB,MAAM;AAAA,MAChD,MAAM,UAAU,MAAM;AAAA,MACtB,SAAS,oBAAoB,MAAM;AAAA,IACrC;AAAA,EACF,MAAM,WAAW,WAAW,iBAAiB;AAAA,EAC7C,OAAO;AAAA,IACL,QAAQ,WAAW,MAAM;AAAA,IACzB,MAAM,WAAW,YAAY;AAAA,IAC7B,SAAS,WACL,gCACA;AAAA,EACN;AAAA;",
12
+ "debugId": "07C270EAF2B6B13764756E2164756E21",
13
+ "names": []
14
+ }
@@ -4,7 +4,7 @@ import {
4
4
  createDataClient2,
5
5
  createDataAppNavigation2,
6
6
  getDataAppNavigation2
7
- } from "../chunks/contract-xtxza1fy.js";
7
+ } from "../chunks/contract-a061yj6r.js";
8
8
  import {
9
9
  DataAppError2,
10
10
  createHttpTransport2,
@@ -12,7 +12,7 @@ import {
12
12
  createIframeTransport2,
13
13
  installDataAppTransport2,
14
14
  getDataAppTransport2
15
- } from "../chunks/contract-mwe7gnmh.js";
15
+ } from "../chunks/contract-sm7j7k95.js";
16
16
  export {
17
17
  DataAppError2 as DataAppError,
18
18
  createDataAppNavigation2 as createDataAppNavigation,
@@ -4,13 +4,13 @@ import {
4
4
  createIframeTransport2,
5
5
  installDataAppTransport2,
6
6
  toDataOperationFailure
7
- } from "../chunks/contract-mwe7gnmh.js";
7
+ } from "../chunks/contract-sm7j7k95.js";
8
8
  import {
9
9
  attachDataAppBridge2
10
- } from "../chunks/contract-zr3jd7mr.js";
10
+ } from "../chunks/contract-g6hky7x6.js";
11
11
  import {
12
12
  PARENT_PARAM
13
- } from "../chunks/contract-cxr9t12b.js";
13
+ } from "../chunks/contract-awa2d5b1.js";
14
14
  import {
15
15
  MessageRoutingError2
16
16
  } from "../chunks/contract-tf8c3qpv.js";
@@ -21,6 +21,7 @@ function startDataAppBootstrap({
21
21
  }) {
22
22
  let loaded;
23
23
  let failed = false;
24
+ const bundleSource = `altertable-data-app-${crypto.randomUUID()}.js`;
24
25
  const bridge = createIframeTransport2({
25
26
  parentOrigin,
26
27
  window: frame,
@@ -39,7 +40,8 @@ function startDataAppBootstrap({
39
40
  loaded = javascript;
40
41
  try {
41
42
  const script = frame.document.createElement("script");
42
- script.textContent = javascript;
43
+ script.textContent = `${javascript}
44
+ //# sourceURL=${bundleSource}`;
43
45
  frame.document.body.append(script);
44
46
  if (!failed)
45
47
  bridge.ready();
@@ -52,12 +54,20 @@ function startDataAppBootstrap({
52
54
  failed = true;
53
55
  bridge.fail();
54
56
  }
55
- frame.addEventListener("error", reportError);
56
- frame.addEventListener("unhandledrejection", reportError);
57
+ function reportBundleError(event) {
58
+ if (event.filename === bundleSource)
59
+ reportError();
60
+ }
61
+ function reportBundleRejection(event) {
62
+ if (event.reason instanceof Error && event.reason.stack?.includes(bundleSource))
63
+ reportError();
64
+ }
65
+ frame.addEventListener("error", reportBundleError);
66
+ frame.addEventListener("unhandledrejection", reportBundleRejection);
57
67
  const uninstall = installDataAppTransport2(bridge, frame);
58
68
  return () => {
59
- frame.removeEventListener("error", reportError);
60
- frame.removeEventListener("unhandledrejection", reportError);
69
+ frame.removeEventListener("error", reportBundleError);
70
+ frame.removeEventListener("unhandledrejection", reportBundleRejection);
61
71
  uninstall();
62
72
  };
63
73
  }
@@ -120,4 +130,4 @@ export {
120
130
  startDataAppBootstrap
121
131
  };
122
132
 
123
- //# debugId=8D42834A22C5D16864756E2164756E21
133
+ //# debugId=7CE51753C032335E64756E2164756E21
@@ -2,11 +2,11 @@
2
2
  "version": 3,
3
3
  "sources": ["../src/embed/bootstrap.ts", "../src/embed/navigation.ts", "../src/embed/sql.ts"],
4
4
  "sourcesContent": [
5
- "import {\n createIframeTransport,\n installDataAppTransport,\n} from '@/src/client/iframe';\n\n/** Run from a trusted bootstrap page in an allow-scripts-only iframe. CSP can prohibit network access. */\nexport function startDataAppBootstrap({\n parentOrigin,\n window: frame = window,\n}: {\n parentOrigin: string;\n window?: Window;\n}) {\n let loaded: string | undefined;\n let failed = false;\n const bridge = createIframeTransport({\n parentOrigin,\n window: frame,\n mode: 'bundle',\n loadScript(javascript) {\n if (loaded !== undefined) {\n if (javascript === loaded) {\n if (failed) bridge.fail();\n else bridge.ready();\n } else bridge.fail();\n\n return;\n }\n loaded = javascript;\n try {\n const script = frame.document.createElement('script');\n script.textContent = javascript;\n frame.document.body.append(script);\n if (!failed) bridge.ready();\n } catch {\n reportError();\n }\n },\n });\n\n function reportError() {\n failed = true;\n bridge.fail();\n }\n\n frame.addEventListener('error', reportError);\n frame.addEventListener('unhandledrejection', reportError);\n const uninstall = installDataAppTransport(bridge, frame);\n\n return () => {\n frame.removeEventListener('error', reportError);\n frame.removeEventListener('unhandledrejection', reportError);\n uninstall();\n };\n}\n",
5
+ "import {\n createIframeTransport,\n installDataAppTransport,\n} from '@/src/client/iframe';\n\n/** Run from a trusted bootstrap page in an allow-scripts-only iframe. CSP can prohibit network access. */\nexport function startDataAppBootstrap({\n parentOrigin,\n window: frame = window,\n}: {\n parentOrigin: string;\n window?: Window;\n}) {\n let loaded: string | undefined;\n let failed = false;\n const bundleSource = `altertable-data-app-${crypto.randomUUID()}.js`;\n const bridge = createIframeTransport({\n parentOrigin,\n window: frame,\n mode: 'bundle',\n loadScript(javascript) {\n if (loaded !== undefined) {\n if (javascript === loaded) {\n if (failed) bridge.fail();\n else bridge.ready();\n } else bridge.fail();\n\n return;\n }\n loaded = javascript;\n try {\n const script = frame.document.createElement('script');\n script.textContent = `${javascript}\\n//# sourceURL=${bundleSource}`;\n frame.document.body.append(script);\n if (!failed) bridge.ready();\n } catch {\n reportError();\n }\n },\n });\n\n function reportError() {\n failed = true;\n bridge.fail();\n }\n\n function reportBundleError(event: ErrorEvent) {\n if (event.filename === bundleSource) reportError();\n }\n\n function reportBundleRejection(event: PromiseRejectionEvent) {\n if (\n event.reason instanceof Error &&\n event.reason.stack?.includes(bundleSource)\n )\n reportError();\n }\n\n frame.addEventListener('error', reportBundleError);\n frame.addEventListener('unhandledrejection', reportBundleRejection);\n const uninstall = installDataAppTransport(bridge, frame);\n\n return () => {\n frame.removeEventListener('error', reportBundleError);\n frame.removeEventListener('unhandledrejection', reportBundleRejection);\n uninstall();\n };\n}\n",
6
6
  "import { PARENT_PARAM } from '@/src/core/bridge';\nimport type { NavigationUpdate } from '@/src/core/messages';\n\n/** Override this handler for framework routers. Reserved host parameters survive app navigation. */\nexport function createNavigationHandler({\n window: host = window,\n reservedSearchParams = [],\n}: {\n window?: Window;\n reservedSearchParams?: readonly string[];\n} = {}) {\n function navigate(input: NavigationUpdate): null {\n const previous = new URL(host.location.href);\n const url = new URL(previous);\n url.search = input.search;\n url.searchParams.delete(PARENT_PARAM);\n for (const name of reservedSearchParams) {\n url.searchParams.delete(name);\n for (const value of previous.searchParams.getAll(name))\n url.searchParams.append(name, value);\n }\n url.hash = input.hash;\n if (url.href !== host.location.href)\n host.history[input.mode === 'push' ? 'pushState' : 'replaceState'](\n null,\n '',\n url\n );\n if (input.title !== undefined) host.document.title = input.title;\n\n return null;\n }\n\n return navigate;\n}\n",
7
7
  "import type { Lakehouse } from '@/src/core/contract';\nimport { toDataOperationFailure } from '@/src/core/operation';\nimport {\n MessageRoutingError,\n type MessageContext,\n type SqlQueryInput,\n} from '@/src/core/messages';\n\n/** Authorize every SQL request and supply a backend that independently enforces access and query limits. */\nexport function createSqlQueryHandler(\n authorize: (\n query: SqlQueryInput,\n context: MessageContext\n ) => Promise<Lakehouse>\n) {\n async function handleSqlQuery(input: SqlQueryInput, context: MessageContext) {\n const requestId = crypto.randomUUID();\n context.signal.throwIfAborted();\n let lakehouse: Lakehouse;\n try {\n lakehouse = await authorize(input, context);\n } catch {\n context.signal.throwIfAborted();\n throw new MessageRoutingError(\n 'forbidden',\n 'You cannot run this query.',\n requestId\n );\n }\n context.signal.throwIfAborted();\n try {\n return await lakehouse.queryAll(input.statement, {\n limit: input.limit,\n signal: context.signal,\n });\n } catch (error) {\n context.signal.throwIfAborted();\n if (error instanceof MessageRoutingError) throw error;\n const failure = toDataOperationFailure(error);\n throw new MessageRoutingError(failure.code, failure.message, requestId);\n }\n }\n\n return handleSqlQuery;\n}\n"
8
8
  ],
9
- "mappings": "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",
10
- "debugId": "8D42834A22C5D16864756E2164756E21",
9
+ "mappings": "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",
10
+ "debugId": "7CE51753C032335E64756E2164756E21",
11
11
  "names": []
12
12
  }
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  attachDataAppBridge2
3
- } from "../../chunks/contract-zr3jd7mr.js";
3
+ } from "../../chunks/contract-g6hky7x6.js";
4
4
 
5
5
  // src/react/embed/bridge.tsx
6
6
  import {
@@ -30,6 +30,7 @@ function useBridgeState(props) {
30
30
  });
31
31
  useEffect(() => {
32
32
  hostRef.current?.setPresentation(props.presentation);
33
+ hostRef.current?.setLogger(props.logger);
33
34
  });
34
35
  return { hostRef, handlers };
35
36
  }
@@ -52,6 +53,7 @@ function SourceBridge(props) {
52
53
  },
53
54
  startupTimeoutMs,
54
55
  presentation: handlers.current.presentation,
56
+ logger: handlers.current.logger,
55
57
  onMessage(request, context) {
56
58
  return handlers.current.onMessage(request, context);
57
59
  },
@@ -89,6 +91,7 @@ function ConnectionBridge(props) {
89
91
  connection: type === "origin" ? { type, origin: identity } : { type, token: identity },
90
92
  window: host,
91
93
  presentation: handlers.current.presentation,
94
+ logger: handlers.current.logger,
92
95
  onMessage(request, context) {
93
96
  return handlers.current.onMessage(request, context);
94
97
  },
@@ -111,4 +114,4 @@ export {
111
114
  DataAppBridge
112
115
  };
113
116
 
114
- //# debugId=E8F422449EF0920064756E2164756E21
117
+ //# debugId=B4EEBF8F19FDFE1F64756E2164756E21
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../src/react/embed/bridge.tsx"],
4
4
  "sourcesContent": [
5
- "import {\n useRef,\n useLayoutEffect,\n useEffect,\n useState,\n type ComponentRef,\n type ComponentPropsWithoutRef,\n} from 'react';\nimport {\n attachDataAppBridge,\n type DataAppBridgeOptions,\n} from '@/src/embed/bridge';\nimport type { DataAppConnection, DataAppHost } from '@/src/embed/host';\nimport type { DataAppSource } from '@/src/embed/source';\n\nexport type DataAppBridgeProps = Pick<\n DataAppBridgeOptions,\n 'onMessage' | 'onStatusChange' | 'onDiagnostic' | 'presentation'\n> &\n (\n | {\n source: DataAppSource;\n title: string;\n startupTimeoutMs?: number;\n iframeProps?: Omit<\n ComponentPropsWithoutRef<'iframe'>,\n | 'src'\n | 'srcDoc'\n | 'sandbox'\n | 'referrerPolicy'\n | 'loading'\n | 'children'\n | 'title'\n >;\n iframe?: never;\n connection?: never;\n }\n | {\n iframe: ComponentRef<'iframe'> | null;\n connection: DataAppConnection;\n source?: never;\n title?: never;\n startupTimeoutMs?: never;\n iframeProps?: never;\n }\n );\n\n/** Owns iframe setup and delivery. The consuming shell owns loading, error UI, and retries. */\nexport function DataAppBridge(props: DataAppBridgeProps) {\n if (props.source) {\n const source = props.source;\n const identity = JSON.stringify(\n source.type === 'url'\n ? [source.type, source.url]\n : [source.type, source.bootstrapUrl, source.javascript]\n );\n\n return <SourceBridge key={identity} {...props} />;\n }\n\n return <ConnectionBridge {...props} />;\n}\n\ntype SourceBridgeProps = Extract<DataAppBridgeProps, { source: DataAppSource }>;\ntype ConnectionBridgeProps = Extract<\n DataAppBridgeProps,\n { connection: DataAppConnection }\n>;\n\nfunction useBridgeState(props: DataAppBridgeProps) {\n const hostRef = useRef<DataAppHost | undefined>(undefined);\n const handlers = useRef(props);\n\n useLayoutEffect(() => {\n handlers.current = props;\n });\n\n useEffect(() => {\n hostRef.current?.setPresentation(props.presentation);\n });\n\n return { hostRef, handlers };\n}\n\nfunction SourceBridge(props: SourceBridgeProps) {\n const { source, title, iframeProps, startupTimeoutMs } = props;\n const [iframe, setIframe] = useState<ComponentRef<'iframe'> | null>(null);\n const { hostRef, handlers } = useBridgeState(props);\n const type = source.type;\n const url = source.type === 'url' ? source.url : source.bootstrapUrl;\n const javascript = source.type === 'bundle' ? source.javascript : undefined;\n\n useEffect(() => {\n if (!iframe) return;\n\n const bridge = attachDataAppBridge({\n iframe,\n source:\n type === 'url'\n ? { type, url }\n : {\n type,\n bootstrapUrl: url,\n javascript: javascript!,\n },\n startupTimeoutMs,\n presentation: handlers.current.presentation,\n onMessage(request, context) {\n return handlers.current.onMessage(request, context);\n },\n onStatusChange(status) {\n return handlers.current.onStatusChange?.(status);\n },\n onDiagnostic(event) {\n return handlers.current.onDiagnostic?.(event);\n },\n });\n hostRef.current = bridge;\n\n return () => {\n hostRef.current = undefined;\n bridge.dispose();\n };\n }, [iframe, type, url, javascript, startupTimeoutMs, hostRef, handlers]);\n\n return (\n <iframe {...iframeProps} loading=\"eager\" ref={setIframe} title={title} />\n );\n}\n\nfunction ConnectionBridge(props: ConnectionBridgeProps) {\n const { iframe, connection } = props;\n const { hostRef, handlers } = useBridgeState(props);\n const identity =\n connection.type === 'origin' ? connection.origin : connection.token;\n const type = connection.type;\n\n useEffect(() => {\n const host = iframe?.ownerDocument.defaultView;\n if (!iframe || !host) return;\n\n const bridge = attachDataAppBridge({\n iframe,\n connection:\n type === 'origin'\n ? { type, origin: identity }\n : { type, token: identity },\n window: host,\n presentation: handlers.current.presentation,\n onMessage(request, context) {\n return handlers.current.onMessage(request, context);\n },\n onStatusChange(status) {\n return handlers.current.onStatusChange?.(status);\n },\n onDiagnostic(event) {\n return handlers.current.onDiagnostic?.(event);\n },\n });\n hostRef.current = bridge;\n\n return () => {\n hostRef.current = undefined;\n bridge.dispose();\n };\n }, [iframe, type, identity, hostRef, handlers]);\n\n return null;\n}\n"
5
+ "import {\n useRef,\n useLayoutEffect,\n useEffect,\n useState,\n type ComponentRef,\n type ComponentPropsWithoutRef,\n} from 'react';\nimport {\n attachDataAppBridge,\n type DataAppBridgeOptions,\n} from '@/src/embed/bridge';\nimport type { DataAppConnection, DataAppHost } from '@/src/embed/host';\nimport type { DataAppSource } from '@/src/embed/source';\n\nexport type DataAppBridgeProps = Pick<\n DataAppBridgeOptions,\n 'onMessage' | 'onStatusChange' | 'onDiagnostic' | 'presentation' | 'logger'\n> &\n (\n | {\n source: DataAppSource;\n title: string;\n startupTimeoutMs?: number;\n iframeProps?: Omit<\n ComponentPropsWithoutRef<'iframe'>,\n | 'src'\n | 'srcDoc'\n | 'sandbox'\n | 'referrerPolicy'\n | 'loading'\n | 'children'\n | 'title'\n >;\n iframe?: never;\n connection?: never;\n }\n | {\n iframe: ComponentRef<'iframe'> | null;\n connection: DataAppConnection;\n source?: never;\n title?: never;\n startupTimeoutMs?: never;\n iframeProps?: never;\n }\n );\n\n/** Owns iframe setup and delivery. The consuming shell owns loading, error UI, and retries. */\nexport function DataAppBridge(props: DataAppBridgeProps) {\n if (props.source) {\n const source = props.source;\n const identity = JSON.stringify(\n source.type === 'url'\n ? [source.type, source.url]\n : [source.type, source.bootstrapUrl, source.javascript]\n );\n\n return <SourceBridge key={identity} {...props} />;\n }\n\n return <ConnectionBridge {...props} />;\n}\n\ntype SourceBridgeProps = Extract<DataAppBridgeProps, { source: DataAppSource }>;\ntype ConnectionBridgeProps = Extract<\n DataAppBridgeProps,\n { connection: DataAppConnection }\n>;\n\nfunction useBridgeState(props: DataAppBridgeProps) {\n const hostRef = useRef<DataAppHost | undefined>(undefined);\n const handlers = useRef(props);\n\n useLayoutEffect(() => {\n handlers.current = props;\n });\n\n useEffect(() => {\n hostRef.current?.setPresentation(props.presentation);\n hostRef.current?.setLogger(props.logger);\n });\n\n return { hostRef, handlers };\n}\n\nfunction SourceBridge(props: SourceBridgeProps) {\n const { source, title, iframeProps, startupTimeoutMs } = props;\n const [iframe, setIframe] = useState<ComponentRef<'iframe'> | null>(null);\n const { hostRef, handlers } = useBridgeState(props);\n const type = source.type;\n const url = source.type === 'url' ? source.url : source.bootstrapUrl;\n const javascript = source.type === 'bundle' ? source.javascript : undefined;\n\n useEffect(() => {\n if (!iframe) return;\n\n const bridge = attachDataAppBridge({\n iframe,\n source:\n type === 'url'\n ? { type, url }\n : {\n type,\n bootstrapUrl: url,\n javascript: javascript!,\n },\n startupTimeoutMs,\n presentation: handlers.current.presentation,\n logger: handlers.current.logger,\n onMessage(request, context) {\n return handlers.current.onMessage(request, context);\n },\n onStatusChange(status) {\n return handlers.current.onStatusChange?.(status);\n },\n onDiagnostic(event) {\n return handlers.current.onDiagnostic?.(event);\n },\n });\n hostRef.current = bridge;\n\n return () => {\n hostRef.current = undefined;\n bridge.dispose();\n };\n }, [iframe, type, url, javascript, startupTimeoutMs, hostRef, handlers]);\n\n return (\n <iframe {...iframeProps} loading=\"eager\" ref={setIframe} title={title} />\n );\n}\n\nfunction ConnectionBridge(props: ConnectionBridgeProps) {\n const { iframe, connection } = props;\n const { hostRef, handlers } = useBridgeState(props);\n const identity =\n connection.type === 'origin' ? connection.origin : connection.token;\n const type = connection.type;\n\n useEffect(() => {\n const host = iframe?.ownerDocument.defaultView;\n if (!iframe || !host) return;\n\n const bridge = attachDataAppBridge({\n iframe,\n connection:\n type === 'origin'\n ? { type, origin: identity }\n : { type, token: identity },\n window: host,\n presentation: handlers.current.presentation,\n logger: handlers.current.logger,\n onMessage(request, context) {\n return handlers.current.onMessage(request, context);\n },\n onStatusChange(status) {\n return handlers.current.onStatusChange?.(status);\n },\n onDiagnostic(event) {\n return handlers.current.onDiagnostic?.(event);\n },\n });\n hostRef.current = bridge;\n\n return () => {\n hostRef.current = undefined;\n bridge.dispose();\n };\n }, [iframe, type, identity, hostRef, handlers]);\n\n return null;\n}\n"
6
6
  ],
7
- "mappings": ";;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAgDO,SAAS,aAAa,CAAC,OAA2B;AAAA,EACvD,IAAI,MAAM,QAAQ;AAAA,IAChB,MAAM,SAAS,MAAM;AAAA,IACrB,MAAM,WAAW,KAAK,UACpB,OAAO,SAAS,QACZ,CAAC,OAAO,MAAM,OAAO,GAAG,IACxB,CAAC,OAAO,MAAM,OAAO,cAAc,OAAO,UAAU,CAC1D;AAAA,IAEA,uBAAO,IAAC,cAAD;AAAA,SAAiC;AAAA,OAAd,QAAqB;AAAA,EACjD;AAAA,EAEA,uBAAO,IAAC,kBAAD;AAAA,OAAsB;AAAA,GAAO;AAAA;AAStC,SAAS,cAAc,CAAC,OAA2B;AAAA,EACjD,MAAM,UAAU,OAAgC,SAAS;AAAA,EACzD,MAAM,WAAW,OAAO,KAAK;AAAA,EAE7B,gBAAgB,MAAM;AAAA,IACpB,SAAS,UAAU;AAAA,GACpB;AAAA,EAED,UAAU,MAAM;AAAA,IACd,QAAQ,SAAS,gBAAgB,MAAM,YAAY;AAAA,GACpD;AAAA,EAED,OAAO,EAAE,SAAS,SAAS;AAAA;AAG7B,SAAS,YAAY,CAAC,OAA0B;AAAA,EAC9C,QAAQ,QAAQ,OAAO,aAAa,qBAAqB;AAAA,EACzD,OAAO,QAAQ,aAAa,SAAwC,IAAI;AAAA,EACxE,QAAQ,SAAS,aAAa,eAAe,KAAK;AAAA,EAClD,MAAM,OAAO,OAAO;AAAA,EACpB,MAAM,MAAM,OAAO,SAAS,QAAQ,OAAO,MAAM,OAAO;AAAA,EACxD,MAAM,aAAa,OAAO,SAAS,WAAW,OAAO,aAAa;AAAA,EAElE,UAAU,MAAM;AAAA,IACd,IAAI,CAAC;AAAA,MAAQ;AAAA,IAEb,MAAM,SAAS,qBAAoB;AAAA,MACjC;AAAA,MACA,QACE,SAAS,QACL,EAAE,MAAM,IAAI,IACZ;AAAA,QACE;AAAA,QACA,cAAc;AAAA,QACd;AAAA,MACF;AAAA,MACN;AAAA,MACA,cAAc,SAAS,QAAQ;AAAA,MAC/B,SAAS,CAAC,SAAS,SAAS;AAAA,QAC1B,OAAO,SAAS,QAAQ,UAAU,SAAS,OAAO;AAAA;AAAA,MAEpD,cAAc,CAAC,QAAQ;AAAA,QACrB,OAAO,SAAS,QAAQ,iBAAiB,MAAM;AAAA;AAAA,MAEjD,YAAY,CAAC,OAAO;AAAA,QAClB,OAAO,SAAS,QAAQ,eAAe,KAAK;AAAA;AAAA,IAEhD,CAAC;AAAA,IACD,QAAQ,UAAU;AAAA,IAElB,OAAO,MAAM;AAAA,MACX,QAAQ,UAAU;AAAA,MAClB,OAAO,QAAQ;AAAA;AAAA,KAEhB,CAAC,QAAQ,MAAM,KAAK,YAAY,kBAAkB,SAAS,QAAQ,CAAC;AAAA,EAEvE,uBACE,IAAC,UAAD;AAAA,OAAY;AAAA,IAAa,SAAQ;AAAA,IAAQ,KAAK;AAAA,IAAW;AAAA,GAAc;AAAA;AAI3E,SAAS,gBAAgB,CAAC,OAA8B;AAAA,EACtD,QAAQ,QAAQ,eAAe;AAAA,EAC/B,QAAQ,SAAS,aAAa,eAAe,KAAK;AAAA,EAClD,MAAM,WACJ,WAAW,SAAS,WAAW,WAAW,SAAS,WAAW;AAAA,EAChE,MAAM,OAAO,WAAW;AAAA,EAExB,UAAU,MAAM;AAAA,IACd,MAAM,OAAO,QAAQ,cAAc;AAAA,IACnC,IAAI,CAAC,UAAU,CAAC;AAAA,MAAM;AAAA,IAEtB,MAAM,SAAS,qBAAoB;AAAA,MACjC;AAAA,MACA,YACE,SAAS,WACL,EAAE,MAAM,QAAQ,SAAS,IACzB,EAAE,MAAM,OAAO,SAAS;AAAA,MAC9B,QAAQ;AAAA,MACR,cAAc,SAAS,QAAQ;AAAA,MAC/B,SAAS,CAAC,SAAS,SAAS;AAAA,QAC1B,OAAO,SAAS,QAAQ,UAAU,SAAS,OAAO;AAAA;AAAA,MAEpD,cAAc,CAAC,QAAQ;AAAA,QACrB,OAAO,SAAS,QAAQ,iBAAiB,MAAM;AAAA;AAAA,MAEjD,YAAY,CAAC,OAAO;AAAA,QAClB,OAAO,SAAS,QAAQ,eAAe,KAAK;AAAA;AAAA,IAEhD,CAAC;AAAA,IACD,QAAQ,UAAU;AAAA,IAElB,OAAO,MAAM;AAAA,MACX,QAAQ,UAAU;AAAA,MAClB,OAAO,QAAQ;AAAA;AAAA,KAEhB,CAAC,QAAQ,MAAM,UAAU,SAAS,QAAQ,CAAC;AAAA,EAE9C,OAAO;AAAA;",
8
- "debugId": "E8F422449EF0920064756E2164756E21",
7
+ "mappings": "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",
8
+ "debugId": "B4EEBF8F19FDFE1F64756E2164756E21",
9
9
  "names": []
10
10
  }