@gscdump/engine-sqlite 0.17.2 → 0.17.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -8,6 +8,22 @@ import { SqliteRemoteDatabase } from "drizzle-orm/sqlite-proxy";
8
8
  import { ManifestStore } from "@gscdump/engine";
9
9
  import { ComparisonMode, ResolveWindowOptions, ResolvedWindow, WindowPreset, resolveWindow } from "@gscdump/engine/period";
10
10
  import { DrizzleD1Database } from "drizzle-orm/d1";
11
+ interface CachedManifestStoreOptions {
12
+ ttlMs?: number;
13
+ }
14
+ interface CachedManifestStore extends ManifestStore {
15
+ bust: (scope: {
16
+ userId: string | number;
17
+ siteId?: string;
18
+ table?: string;
19
+ searchType?: string;
20
+ }) => void;
21
+ clear: () => void;
22
+ stats: () => {
23
+ size: number;
24
+ };
25
+ }
26
+ declare function createCachedManifestStore(inner: ManifestStore, options?: CachedManifestStoreOptions): CachedManifestStore;
11
27
  /**
12
28
  * Drizzle sqlite-core table definitions for the GSC analytics schema on D1.
13
29
  *
@@ -3189,4 +3205,4 @@ interface CreateSqliteResolverAdapterFromExecutorOptions {
3189
3205
  * an executor handy.
3190
3206
  */
3191
3207
  declare function createSqliteResolverAdapterFromExecutor(options: CreateSqliteResolverAdapterFromExecutorOptions): Promise<ResolverAdapter<TableKey>>;
