@se-studio/contentful-cms 2.6.1 → 2.7.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.
- package/CHANGELOG.md +6 -0
- package/dist/commands/asset.d.ts.map +1 -1
- package/dist/commands/asset.js +9 -5
- package/dist/commands/asset.js.map +1 -1
- package/dist/commands/create-from-json.d.ts.map +1 -1
- package/dist/commands/create-from-json.js +11 -0
- package/dist/commands/create-from-json.js.map +1 -1
- package/dist/commands/create-taxonomy.d.ts.map +1 -1
- package/dist/commands/create-taxonomy.js +5 -3
- package/dist/commands/create-taxonomy.js.map +1 -1
- package/dist/commands/create.d.ts.map +1 -1
- package/dist/commands/create.js +13 -3
- package/dist/commands/create.js.map +1 -1
- package/dist/commands/nav.d.ts.map +1 -1
- package/dist/commands/nav.js +14 -0
- package/dist/commands/nav.js.map +1 -1
- package/dist/commands/save.d.ts.map +1 -1
- package/dist/commands/save.js +13 -0
- package/dist/commands/save.js.map +1 -1
- package/dist/generated/hosted-guide.d.ts +1 -1
- package/dist/generated/hosted-guide.d.ts.map +1 -1
- package/dist/generated/hosted-guide.js +1 -1
- package/dist/generated/hosted-guide.js.map +1 -1
- package/dist/generated/version.d.ts +1 -1
- package/dist/generated/version.js +1 -1
- package/dist/hosted/index.d.ts +1 -0
- package/dist/hosted/index.d.ts.map +1 -1
- package/dist/hosted/index.js +1 -0
- package/dist/hosted/index.js.map +1 -1
- package/dist/hosted/next/redis.d.ts.map +1 -1
- package/dist/hosted/next/redis.js +11 -3
- package/dist/hosted/next/redis.js.map +1 -1
- package/dist/hosted/next/routes/mcp.d.ts.map +1 -1
- package/dist/hosted/next/routes/mcp.js +2 -1
- package/dist/hosted/next/routes/mcp.js.map +1 -1
- package/dist/index/blob.d.ts +5 -0
- package/dist/index/blob.d.ts.map +1 -0
- package/dist/index/blob.js +15 -0
- package/dist/index/blob.js.map +1 -0
- package/dist/index/cache-keys.d.ts +9 -0
- package/dist/index/cache-keys.d.ts.map +1 -0
- package/dist/index/cache-keys.js +13 -0
- package/dist/index/cache-keys.js.map +1 -0
- package/dist/index/cache-store.d.ts +31 -0
- package/dist/index/cache-store.d.ts.map +1 -0
- package/dist/index/cache-store.js +17 -0
- package/dist/index/cache-store.js.map +1 -0
- package/dist/index/distributed-sync-lock.d.ts +3 -0
- package/dist/index/distributed-sync-lock.d.ts.map +1 -0
- package/dist/index/distributed-sync-lock.js +22 -0
- package/dist/index/distributed-sync-lock.js.map +1 -0
- package/dist/index/file-index-cache.d.ts +16 -0
- package/dist/index/file-index-cache.d.ts.map +1 -0
- package/dist/index/file-index-cache.js +103 -0
- package/dist/index/file-index-cache.js.map +1 -0
- package/dist/index/hydrate.d.ts +4 -0
- package/dist/index/hydrate.d.ts.map +1 -0
- package/dist/index/hydrate.js +24 -0
- package/dist/index/hydrate.js.map +1 -0
- package/dist/index/invalidate.d.ts +24 -0
- package/dist/index/invalidate.d.ts.map +1 -0
- package/dist/index/invalidate.js +60 -0
- package/dist/index/invalidate.js.map +1 -0
- package/dist/index/patch-index.d.ts +12 -0
- package/dist/index/patch-index.d.ts.map +1 -0
- package/dist/index/patch-index.js +40 -0
- package/dist/index/patch-index.js.map +1 -0
- package/dist/index/publish-cache.d.ts +5 -0
- package/dist/index/publish-cache.d.ts.map +1 -0
- package/dist/index/publish-cache.js +26 -0
- package/dist/index/publish-cache.js.map +1 -0
- package/dist/index/redis-index-cache.d.ts +24 -0
- package/dist/index/redis-index-cache.d.ts.map +1 -0
- package/dist/index/redis-index-cache.js +83 -0
- package/dist/index/redis-index-cache.js.map +1 -0
- package/dist/index/require.d.ts +5 -4
- package/dist/index/require.d.ts.map +1 -1
- package/dist/index/require.js +17 -6
- package/dist/index/require.js.map +1 -1
- package/dist/index/run-sync.d.ts +2 -0
- package/dist/index/run-sync.d.ts.map +1 -1
- package/dist/index/run-sync.js +16 -9
- package/dist/index/run-sync.js.map +1 -1
- package/dist/index/sync.d.ts +9 -1
- package/dist/index/sync.d.ts.map +1 -1
- package/dist/index/sync.js +53 -0
- package/dist/index/sync.js.map +1 -1
- package/dist/runtime/context.d.ts +3 -0
- package/dist/runtime/context.d.ts.map +1 -1
- package/dist/runtime/context.js.map +1 -1
- package/dist/session/session-store.d.ts +2 -1
- package/dist/session/session-store.d.ts.map +1 -1
- package/docs/help/index-sync.md +9 -3
- package/docs/mcp/e2e-test-prompt.md +1 -1
- package/docs/mcp/hosted-guide.md +2 -0
- package/package.json +1 -1
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { IndexCacheKey } from './cache-keys.js';
|
|
2
|
+
import type { IndexBlobMeta, IndexCacheStore, IndexInvalidation } from './cache-store.js';
|
|
3
|
+
export declare class FileIndexCacheStore implements IndexCacheStore {
|
|
4
|
+
getInvalidation(key: IndexCacheKey): Promise<IndexInvalidation | null>;
|
|
5
|
+
setInvalidation(key: IndexCacheKey, inv: IndexInvalidation): Promise<void>;
|
|
6
|
+
clearInvalidation(key: IndexCacheKey): Promise<void>;
|
|
7
|
+
getBlob(key: IndexCacheKey): Promise<{
|
|
8
|
+
meta: IndexBlobMeta;
|
|
9
|
+
data: Uint8Array;
|
|
10
|
+
} | null>;
|
|
11
|
+
putBlob(key: IndexCacheKey, meta: IndexBlobMeta, data: Uint8Array): Promise<void>;
|
|
12
|
+
deleteBlob(key: IndexCacheKey): Promise<void>;
|
|
13
|
+
tryAcquireSyncLock(key: IndexCacheKey, holderId: string, ttlSeconds: number): Promise<boolean>;
|
|
14
|
+
releaseSyncLock(key: IndexCacheKey, holderId: string): Promise<void>;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=file-index-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-index-cache.d.ts","sourceRoot":"","sources":["../../src/index/file-index-cache.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AA0C1F,qBAAa,mBAAoB,YAAW,eAAe;IACnD,eAAe,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAItE,eAAe,CAAC,GAAG,EAAE,aAAa,EAAE,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAI1E,iBAAiB,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAQpD,OAAO,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,aAAa,CAAC;QAAC,IAAI,EAAE,UAAU,CAAA;KAAE,GAAG,IAAI,CAAC;IAWtF,OAAO,CAAC,GAAG,EAAE,aAAa,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAOjF,UAAU,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAU7C,kBAAkB,CACtB,GAAG,EAAE,aAAa,EAClB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,OAAO,CAAC;IAWb,eAAe,CAAC,GAAG,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAW3E"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import * as fs from 'node:fs';
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
import { getIndexDirectory } from './paths.js';
|
|
4
|
+
function cacheDirForKey(key) {
|
|
5
|
+
const space = {
|
|
6
|
+
spaceId: key.spaceId,
|
|
7
|
+
environment: key.environment,
|
|
8
|
+
managementToken: '',
|
|
9
|
+
defaultLocale: 'en-US',
|
|
10
|
+
};
|
|
11
|
+
return getIndexDirectory(space, key.preview);
|
|
12
|
+
}
|
|
13
|
+
function invalidationPath(key) {
|
|
14
|
+
return path.join(cacheDirForKey(key), 'invalidation.json');
|
|
15
|
+
}
|
|
16
|
+
function blobPath(key) {
|
|
17
|
+
return path.join(cacheDirForKey(key), 'media.db.gz');
|
|
18
|
+
}
|
|
19
|
+
function blobMetaPath(key) {
|
|
20
|
+
return path.join(cacheDirForKey(key), 'index-blob-meta.json');
|
|
21
|
+
}
|
|
22
|
+
function lockPath(key) {
|
|
23
|
+
return path.join(cacheDirForKey(key), 'sync.lock');
|
|
24
|
+
}
|
|
25
|
+
function readJsonFile(filePath) {
|
|
26
|
+
try {
|
|
27
|
+
return JSON.parse(fs.readFileSync(filePath, 'utf8'));
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
function writeJsonFile(filePath, value) {
|
|
34
|
+
fs.mkdirSync(path.dirname(filePath), { recursive: true });
|
|
35
|
+
fs.writeFileSync(filePath, `${JSON.stringify(value)}\n`, 'utf8');
|
|
36
|
+
}
|
|
37
|
+
export class FileIndexCacheStore {
|
|
38
|
+
async getInvalidation(key) {
|
|
39
|
+
return readJsonFile(invalidationPath(key));
|
|
40
|
+
}
|
|
41
|
+
async setInvalidation(key, inv) {
|
|
42
|
+
writeJsonFile(invalidationPath(key), inv);
|
|
43
|
+
}
|
|
44
|
+
async clearInvalidation(key) {
|
|
45
|
+
try {
|
|
46
|
+
fs.unlinkSync(invalidationPath(key));
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
// missing is fine
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
async getBlob(key) {
|
|
53
|
+
const meta = readJsonFile(blobMetaPath(key));
|
|
54
|
+
if (!meta)
|
|
55
|
+
return null;
|
|
56
|
+
try {
|
|
57
|
+
const data = fs.readFileSync(blobPath(key));
|
|
58
|
+
return { meta, data };
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
async putBlob(key, meta, data) {
|
|
65
|
+
const dir = cacheDirForKey(key);
|
|
66
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
67
|
+
fs.writeFileSync(blobPath(key), data);
|
|
68
|
+
writeJsonFile(blobMetaPath(key), meta);
|
|
69
|
+
}
|
|
70
|
+
async deleteBlob(key) {
|
|
71
|
+
for (const file of [blobPath(key), blobMetaPath(key)]) {
|
|
72
|
+
try {
|
|
73
|
+
fs.unlinkSync(file);
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
// missing is fine
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
async tryAcquireSyncLock(key, holderId, ttlSeconds) {
|
|
81
|
+
const lockFile = lockPath(key);
|
|
82
|
+
const now = Date.now();
|
|
83
|
+
const existing = readJsonFile(lockFile);
|
|
84
|
+
if (existing && existing.expiresAt > now && existing.holderId !== holderId) {
|
|
85
|
+
return false;
|
|
86
|
+
}
|
|
87
|
+
writeJsonFile(lockFile, { holderId, expiresAt: now + ttlSeconds * 1000 });
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
async releaseSyncLock(key, holderId) {
|
|
91
|
+
const lockFile = lockPath(key);
|
|
92
|
+
const existing = readJsonFile(lockFile);
|
|
93
|
+
if (existing?.holderId === holderId) {
|
|
94
|
+
try {
|
|
95
|
+
fs.unlinkSync(lockFile);
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
// missing is fine
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=file-index-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-index-cache.js","sourceRoot":"","sources":["../../src/index/file-index-cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { SpaceConfig } from '../config/types.js';
|
|
2
|
+
/** Restores a local SQLite index from a shared cache blob when missing and not invalidated. */
|
|
3
|
+
export declare function tryHydrateIndexFromCache(space: SpaceConfig, preview?: boolean): Promise<boolean>;
|
|
4
|
+
//# sourceMappingURL=hydrate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hydrate.d.ts","sourceRoot":"","sources":["../../src/index/hydrate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAOtD,+FAA+F;AAC/F,wBAAsB,wBAAwB,CAC5C,KAAK,EAAE,WAAW,EAClB,OAAO,CAAC,EAAE,OAAO,GAChB,OAAO,CAAC,OAAO,CAAC,CAiBlB"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { gunzipBuffer, writeFileBytes } from './blob.js';
|
|
2
|
+
import { indexCacheKeyFromSpace } from './cache-keys.js';
|
|
3
|
+
import { getIndexCacheStore } from './cache-store.js';
|
|
4
|
+
import { resolveIndexPreview } from './mode.js';
|
|
5
|
+
import { ensureIndexDirectory, getIndexDbPath, indexExists } from './paths.js';
|
|
6
|
+
/** Restores a local SQLite index from a shared cache blob when missing and not invalidated. */
|
|
7
|
+
export async function tryHydrateIndexFromCache(space, preview) {
|
|
8
|
+
const usePreview = resolveIndexPreview(preview);
|
|
9
|
+
if (indexExists(space, usePreview))
|
|
10
|
+
return false;
|
|
11
|
+
const cache = getIndexCacheStore();
|
|
12
|
+
const key = indexCacheKeyFromSpace(space, usePreview);
|
|
13
|
+
const [inv, blob] = await Promise.all([cache.getInvalidation(key), cache.getBlob(key)]);
|
|
14
|
+
if (!blob)
|
|
15
|
+
return false;
|
|
16
|
+
if (inv && Date.parse(inv.invalidatedAt) > Date.parse(blob.meta.syncedAt)) {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
ensureIndexDirectory(space, usePreview);
|
|
20
|
+
const dbPath = getIndexDbPath(space, usePreview);
|
|
21
|
+
writeFileBytes(dbPath, gunzipBuffer(blob.data));
|
|
22
|
+
return true;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=hydrate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hydrate.js","sourceRoot":"","sources":["../../src/index/hydrate.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE/E,+FAA+F;AAC/F,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,KAAkB,EAClB,OAAiB;IAEjB,MAAM,UAAU,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAChD,IAAI,WAAW,CAAC,KAAK,EAAE,UAAU,CAAC;QAAE,OAAO,KAAK,CAAC;IAEjD,MAAM,KAAK,GAAG,kBAAkB,EAAE,CAAC;IACnC,MAAM,GAAG,GAAG,sBAAsB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IACtD,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACxF,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IAExB,IAAI,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1E,OAAO,KAAK,CAAC;IACf,CAAC;IAED,oBAAoB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IACjD,cAAc,CAAC,MAAM,EAAE,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAChD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { EntryProps } from 'contentful-management';
|
|
2
|
+
import type { SpaceConfig } from '../config/types.js';
|
|
3
|
+
import type { CdaAssetRecord } from '../contentful/cda-sync.js';
|
|
4
|
+
import type { SerializedEntry } from '../session/state.js';
|
|
5
|
+
import { type IndexInvalidationMode } from './cache-store.js';
|
|
6
|
+
import type { CatalogContentType } from './schema.js';
|
|
7
|
+
export interface NotifyContentIndexChangedOptions {
|
|
8
|
+
mode?: IndexInvalidationMode;
|
|
9
|
+
session?: {
|
|
10
|
+
defaultLocale: string;
|
|
11
|
+
entries: Record<string, SerializedEntry>;
|
|
12
|
+
originalEntries: Record<string, SerializedEntry>;
|
|
13
|
+
};
|
|
14
|
+
savedEntryIds?: string[];
|
|
15
|
+
deletedEntryIds?: string[];
|
|
16
|
+
createdEntries?: Array<{
|
|
17
|
+
contentType: CatalogContentType;
|
|
18
|
+
entry: EntryProps;
|
|
19
|
+
}>;
|
|
20
|
+
upsertAssets?: CdaAssetRecord[];
|
|
21
|
+
}
|
|
22
|
+
/** Marks the shared index dirty and patches the local SQLite copy when present. Does not sync. */
|
|
23
|
+
export declare function notifyContentIndexChanged(space: SpaceConfig, opts?: NotifyContentIndexChangedOptions): Promise<void>;
|
|
24
|
+
//# sourceMappingURL=invalidate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invalidate.d.ts","sourceRoot":"","sources":["../../src/index/invalidate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE3D,OAAO,EAAsB,KAAK,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAMlF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAGtD,MAAM,WAAW,gCAAgC;IAC/C,IAAI,CAAC,EAAE,qBAAqB,CAAC;IAC7B,OAAO,CAAC,EAAE;QACR,aAAa,EAAE,MAAM,CAAC;QACtB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;QACzC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;KAClD,CAAC;IACF,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,cAAc,CAAC,EAAE,KAAK,CAAC;QAAE,WAAW,EAAE,kBAAkB,CAAC;QAAC,KAAK,EAAE,UAAU,CAAA;KAAE,CAAC,CAAC;IAC/E,YAAY,CAAC,EAAE,cAAc,EAAE,CAAC;CACjC;AAoCD,kGAAkG;AAClG,wBAAsB,yBAAyB,CAC7C,KAAK,EAAE,WAAW,EAClB,IAAI,GAAE,gCAAqC,GAC1C,OAAO,CAAC,IAAI,CAAC,CA+Bf"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { indexCacheKeyFromSpace } from './cache-keys.js';
|
|
2
|
+
import { getIndexCacheStore } from './cache-store.js';
|
|
3
|
+
import { patchIndexFromAssets, patchIndexFromCreatedEntries, patchIndexFromSavedEntries, } from './patch-index.js';
|
|
4
|
+
import { isCatalogContentType } from './schema.js';
|
|
5
|
+
function pickSlug(entry, locale) {
|
|
6
|
+
const slugField = entry.fields['slug'];
|
|
7
|
+
if (!slugField)
|
|
8
|
+
return null;
|
|
9
|
+
const raw = slugField[locale] ?? slugField['en-US'];
|
|
10
|
+
return raw != null ? String(raw) : null;
|
|
11
|
+
}
|
|
12
|
+
function resolveInvalidationMode(opts) {
|
|
13
|
+
if (opts.mode)
|
|
14
|
+
return opts.mode;
|
|
15
|
+
const deleted = opts.deletedEntryIds ?? [];
|
|
16
|
+
const session = opts.session;
|
|
17
|
+
if (session) {
|
|
18
|
+
for (const id of deleted) {
|
|
19
|
+
const entry = session.entries[id];
|
|
20
|
+
if (entry && isCatalogContentType(entry.sys.contentType.sys.id)) {
|
|
21
|
+
return 'full';
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
for (const id of opts.savedEntryIds ?? []) {
|
|
25
|
+
const entry = session.entries[id];
|
|
26
|
+
const original = session.originalEntries[id];
|
|
27
|
+
if (!entry || !original)
|
|
28
|
+
continue;
|
|
29
|
+
if (!isCatalogContentType(entry.sys.contentType.sys.id))
|
|
30
|
+
continue;
|
|
31
|
+
if (pickSlug(entry, session.defaultLocale) !== pickSlug(original, session.defaultLocale)) {
|
|
32
|
+
return 'full';
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return 'incremental';
|
|
37
|
+
}
|
|
38
|
+
/** Marks the shared index dirty and patches the local SQLite copy when present. Does not sync. */
|
|
39
|
+
export async function notifyContentIndexChanged(space, opts = {}) {
|
|
40
|
+
const mode = resolveInvalidationMode(opts);
|
|
41
|
+
const cache = getIndexCacheStore();
|
|
42
|
+
const key = indexCacheKeyFromSpace(space);
|
|
43
|
+
await cache.setInvalidation(key, {
|
|
44
|
+
invalidatedAt: new Date().toISOString(),
|
|
45
|
+
mode,
|
|
46
|
+
});
|
|
47
|
+
if (mode === 'full') {
|
|
48
|
+
await cache.deleteBlob(key);
|
|
49
|
+
}
|
|
50
|
+
if (opts.session) {
|
|
51
|
+
patchIndexFromSavedEntries(space, opts.session.defaultLocale, opts.savedEntryIds ?? [], opts.deletedEntryIds ?? [], opts.session.entries);
|
|
52
|
+
}
|
|
53
|
+
if (opts.createdEntries?.length) {
|
|
54
|
+
patchIndexFromCreatedEntries(space, space.defaultLocale, opts.createdEntries);
|
|
55
|
+
}
|
|
56
|
+
if (opts.upsertAssets?.length) {
|
|
57
|
+
patchIndexFromAssets(space, opts.upsertAssets);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=invalidate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invalidate.js","sourceRoot":"","sources":["../../src/index/invalidate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { EntryProps } from 'contentful-management';
|
|
2
|
+
import type { SpaceConfig } from '../config/types.js';
|
|
3
|
+
import type { CdaAssetRecord } from '../contentful/cda-sync.js';
|
|
4
|
+
import type { SerializedEntry } from '../session/state.js';
|
|
5
|
+
import type { CatalogContentType } from './schema.js';
|
|
6
|
+
export declare function patchIndexFromSavedEntries(space: SpaceConfig, locale: string, savedEntryIds: string[], deletedEntryIds: string[], entries: Record<string, SerializedEntry>): void;
|
|
7
|
+
export declare function patchIndexFromCreatedEntries(space: SpaceConfig, locale: string, created: Array<{
|
|
8
|
+
contentType: CatalogContentType;
|
|
9
|
+
entry: EntryProps;
|
|
10
|
+
}>): void;
|
|
11
|
+
export declare function patchIndexFromAssets(space: SpaceConfig, assets: CdaAssetRecord[]): void;
|
|
12
|
+
//# sourceMappingURL=patch-index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"patch-index.d.ts","sourceRoot":"","sources":["../../src/index/patch-index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAEhE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AActD,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,MAAM,EAAE,EACvB,eAAe,EAAE,MAAM,EAAE,EACzB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GACvC,IAAI,CAoBN;AAED,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,KAAK,CAAC;IAAE,WAAW,EAAE,kBAAkB,CAAC;IAAC,KAAK,EAAE,UAAU,CAAA;CAAE,CAAC,GACrE,IAAI,CAIN;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,cAAc,EAAE,GAAG,IAAI,CAIvF"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { referenceRowFromCmaEntry } from '../contentful/reference-record.js';
|
|
2
|
+
import { isCatalogContentType } from './schema.js';
|
|
3
|
+
import { deleteReferenceRow, upsertAssetRow, upsertReferenceRow } from './sync.js';
|
|
4
|
+
function entryLikeFromSerialized(entry) {
|
|
5
|
+
return {
|
|
6
|
+
sys: { id: entry.sys.id, updatedAt: entry.sys.updatedAt },
|
|
7
|
+
fields: entry.fields,
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
export function patchIndexFromSavedEntries(space, locale, savedEntryIds, deletedEntryIds, entries) {
|
|
11
|
+
for (const id of deletedEntryIds) {
|
|
12
|
+
const entry = entries[id];
|
|
13
|
+
if (!entry)
|
|
14
|
+
continue;
|
|
15
|
+
const contentType = entry.sys.contentType.sys.id;
|
|
16
|
+
if (isCatalogContentType(contentType)) {
|
|
17
|
+
deleteReferenceRow(space, id);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
for (const id of savedEntryIds) {
|
|
21
|
+
const entry = entries[id];
|
|
22
|
+
if (!entry)
|
|
23
|
+
continue;
|
|
24
|
+
const contentType = entry.sys.contentType.sys.id;
|
|
25
|
+
if (!isCatalogContentType(contentType))
|
|
26
|
+
continue;
|
|
27
|
+
upsertReferenceRow(space, referenceRowFromCmaEntry(contentType, entryLikeFromSerialized(entry), locale));
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
export function patchIndexFromCreatedEntries(space, locale, created) {
|
|
31
|
+
for (const { contentType, entry } of created) {
|
|
32
|
+
upsertReferenceRow(space, referenceRowFromCmaEntry(contentType, entry, locale));
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
export function patchIndexFromAssets(space, assets) {
|
|
36
|
+
for (const asset of assets) {
|
|
37
|
+
upsertAssetRow(space, asset);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=patch-index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"patch-index.js","sourceRoot":"","sources":["../../src/index/patch-index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,wBAAwB,EAAE,MAAM,mCAAmC,CAAC;AAG7E,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAEnF,SAAS,uBAAuB,CAAC,KAAsB;IAIrD,OAAO;QACL,GAAG,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE;QACzD,MAAM,EAAE,KAAK,CAAC,MAAM;KACrB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,0BAA0B,CACxC,KAAkB,EAClB,MAAc,EACd,aAAuB,EACvB,eAAyB,EACzB,OAAwC;IAExC,KAAK,MAAM,EAAE,IAAI,eAAe,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC;QAC1B,IAAI,CAAC,KAAK;YAAE,SAAS;QACrB,MAAM,WAAW,GAAG,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;QACjD,IAAI,oBAAoB,CAAC,WAAW,CAAC,EAAE,CAAC;YACtC,kBAAkB,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAED,KAAK,MAAM,EAAE,IAAI,aAAa,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC;QAC1B,IAAI,CAAC,KAAK;YAAE,SAAS;QACrB,MAAM,WAAW,GAAG,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;QACjD,IAAI,CAAC,oBAAoB,CAAC,WAAW,CAAC;YAAE,SAAS;QACjD,kBAAkB,CAChB,KAAK,EACL,wBAAwB,CAAC,WAAW,EAAE,uBAAuB,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,CAC9E,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,4BAA4B,CAC1C,KAAkB,EAClB,MAAc,EACd,OAAsE;IAEtE,KAAK,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,OAAO,EAAE,CAAC;QAC7C,kBAAkB,CAAC,KAAK,EAAE,wBAAwB,CAAC,WAAW,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;IAClF,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAAkB,EAAE,MAAwB;IAC/E,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC/B,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { SpaceConfig } from '../config/types.js';
|
|
2
|
+
import type { SyncIndexResult } from './sync.js';
|
|
3
|
+
/** Uploads the local SQLite index to the shared cache after a successful sync. */
|
|
4
|
+
export declare function publishIndexCache(space: SpaceConfig, preview: boolean | undefined, result: SyncIndexResult): Promise<void>;
|
|
5
|
+
//# sourceMappingURL=publish-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publish-cache.d.ts","sourceRoot":"","sources":["../../src/index/publish-cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAOtD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAEjD,kFAAkF;AAClF,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,WAAW,EAClB,OAAO,EAAE,OAAO,GAAG,SAAS,EAC5B,MAAM,EAAE,eAAe,GACtB,OAAO,CAAC,IAAI,CAAC,CAuBf"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { gzipBuffer, readFileBytes } from './blob.js';
|
|
2
|
+
import { indexCacheKeyFromSpace } from './cache-keys.js';
|
|
3
|
+
import { getIndexCacheStore } from './cache-store.js';
|
|
4
|
+
import { resolveIndexPreview } from './mode.js';
|
|
5
|
+
import { getIndexDbPath } from './paths.js';
|
|
6
|
+
import { SCHEMA_VERSION } from './schema.js';
|
|
7
|
+
/** Uploads the local SQLite index to the shared cache after a successful sync. */
|
|
8
|
+
export async function publishIndexCache(space, preview, result) {
|
|
9
|
+
const usePreview = resolveIndexPreview(preview);
|
|
10
|
+
const cache = getIndexCacheStore();
|
|
11
|
+
const key = indexCacheKeyFromSpace(space, usePreview);
|
|
12
|
+
const dbPath = getIndexDbPath(space, usePreview);
|
|
13
|
+
const raw = readFileBytes(dbPath);
|
|
14
|
+
const gz = gzipBuffer(raw);
|
|
15
|
+
await cache.putBlob(key, {
|
|
16
|
+
syncedAt: result.syncedAt,
|
|
17
|
+
schemaVersion: SCHEMA_VERSION,
|
|
18
|
+
assetCount: result.assetCount,
|
|
19
|
+
referenceCount: result.referenceCount,
|
|
20
|
+
}, gz);
|
|
21
|
+
const inv = await cache.getInvalidation(key);
|
|
22
|
+
if (inv && Date.parse(inv.invalidatedAt) <= Date.parse(result.syncedAt)) {
|
|
23
|
+
await cache.clearInvalidation(key);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=publish-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publish-cache.js","sourceRoot":"","sources":["../../src/index/publish-cache.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAG7C,kFAAkF;AAClF,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,KAAkB,EAClB,OAA4B,EAC5B,MAAuB;IAEvB,MAAM,UAAU,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAChD,MAAM,KAAK,GAAG,kBAAkB,EAAE,CAAC;IACnC,MAAM,GAAG,GAAG,sBAAsB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IACtD,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IACjD,MAAM,GAAG,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IAClC,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IAE3B,MAAM,KAAK,CAAC,OAAO,CACjB,GAAG,EACH;QACE,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,aAAa,EAAE,cAAc;QAC7B,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,cAAc,EAAE,MAAM,CAAC,cAAc;KACtC,EACD,EAAE,CACH,CAAC;IAEF,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;IAC7C,IAAI,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;QACxE,MAAM,KAAK,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACrC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { RedisClient } from '../session/session-store.js';
|
|
2
|
+
import type { IndexCacheKey } from './cache-keys.js';
|
|
3
|
+
import { type IndexBlobMeta, type IndexCacheStore, type IndexInvalidation } from './cache-store.js';
|
|
4
|
+
export declare class RedisIndexCacheStore implements IndexCacheStore {
|
|
5
|
+
private readonly redis;
|
|
6
|
+
private readonly blobTtlSeconds;
|
|
7
|
+
constructor(redis: RedisClient, blobTtlSeconds?: number);
|
|
8
|
+
private invalidationKey;
|
|
9
|
+
private blobMetaKey;
|
|
10
|
+
private blobDataKey;
|
|
11
|
+
private syncLockKey;
|
|
12
|
+
getInvalidation(key: IndexCacheKey): Promise<IndexInvalidation | null>;
|
|
13
|
+
setInvalidation(key: IndexCacheKey, inv: IndexInvalidation): Promise<void>;
|
|
14
|
+
clearInvalidation(key: IndexCacheKey): Promise<void>;
|
|
15
|
+
getBlob(key: IndexCacheKey): Promise<{
|
|
16
|
+
meta: IndexBlobMeta;
|
|
17
|
+
data: Uint8Array;
|
|
18
|
+
} | null>;
|
|
19
|
+
putBlob(key: IndexCacheKey, meta: IndexBlobMeta, data: Uint8Array): Promise<void>;
|
|
20
|
+
deleteBlob(key: IndexCacheKey): Promise<void>;
|
|
21
|
+
tryAcquireSyncLock(key: IndexCacheKey, holderId: string, ttlSeconds: number): Promise<boolean>;
|
|
22
|
+
releaseSyncLock(key: IndexCacheKey, holderId: string): Promise<void>;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=redis-index-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redis-index-cache.d.ts","sourceRoot":"","sources":["../../src/index/redis-index-cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAErD,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACvB,MAAM,kBAAkB,CAAC;AAmB1B,qBAAa,oBAAqB,YAAW,eAAe;IAExD,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,cAAc;gBADd,KAAK,EAAE,WAAW,EAClB,cAAc,SAAyB;IAG1D,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,WAAW;IAIb,eAAe,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAItE,eAAe,CAAC,GAAG,EAAE,aAAa,EAAE,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAI1E,iBAAiB,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAIpD,OAAO,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,aAAa,CAAC;QAAC,IAAI,EAAE,UAAU,CAAA;KAAE,GAAG,IAAI,CAAC;IAStF,OAAO,CAAC,GAAG,EAAE,aAAa,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAQjF,UAAU,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAK7C,kBAAkB,CACtB,GAAG,EAAE,aAAa,EAClB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,OAAO,CAAC;IAQb,eAAe,CAAC,GAAG,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAM3E"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { indexCacheKeySuffix } from './cache-keys.js';
|
|
2
|
+
import { INDEX_BLOB_TTL_SECONDS, } from './cache-store.js';
|
|
3
|
+
function prefix(key) {
|
|
4
|
+
return `cms-edit:index:${indexCacheKeySuffix(key)}`;
|
|
5
|
+
}
|
|
6
|
+
function parseJson(raw) {
|
|
7
|
+
if (!raw)
|
|
8
|
+
return null;
|
|
9
|
+
if (typeof raw === 'string') {
|
|
10
|
+
try {
|
|
11
|
+
return JSON.parse(raw);
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
if (typeof raw === 'object')
|
|
18
|
+
return raw;
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
export class RedisIndexCacheStore {
|
|
22
|
+
redis;
|
|
23
|
+
blobTtlSeconds;
|
|
24
|
+
constructor(redis, blobTtlSeconds = INDEX_BLOB_TTL_SECONDS) {
|
|
25
|
+
this.redis = redis;
|
|
26
|
+
this.blobTtlSeconds = blobTtlSeconds;
|
|
27
|
+
}
|
|
28
|
+
invalidationKey(key) {
|
|
29
|
+
return `${prefix(key)}:invalidation`;
|
|
30
|
+
}
|
|
31
|
+
blobMetaKey(key) {
|
|
32
|
+
return `${prefix(key)}:meta`;
|
|
33
|
+
}
|
|
34
|
+
blobDataKey(key) {
|
|
35
|
+
return `${prefix(key)}:blob`;
|
|
36
|
+
}
|
|
37
|
+
syncLockKey(key) {
|
|
38
|
+
return `${prefix(key)}:lock`;
|
|
39
|
+
}
|
|
40
|
+
async getInvalidation(key) {
|
|
41
|
+
return parseJson(await this.redis.get(this.invalidationKey(key)));
|
|
42
|
+
}
|
|
43
|
+
async setInvalidation(key, inv) {
|
|
44
|
+
await this.redis.set(this.invalidationKey(key), JSON.stringify(inv));
|
|
45
|
+
}
|
|
46
|
+
async clearInvalidation(key) {
|
|
47
|
+
await this.redis.del(this.invalidationKey(key));
|
|
48
|
+
}
|
|
49
|
+
async getBlob(key) {
|
|
50
|
+
const meta = parseJson(await this.redis.get(this.blobMetaKey(key)));
|
|
51
|
+
const raw = await this.redis.get(this.blobDataKey(key));
|
|
52
|
+
if (!meta || raw == null)
|
|
53
|
+
return null;
|
|
54
|
+
const encoded = typeof raw === 'string' ? raw : String(raw);
|
|
55
|
+
const data = Buffer.from(encoded, 'base64');
|
|
56
|
+
return { meta, data };
|
|
57
|
+
}
|
|
58
|
+
async putBlob(key, meta, data) {
|
|
59
|
+
const encoded = Buffer.from(data).toString('base64');
|
|
60
|
+
await this.redis.set(this.blobMetaKey(key), JSON.stringify(meta), {
|
|
61
|
+
ex: this.blobTtlSeconds,
|
|
62
|
+
});
|
|
63
|
+
await this.redis.set(this.blobDataKey(key), encoded, { ex: this.blobTtlSeconds });
|
|
64
|
+
}
|
|
65
|
+
async deleteBlob(key) {
|
|
66
|
+
await this.redis.del(this.blobMetaKey(key));
|
|
67
|
+
await this.redis.del(this.blobDataKey(key));
|
|
68
|
+
}
|
|
69
|
+
async tryAcquireSyncLock(key, holderId, ttlSeconds) {
|
|
70
|
+
const result = await this.redis.set(this.syncLockKey(key), holderId, {
|
|
71
|
+
ex: ttlSeconds,
|
|
72
|
+
nx: true,
|
|
73
|
+
});
|
|
74
|
+
return result === true;
|
|
75
|
+
}
|
|
76
|
+
async releaseSyncLock(key, holderId) {
|
|
77
|
+
const current = await this.redis.get(this.syncLockKey(key));
|
|
78
|
+
if (current === holderId) {
|
|
79
|
+
await this.redis.del(this.syncLockKey(key));
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=redis-index-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redis-index-cache.js","sourceRoot":"","sources":["../../src/index/redis-index-cache.ts"],"names":[],"mappings":"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"}
|
package/dist/index/require.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { SpaceConfig } from '../config/types.js';
|
|
2
2
|
import { type IndexSyncMode } from './run-sync.js';
|
|
3
|
-
import { INDEX_STALE_MS } from './sync.js';
|
|
3
|
+
import { getIndexSyncReason, INDEX_STALE_MS } from './sync.js';
|
|
4
4
|
export interface EnsureContentIndexOptions {
|
|
5
5
|
preview?: boolean;
|
|
6
6
|
/** Called when an automatic sync starts (missing, stale, or schema mismatch). */
|
|
@@ -13,9 +13,10 @@ export interface EnsureContentIndexResult {
|
|
|
13
13
|
syncMode?: IndexSyncMode;
|
|
14
14
|
}
|
|
15
15
|
/**
|
|
16
|
-
* Ensures the local content index exists and is current (schema
|
|
17
|
-
* Auto-sync: full rebuild when missing
|
|
16
|
+
* Ensures the local content index exists and is current (schema v4, synced within 24h,
|
|
17
|
+
* and not invalidated by a committed write). Auto-sync: full rebuild when missing, schema
|
|
18
|
+
* outdated, or fully invalidated; incremental when only stale or incrementally invalidated.
|
|
18
19
|
*/
|
|
19
20
|
export declare function ensureContentIndex(space: SpaceConfig, opts?: EnsureContentIndexOptions): Promise<EnsureContentIndexResult>;
|
|
20
|
-
export { INDEX_STALE_MS };
|
|
21
|
+
export { getIndexSyncReason, INDEX_STALE_MS };
|
|
21
22
|
//# sourceMappingURL=require.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"require.d.ts","sourceRoot":"","sources":["../../src/index/require.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"require.d.ts","sourceRoot":"","sources":["../../src/index/require.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAKtD,OAAO,EAAE,KAAK,aAAa,EAAuB,MAAM,eAAe,CAAC;AACxE,OAAO,EACL,kBAAkB,EAClB,cAAc,EAKf,MAAM,WAAW,CAAC;AAInB,MAAM,WAAW,yBAAyB;IACxC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,iFAAiF;IACjF,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACvC;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,aAAa,CAAC;CAC1B;AAmBD;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,WAAW,EAClB,IAAI,GAAE,yBAA8B,GACnC,OAAO,CAAC,wBAAwB,CAAC,CA+CnC;AAED,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,CAAC"}
|
package/dist/index/require.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { ContentIndexSyncError } from './errors.js';
|
|
2
|
+
import { tryHydrateIndexFromCache } from './hydrate.js';
|
|
2
3
|
import { resolveIndexPreview } from './mode.js';
|
|
3
4
|
import { getIndexSyncedAt } from './query.js';
|
|
4
5
|
import { runContentIndexSync } from './run-sync.js';
|
|
5
|
-
import { getIndexSyncReason, INDEX_STALE_MS, isSyncedAtStale, } from './sync.js';
|
|
6
|
+
import { getIndexSyncReason, INDEX_STALE_MS, indexSyncModeForReason, isSyncedAtStale, resolveIndexSyncReason, } from './sync.js';
|
|
6
7
|
import { IndexSyncLockError } from './sync-lock.js';
|
|
7
8
|
import { isIndexSyncVerbose } from './sync-log.js';
|
|
8
9
|
function rebuildMessage(reason) {
|
|
@@ -13,17 +14,23 @@ function rebuildMessage(reason) {
|
|
|
13
14
|
return 'Rebuilding content index (schema outdated)…';
|
|
14
15
|
case 'stale':
|
|
15
16
|
return 'Refreshing content index (stale >24h, incremental)…';
|
|
17
|
+
case 'invalidated-incremental':
|
|
18
|
+
return 'Refreshing content index (recent edits, incremental)…';
|
|
19
|
+
case 'invalidated-full':
|
|
20
|
+
return 'Rebuilding content index (catalog change, full)…';
|
|
16
21
|
default:
|
|
17
22
|
return 'Syncing content index…';
|
|
18
23
|
}
|
|
19
24
|
}
|
|
20
25
|
/**
|
|
21
|
-
* Ensures the local content index exists and is current (schema
|
|
22
|
-
* Auto-sync: full rebuild when missing
|
|
26
|
+
* Ensures the local content index exists and is current (schema v4, synced within 24h,
|
|
27
|
+
* and not invalidated by a committed write). Auto-sync: full rebuild when missing, schema
|
|
28
|
+
* outdated, or fully invalidated; incremental when only stale or incrementally invalidated.
|
|
23
29
|
*/
|
|
24
30
|
export async function ensureContentIndex(space, opts = {}) {
|
|
25
31
|
const preview = resolveIndexPreview(opts.preview);
|
|
26
|
-
|
|
32
|
+
await tryHydrateIndexFromCache(space, preview);
|
|
33
|
+
const reason = await resolveIndexSyncReason(space, preview);
|
|
27
34
|
if (reason === 'current') {
|
|
28
35
|
const syncedAt = getIndexSyncedAt(space, preview);
|
|
29
36
|
return {
|
|
@@ -32,7 +39,11 @@ export async function ensureContentIndex(space, opts = {}) {
|
|
|
32
39
|
rebuilt: false,
|
|
33
40
|
};
|
|
34
41
|
}
|
|
35
|
-
const mode = reason
|
|
42
|
+
const mode = indexSyncModeForReason(reason);
|
|
43
|
+
if (!mode) {
|
|
44
|
+
const syncedAt = getIndexSyncedAt(space, preview);
|
|
45
|
+
return { syncedAt, stale: false, rebuilt: false };
|
|
46
|
+
}
|
|
36
47
|
opts.onRebuild?.(rebuildMessage(reason));
|
|
37
48
|
try {
|
|
38
49
|
const result = await runContentIndexSync(space, {
|
|
@@ -56,5 +67,5 @@ export async function ensureContentIndex(space, opts = {}) {
|
|
|
56
67
|
throw new ContentIndexSyncError(`Content index sync failed (${detail}). Run: cms-edit index sync`, { cause: err });
|
|
57
68
|
}
|
|
58
69
|
}
|
|
59
|
-
export { INDEX_STALE_MS };
|
|
70
|
+
export { getIndexSyncReason, INDEX_STALE_MS };
|
|
60
71
|
//# sourceMappingURL=require.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"require.js","sourceRoot":"","sources":["../../src/index/require.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAsB,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACxE,OAAO,EACL,kBAAkB,EAClB,cAAc,EAEd,eAAe,
|
|
1
|
+
{"version":3,"file":"require.js","sourceRoot":"","sources":["../../src/index/require.ts"],"names":[],"mappings":"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"}
|
package/dist/index/run-sync.d.ts
CHANGED
|
@@ -12,6 +12,8 @@ export interface RunContentIndexSyncOptions {
|
|
|
12
12
|
mode?: IndexSyncMode;
|
|
13
13
|
/** Progress on stderr; also enabled with `LOG_CMS_INDEX=1`. */
|
|
14
14
|
verbose?: boolean;
|
|
15
|
+
/** When false, skip publishing the SQLite blob to the shared cache (internal). */
|
|
16
|
+
publishCache?: boolean;
|
|
15
17
|
}
|
|
16
18
|
/**
|
|
17
19
|
* Fetches CDA/CPA payload and rebuilds or merges into the local SQLite index.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-sync.d.ts","sourceRoot":"","sources":["../../src/index/run-sync.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"run-sync.d.ts","sourceRoot":"","sources":["../../src/index/run-sync.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAYtD,OAAO,EAML,KAAK,eAAe,EACrB,MAAM,WAAW,CAAC;AAGnB,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,aAAa,CAAC;AAEnD,MAAM,WAAW,0BAA0B;IACzC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,uEAAuE;IACvE,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B;;;OAGG;IACH,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,+DAA+D;IAC/D,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,kFAAkF;IAClF,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAkBD;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,WAAW,EAClB,IAAI,GAAE,0BAA+B,GACpC,OAAO,CAAC,eAAe,CAAC,CAsE1B"}
|