@gscdump/engine-sqlite 0.17.3 → 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 +17 -1
- package/dist/index.mjs +65 -1
- package/package.json +3 -3
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.
|
|
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.
|
|
48
|
-
"gscdump": "0.17.
|
|
47
|
+
"@gscdump/engine": "0.17.4",
|
|
48
|
+
"gscdump": "0.17.4"
|
|
49
49
|
},
|
|
50
50
|
"devDependencies": {
|
|
51
51
|
"drizzle-orm": "^0.45.2",
|