3192
- export { type AnalyticsManifestDb, type ComparisonMode, type EngineConfig, type R2LockInsert, type R2LockSelect, type R2ManifestInsert, type R2ManifestSelect, type R2ShadowDiffInsert, type R2ShadowDiffSelect, type R2SyncStateInsert, type R2SyncStateSelect, type R2WatermarkInsert, type R2WatermarkSelect, type R2WriteErrorInsert, type R2WriteErrorSelect, type ResolveWindowOptions, type ResolvedWindow, type SQL, type Schema, type ScopedRunnerOptions, type SqliteInsightRunner, type SqliteInsightRunnerOptions, type SqliteQueryExecutor, type SqliteRowExecutor, type TableKey, type TableScope, type WindowPreset, aggClicks, aggCtr, aggImpressions, aggPosition, and, compileSqlite, createD1ManifestStore, createEngine, createSqliteInsightRunner, createSqliteResolverAdapter, createSqliteResolverAdapterFromExecutor, eq, gsc_countries, gsc_devices, gsc_keywords, gsc_page_keywords, gsc_pages, gte, lte, mergeScope, probeSqliteRegex, r2Locks, r2Manifest, r2ShadowDiffs, r2SyncStates, r2Watermarks, r2WriteErrors, resolveWindow, schema, scopeFor, sql, sqliteResolverAdapter };
3208
+ export { type AnalyticsManifestDb, type CachedManifestStore, type CachedManifestStoreOptions, type ComparisonMode, type EngineConfig, type R2LockInsert, type R2LockSelect, type R2ManifestInsert, type R2ManifestSelect, type R2ShadowDiffInsert, type R2ShadowDiffSelect, type R2SyncStateInsert, type R2SyncStateSelect, type R2WatermarkInsert, type R2WatermarkSelect, type R2WriteErrorInsert, type R2WriteErrorSelect, type ResolveWindowOptions, type ResolvedWindow, type SQL, type Schema, type ScopedRunnerOptions, type SqliteInsightRunner, type SqliteInsightRunnerOptions, type SqliteQueryExecutor, type SqliteRowExecutor, type TableKey, type TableScope, type WindowPreset, aggClicks, aggCtr, aggImpressions, aggPosition, and, compileSqlite, createCachedManifestStore, createD1ManifestStore, createEngine, createSqliteInsightRunner, createSqliteResolverAdapter, createSqliteResolverAdapterFromExecutor, eq, gsc_countries, gsc_devices, gsc_keywords, gsc_page_keywords, gsc_pages, gte, lte, mergeScope, probeSqliteRegex, r2Locks, r2Manifest, r2ShadowDiffs, r2SyncStates, r2Watermarks, r2WriteErrors, resolveWindow, schema, scopeFor, sql, sqliteResolverAdapter };
package/dist/index.mjs CHANGED
@@ -6,6 +6,70 @@ import { SQLiteAsyncDialect, index, integer, primaryKey, real, sqliteTable, text
6
6
  import { drizzle } from "drizzle-orm/sqlite-proxy";
7
7
  import { inferSearchType } from "@gscdump/engine";
8
8
  import { resolveWindow } from "@gscdump/engine/period";
9
+ const DEFAULT_TTL_MS = 3e4;
10
+ function cacheKey(filter) {
11
+ if (!filter.siteId || !filter.table || filter.partitions || filter.tier) return null;
12
+ const st = filter.searchType ?? "";
13
+ return `${filter.userId}\0${filter.siteId}\0${filter.table}\0${st}`;
14
+ }
15
+ function createCachedManifestStore(inner, options = {}) {
16
+ const ttlMs = options.ttlMs ?? DEFAULT_TTL_MS;
17
+ const cache = /* @__PURE__ */ new Map();
18
+ function bust(scope) {
19
+ const userId = String(scope.userId);
20
+ if (scope.siteId && scope.table && scope.searchType !== void 0) {
21
+ cache.delete(`${userId}\0${scope.siteId}\0${scope.table}\0${scope.searchType}`);
22
+ return;
23
+ }
24
+ const prefix = scope.siteId && scope.table ? `${userId}\0${scope.siteId}\0${scope.table}\0` : scope.siteId ? `${userId}\0${scope.siteId}\0` : `${userId}\0`;
25
+ for (const k of cache.keys()) if (k.startsWith(prefix)) cache.delete(k);
26
+ }
27
+ return {
28
+ listLive: async (filter) => {
29
+ const k = cacheKey(filter);
30
+ if (!k) return inner.listLive(filter);
31
+ const now = Date.now();
32
+ const hit = cache.get(k);
33
+ if (hit && hit.expiresAt > now) return hit.value;
34
+ const value = await inner.listLive(filter);
35
+ cache.set(k, {
36
+ value,
37
+ expiresAt: now + ttlMs
38
+ });
39
+ return value;
40
+ },
41
+ listAll: inner.listAll.bind(inner),
42
+ registerVersion: async (entry, superseding) => {
43
+ await inner.registerVersion(entry, superseding);
44
+ bust({
45
+ userId: entry.userId,
46
+ siteId: entry.siteId ?? "",
47
+ table: entry.table,
48
+ searchType: entry.searchType
49
+ });
50
+ },
51
+ registerVersions: async (entries, superseding) => {
52
+ await inner.registerVersions(entries, superseding);
53
+ for (const e of entries) bust({
54
+ userId: e.userId,
55
+ siteId: e.siteId ?? "",
56
+ table: e.table,
57
+ searchType: e.searchType
58
+ });
59
+ },
60
+ listRetired: inner.listRetired.bind(inner),
61
+ delete: inner.delete.bind(inner),
62
+ getWatermarks: inner.getWatermarks.bind(inner),
63
+ bumpWatermark: inner.bumpWatermark.bind(inner),
64
+ getSyncStates: inner.getSyncStates.bind(inner),
65
+ setSyncState: inner.setSyncState.bind(inner),
66
+ withLock: inner.withLock.bind(inner),
67
+ purgeTenant: inner.purgeTenant.bind(inner),
68
+ bust,
69
+ clear: () => cache.clear(),
70
+ stats: () => ({ size: cache.size })
71
+ };
72
+ }
9
73
  function metricCols() {
10
74
  return {
11
75
  clicks: integer("clicks").notNull().default(0),
@@ -500,4 +564,4 @@ function createD1ManifestStore(db) {
500
564
  purgeTenant
501
565
  };
502
566
  }
503
- export { aggClicks, aggCtr, aggImpressions, aggPosition, and, compileSqlite, createD1ManifestStore, createEngine, createSqliteInsightRunner, createSqliteResolverAdapter, createSqliteResolverAdapterFromExecutor, eq, gsc_countries, gsc_devices, gsc_keywords, gsc_page_keywords, gsc_pages, gte, lte, mergeScope, probeSqliteRegex, r2Locks, r2Manifest, r2ShadowDiffs, r2SyncStates, r2Watermarks, r2WriteErrors, resolveWindow, schema, scopeFor, sql, sqliteResolverAdapter };
567
+ export { aggClicks, aggCtr, aggImpressions, aggPosition, and, compileSqlite, createCachedManifestStore, createD1ManifestStore, createEngine, createSqliteInsightRunner, createSqliteResolverAdapter, createSqliteResolverAdapterFromExecutor, eq, gsc_countries, gsc_devices, gsc_keywords, gsc_page_keywords, gsc_pages, gte, lte, mergeScope, probeSqliteRegex, r2Locks, r2Manifest, r2ShadowDiffs, r2SyncStates, r2Watermarks, r2WriteErrors, resolveWindow, schema, scopeFor, sql, sqliteResolverAdapter };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@gscdump/engine-sqlite",
3
3
  "type": "module",
4
- "version": "0.17.2",
4
+ "version": "0.17.4",
5
5
  "description": "SQLite / D1 engine adapter for @gscdump/analysis — typed analytics over sqlite-proxy executors (Cloudflare D1, libsql).",
6
6
  "author": {
7
7
  "name": "Harlan Wilton",
@@ -44,8 +44,8 @@
44
44
  "drizzle-orm": "^0.45.2"
45
45
  },
46
46
  "dependencies": {
47
- "@gscdump/engine": "0.17.2",
48
- "gscdump": "0.17.2"
47
+ "@gscdump/engine": "0.17.4",
48
+ "gscdump": "0.17.4"
49
49
  },
50
50
  "devDependencies": {
51
51
  "drizzle-orm": "^0.45.2",