@gscdump/cloudflare 0.24.0 → 0.25.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.
@@ -1,6 +1,8 @@
1
- import { IcebergTableName } from "@gscdump/engine";
2
1
  import { ArchetypeQuery, ArchetypeResult, ArchetypeResultRow } from "@gscdump/sdk";
2
+ import { IcebergTableName } from "@gscdump/engine/iceberg";
3
3
  import { ServerTailDirective } from "@gscdump/contracts";
4
+ /** Placeholder substituted for the engine-specific table reference. */
5
+ declare const TABLE_PLACEHOLDER = "{{TABLE}}";
4
6
  /** A dialect-neutral SQL plan. */
5
7
  interface ArchetypeSqlPlan {
6
8
  /** SQL with `{{TABLE}}` standing in for the table reference. */
@@ -10,6 +12,13 @@ interface ArchetypeSqlPlan {
10
12
  /** The Iceberg fact table this query reads. */
11
13
  table: IcebergTableName;
12
14
  }
15
+ /**
16
+ * Translate an archetype query to a dialect-neutral SQL plan.
17
+ *
18
+ * Throws for `arbitrary-sql` (caller-supplied SQL, handled by the DuckDB
19
+ * executor directly) and `aux-cloud-only` (not an Iceberg query).
20
+ */
21
+ declare function buildArchetypeSql(query: ArchetypeQuery): ArchetypeSqlPlan;
13
22
  /** Row returned by the DuckDB sibling. */
14
23
  type DuckDbIcebergRow = Record<string, string | number | null>;
15
24
  /**
@@ -161,4 +170,4 @@ interface ServerTailDispatcher {
161
170
  * executor and routes every `ArchetypeQuery` to one of them.
162
171
  */
163
172
  declare function createServerTailDispatcher(config: ServerTailDispatcherConfig): ServerTailDispatcher;
164
- export { type ArchetypeSqlPlan, DuckDbIcebergError, type DuckDbIcebergExecutor, type DuckDbIcebergExecutorConfig, type DuckDbIcebergResult, type DuckDbIcebergRow, DuckDbIcebergTimeoutError, type DuckDbSvc, type R2SqlClient, type R2SqlClientConfig, R2SqlError, type R2SqlResult, type R2SqlRow, R2SqlTimeoutError, type ServerTailDispatcher, type ServerTailDispatcherConfig, type ServerTailEngine, ServerTailRoutingError, createDuckDbIcebergExecutor, createR2SqlClient, createServerTailDispatcher, resolveServerTailEngine };
173
+ export { type ArchetypeSqlPlan, DuckDbIcebergError, type DuckDbIcebergExecutor, type DuckDbIcebergExecutorConfig, type DuckDbIcebergResult, type DuckDbIcebergRow, DuckDbIcebergTimeoutError, type DuckDbSvc, type R2SqlClient, type R2SqlClientConfig, R2SqlError, type R2SqlResult, type R2SqlRow, R2SqlTimeoutError, type ServerTailDispatcher, type ServerTailDispatcherConfig, type ServerTailEngine, ServerTailRoutingError, TABLE_PLACEHOLDER, buildArchetypeSql, createDuckDbIcebergExecutor, createR2SqlClient, createServerTailDispatcher, resolveServerTailEngine };
@@ -1,56 +1,5 @@
1
1
  import { bindLiterals, inferTable } from "@gscdump/engine";
2
2
  import { ARCHETYPE_EXECUTION_CLASS } from "@gscdump/sdk";
3
- var ServerTailRoutingError = class extends Error {
4
- name = "ServerTailRoutingError";
5
- };
6
- function resolveServerTailEngine(query) {
7
- const cls = ARCHETYPE_EXECUTION_CLASS[query.archetype];
8
- if (cls === "cloud-only") throw new ServerTailRoutingError(`archetype '${query.archetype}' is cloud-only — not a server-tail query`);
9
- if (cls === "duckdb") return "duckdb";
10
- if (query.archetype === "top-n-breakdown" && query.offset && query.offset > 0) return "duckdb";
11
- return "r2-sql";
12
- }
13
- function sourceFor(engine) {
14
- return engine === "r2-sql" ? "server-r2-sql" : "server-duckdb";
15
- }
16
- function createServerTailDispatcher(config) {
17
- function route(query) {
18
- return resolveServerTailEngine(query);
19
- }
20
- async function execute(query, directive) {
21
- const engine = route(query);
22
- if (directive && directive.engine !== engine && engine === "r2-sql") return runOn("duckdb", query);
23
- return runOn(engine, query);
24
- }
25
- async function runOn(engine, query) {
26
- if (engine === "r2-sql") {
27
- const res = await config.r2Sql.runArchetype(query);
28
- return {
29
- archetype: query.archetype,
30
- rows: res.rows,
31
- source: sourceFor("r2-sql"),
32
- meta: {
33
- rowCount: res.rows.length,
34
- queryMs: res.queryMs
35
- }
36
- };
37
- }
38
- const res = await config.duckdb.runArchetype(query);
39
- return {
40
- archetype: query.archetype,
41
- rows: res.rows,
42
- source: sourceFor("duckdb"),
43
- meta: {
44
- rowCount: res.rows.length,
45
- queryMs: res.queryMs
46
- }
47
- };
48
- }
49
- return {
50
- route,
51
- execute
52
- };
53
- }
54
3
  const TABLE_PLACEHOLDER = "{{TABLE}}";
55
4
  function dimColumn(dim) {
56
5
  if (dim === "page") return "url";
@@ -270,6 +219,57 @@ function buildArchetypeSql(query) {
270
219
  case "aux-cloud-only": throw new Error("buildArchetypeSql: aux-cloud-only is not an Iceberg query");
271
220
  }
272
221
  }
222
+ var ServerTailRoutingError = class extends Error {
223
+ name = "ServerTailRoutingError";
224
+ };
225
+ function resolveServerTailEngine(query) {
226
+ const cls = ARCHETYPE_EXECUTION_CLASS[query.archetype];
227
+ if (cls === "cloud-only") throw new ServerTailRoutingError(`archetype '${query.archetype}' is cloud-only — not a server-tail query`);
228
+ if (cls === "duckdb") return "duckdb";
229
+ if (query.archetype === "top-n-breakdown" && query.offset && query.offset > 0) return "duckdb";
230
+ return "r2-sql";
231
+ }
232
+ function sourceFor(engine) {
233
+ return engine === "r2-sql" ? "server-r2-sql" : "server-duckdb";
234
+ }
235
+ function createServerTailDispatcher(config) {
236
+ function route(query) {
237
+ return resolveServerTailEngine(query);
238
+ }
239
+ async function execute(query, directive) {
240
+ const engine = route(query);
241
+ if (directive && directive.engine !== engine && engine === "r2-sql") return runOn("duckdb", query);
242
+ return runOn(engine, query);
243
+ }
244
+ async function runOn(engine, query) {
245
+ if (engine === "r2-sql") {
246
+ const res = await config.r2Sql.runArchetype(query);
247
+ return {
248
+ archetype: query.archetype,
249
+ rows: res.rows,
250
+ source: sourceFor("r2-sql"),
251
+ meta: {
252
+ rowCount: res.rows.length,
253
+ queryMs: res.queryMs
254
+ }
255
+ };
256
+ }
257
+ const res = await config.duckdb.runArchetype(query);
258
+ return {
259
+ archetype: query.archetype,
260
+ rows: res.rows,
261
+ source: sourceFor("duckdb"),
262
+ meta: {
263
+ rowCount: res.rows.length,
264
+ queryMs: res.queryMs
265
+ }
266
+ };
267
+ }
268
+ return {
269
+ route,
270
+ execute
271
+ };
272
+ }
273
273
  var DuckDbIcebergError = class extends Error {
274
274
  name = "DuckDbIcebergError";
275
275
  };
@@ -445,4 +445,4 @@ function createR2SqlClient(config) {
445
445
  runArchetype
446
446
  };
447
447
  }
448
- export { DuckDbIcebergError, DuckDbIcebergTimeoutError, R2SqlError, R2SqlTimeoutError, ServerTailRoutingError, createDuckDbIcebergExecutor, createR2SqlClient, createServerTailDispatcher, resolveServerTailEngine };
448
+ export { DuckDbIcebergError, DuckDbIcebergTimeoutError, R2SqlError, R2SqlTimeoutError, ServerTailRoutingError, TABLE_PLACEHOLDER, buildArchetypeSql, createDuckDbIcebergExecutor, createR2SqlClient, createServerTailDispatcher, resolveServerTailEngine };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@gscdump/cloudflare",
3
3
  "type": "module",
4
- "version": "0.24.0",
4
+ "version": "0.25.0",
5
5
  "description": "Cloudflare-Workers-flavored helpers for the gscdump analytics stack: AnalyticsEnv binding contract, R2 SigV4 presigner, size-hint HMAC, DuckDB Workers shims, engine factory.",
6
6
  "author": {
7
7
  "name": "Harlan Wilton",
@@ -46,15 +46,15 @@
46
46
  "dependencies": {
47
47
  "@uwdata/flechette": "^2.5.0",
48
48
  "aws4fetch": "^1.0.20",
49
- "@gscdump/contracts": "0.24.0",
50
- "@gscdump/engine-sqlite": "0.24.0",
51
- "@gscdump/engine": "0.24.0",
52
- "@gscdump/sdk": "0.24.0",
53
- "gscdump": "0.24.0"
49
+ "@gscdump/contracts": "0.25.0",
50
+ "@gscdump/engine": "0.25.0",
51
+ "@gscdump/engine-sqlite": "0.25.0",
52
+ "@gscdump/sdk": "0.25.0",
53
+ "gscdump": "0.25.0"
54
54
  },
55
55
  "devDependencies": {
56
56
  "@cloudflare/vitest-pool-workers": "^0.16.10",
57
- "@cloudflare/workers-types": "^4.20260527.1",
57
+ "@cloudflare/workers-types": "^4.20260528.1",
58
58
  "h3": "^1.15.11",
59
59
  "typescript": "^6.0.3",
60
60
  "wrangler": "^4.95.0"