@openlimiter/core 0.2.0 → 1.2.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/dist/cache.d.ts +64 -0
- package/dist/cache.d.ts.map +1 -1
- package/dist/cache.js +230 -32
- package/dist/cache.js.map +1 -1
- package/dist/collection.d.ts +151 -0
- package/dist/collection.d.ts.map +1 -0
- package/dist/collection.js +218 -0
- package/dist/collection.js.map +1 -0
- package/dist/connection-state.d.ts +229 -0
- package/dist/connection-state.d.ts.map +1 -0
- package/dist/connection-state.js +393 -0
- package/dist/connection-state.js.map +1 -0
- package/dist/failures.d.ts +2 -1
- package/dist/failures.d.ts.map +1 -1
- package/dist/failures.js +7 -3
- package/dist/failures.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/merge.d.ts +1 -0
- package/dist/merge.d.ts.map +1 -1
- package/dist/merge.js +29 -5
- package/dist/merge.js.map +1 -1
- package/dist/normalizer.d.ts.map +1 -1
- package/dist/normalizer.js +50 -4
- package/dist/normalizer.js.map +1 -1
- package/dist/schedule.d.ts +75 -0
- package/dist/schedule.d.ts.map +1 -0
- package/dist/schedule.js +131 -0
- package/dist/schedule.js.map +1 -0
- package/dist/types.d.ts +93 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +61 -0
- package/dist/types.js.map +1 -1
- package/package.json +3 -2
package/dist/cache.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type CacheState, type CacheSuppression, type CollectionReport } from "./collection.js";
|
|
1
2
|
import type { Snapshot } from "./types.js";
|
|
2
3
|
export declare const CACHE_FILE_NAME = "openlimiter-cache.json";
|
|
3
4
|
export declare const CACHE_LOCK_NAME = "openlimiter.lock";
|
|
@@ -30,8 +31,14 @@ export type JsonFileResult = {
|
|
|
30
31
|
export declare function readJsonFileSafely(file: string, maximumBytes?: number): Promise<JsonFileResult>;
|
|
31
32
|
export type CacheReadResult = {
|
|
32
33
|
ok: true;
|
|
34
|
+
/** The rows a surface may use: suppressed identities are already gone. */
|
|
33
35
|
snapshots: Snapshot[];
|
|
36
|
+
/** Rows that failed validation and were dropped. */
|
|
34
37
|
dropped: number;
|
|
38
|
+
/** Rows dropped because a drift suppression covers them. */
|
|
39
|
+
suppressed: number;
|
|
40
|
+
/** The standing suppressions, for a writer that has to preserve them. */
|
|
41
|
+
suppressions: CacheSuppression[];
|
|
35
42
|
} | {
|
|
36
43
|
ok: false;
|
|
37
44
|
reason: "missing" | "corrupt" | "unsafe";
|
|
@@ -42,8 +49,34 @@ export type CacheReadResult = {
|
|
|
42
49
|
* A row that fails validation is dropped and counted. The surviving rows are
|
|
43
50
|
* still returned, because one bad row is not a reason to forget every other
|
|
44
51
|
* provider. No value is ever repaired or invented.
|
|
52
|
+
*
|
|
53
|
+
* The rows that come back have already had drift suppressions applied, so
|
|
54
|
+
* there is no way for a caller to obtain the raw list and forget to filter it.
|
|
55
|
+
* That matters more than it looks: `buildAdvice` and every surface downstream
|
|
56
|
+
* of it read through here, which is what makes a drifted provider go unknown
|
|
57
|
+
* on the statusline, in the agent context and on the dashboard at the same
|
|
58
|
+
* instant rather than only on a connection card.
|
|
59
|
+
*
|
|
60
|
+
* A suppression list that cannot be believed empties the whole document. See
|
|
61
|
+
* `readSuppressions`: the failure direction has to be unknown, because the
|
|
62
|
+
* alternative is showing a number the cache itself was trying to withdraw.
|
|
45
63
|
*/
|
|
46
64
|
export declare function readSnapshotCache(directory?: string): Promise<CacheReadResult>;
|
|
65
|
+
/**
|
|
66
|
+
* The cache document as stored, suppressions included and unfiltered.
|
|
67
|
+
*
|
|
68
|
+
* `readSnapshotCache` above is what a surface uses, and it hides suppressed
|
|
69
|
+
* rows. A writer needs the other thing: the rows exactly as they are on disk,
|
|
70
|
+
* so a fold can remove them properly instead of merging around a filtered view
|
|
71
|
+
* and quietly resurrecting what it could not see.
|
|
72
|
+
*/
|
|
73
|
+
export declare function readCacheState(directory?: string): Promise<{
|
|
74
|
+
ok: true;
|
|
75
|
+
state: CacheState;
|
|
76
|
+
} | {
|
|
77
|
+
ok: false;
|
|
78
|
+
reason: "missing" | "corrupt" | "unsafe";
|
|
79
|
+
}>;
|
|
47
80
|
/**
|
|
48
81
|
* Write a file so that a reader sees either the previous content or the new
|
|
49
82
|
* content, never a partial write.
|
|
@@ -52,6 +85,22 @@ export declare function readSnapshotCache(directory?: string): Promise<CacheRead
|
|
|
52
85
|
* after the rename cannot leave an empty file behind.
|
|
53
86
|
*/
|
|
54
87
|
export declare function writeFileAtomically(target: string, contents: string): Promise<void>;
|
|
88
|
+
/**
|
|
89
|
+
* Document version of the snapshot cache.
|
|
90
|
+
*
|
|
91
|
+
* It stayed at 1 through `accountId` and `provenance`, because both were
|
|
92
|
+
* optional fields an old reader could ignore without being wrong.
|
|
93
|
+
*
|
|
94
|
+
* Version 2 is the first change that fails that test. A `suppressions` array is
|
|
95
|
+
* an instruction to DISTRUST rows that are still present in the document, so a
|
|
96
|
+
* reader that ignores it does not miss a nicety, it shows a number the writer
|
|
97
|
+
* was withdrawing. That is a misread rather than an omission, which is exactly
|
|
98
|
+
* what the version number is for.
|
|
99
|
+
*
|
|
100
|
+
* A version 1 document is still read, and read correctly: it has no
|
|
101
|
+
* suppressions, which is true of it.
|
|
102
|
+
*/
|
|
103
|
+
export declare const CACHE_DOCUMENT_VERSION = 2;
|
|
55
104
|
/**
|
|
56
105
|
* Replace the snapshot cache.
|
|
57
106
|
*
|
|
@@ -73,4 +122,19 @@ export interface CacheMergeResult {
|
|
|
73
122
|
* renders on every keystroke from churning the disk.
|
|
74
123
|
*/
|
|
75
124
|
export declare function mergeSnapshotCache(incoming: readonly Snapshot[], directory?: string): Promise<CacheMergeResult>;
|
|
125
|
+
/**
|
|
126
|
+
* Fold one collection report into the cache under the lock.
|
|
127
|
+
*
|
|
128
|
+
* The verb the desktop and the command line tool should both reach for, because
|
|
129
|
+
* it is the only one that can record a drift. `mergeSnapshotCache` above says
|
|
130
|
+
* "here are some rows"; this says "here is what a run of one provider actually
|
|
131
|
+
* achieved", and only the second can express that a provider stopped making
|
|
132
|
+
* sense. Reading, folding and writing all happen inside one lock, so a drift
|
|
133
|
+
* and a concurrent refresh cannot interleave into a document where a
|
|
134
|
+
* suppression exists and the row it suppresses has already been replaced.
|
|
135
|
+
*/
|
|
136
|
+
export declare function applyCollectionReportToCache(report: CollectionReport, directory?: string): Promise<{
|
|
137
|
+
state: CacheState;
|
|
138
|
+
written: boolean;
|
|
139
|
+
}>;
|
|
76
140
|
//# sourceMappingURL=cache.d.ts.map
|
package/dist/cache.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"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"}
|
package/dist/cache.js
CHANGED
|
@@ -3,6 +3,7 @@ import { constants } from "node:fs";
|
|
|
3
3
|
import { chmod, lstat, mkdir, open, readFile, rename, unlink } from "node:fs/promises";
|
|
4
4
|
import { homedir } from "node:os";
|
|
5
5
|
import path from "node:path";
|
|
6
|
+
import { applyCollectionReport, readSuppressions, visibleSnapshots } from "./collection.js";
|
|
6
7
|
import { MAX_CACHE_ENTRIES, mergeSnapshots } from "./merge.js";
|
|
7
8
|
import { canonicalJson, normalizeMeter, normalizeMeters } from "./normalizer.js";
|
|
8
9
|
export const CACHE_FILE_NAME = "openlimiter-cache.json";
|
|
@@ -11,7 +12,7 @@ export const CACHE_LOCK_NAME = "openlimiter.lock";
|
|
|
11
12
|
export const MAX_JSON_FILE_BYTES = 1_048_576;
|
|
12
13
|
/** A lock older than this is treated as abandoned and reclaimed. */
|
|
13
14
|
export const LOCK_STALE_MILLISECONDS = 5_000;
|
|
14
|
-
|
|
15
|
+
/** The longest pause between lock acquisition attempts. It is not a deadline. */
|
|
15
16
|
const LOCK_BACKOFF_CEILING_MILLISECONDS = 25;
|
|
16
17
|
export function resolveStateDirectory(options = {}) {
|
|
17
18
|
const platform = options.platform ?? process.platform;
|
|
@@ -111,6 +112,17 @@ export async function readJsonFileSafely(file, maximumBytes = MAX_JSON_FILE_BYTE
|
|
|
111
112
|
* A row that fails validation is dropped and counted. The surviving rows are
|
|
112
113
|
* still returned, because one bad row is not a reason to forget every other
|
|
113
114
|
* provider. No value is ever repaired or invented.
|
|
115
|
+
*
|
|
116
|
+
* The rows that come back have already had drift suppressions applied, so
|
|
117
|
+
* there is no way for a caller to obtain the raw list and forget to filter it.
|
|
118
|
+
* That matters more than it looks: `buildAdvice` and every surface downstream
|
|
119
|
+
* of it read through here, which is what makes a drifted provider go unknown
|
|
120
|
+
* on the statusline, in the agent context and on the dashboard at the same
|
|
121
|
+
* instant rather than only on a connection card.
|
|
122
|
+
*
|
|
123
|
+
* A suppression list that cannot be believed empties the whole document. See
|
|
124
|
+
* `readSuppressions`: the failure direction has to be unknown, because the
|
|
125
|
+
* alternative is showing a number the cache itself was trying to withdraw.
|
|
114
126
|
*/
|
|
115
127
|
export async function readSnapshotCache(directory = resolveStateDirectory()) {
|
|
116
128
|
try {
|
|
@@ -129,8 +141,68 @@ export async function readSnapshotCache(directory = resolveStateDirectory()) {
|
|
|
129
141
|
return { ok: false, reason: "corrupt" };
|
|
130
142
|
if (rawSnapshots.length > MAX_CACHE_ENTRIES)
|
|
131
143
|
return { ok: false, reason: "corrupt" };
|
|
132
|
-
const
|
|
133
|
-
|
|
144
|
+
const version = document.value["version"];
|
|
145
|
+
/* Absent is version 1, which predates the field. A version this build does
|
|
146
|
+
not know is refused rather than read with today's meanings. */
|
|
147
|
+
if (version !== undefined && version !== 1 && version !== CACHE_DOCUMENT_VERSION) {
|
|
148
|
+
return { ok: false, reason: "corrupt" };
|
|
149
|
+
}
|
|
150
|
+
const validated = normalizeMeters(rawSnapshots);
|
|
151
|
+
const dropped = rawSnapshots.length - validated.length;
|
|
152
|
+
const read = readSuppressions(document.value["suppressions"]);
|
|
153
|
+
if (!read.ok) {
|
|
154
|
+
/* Unreadable suppressions make every identity in the document unknown.
|
|
155
|
+
Nothing is repaired, and nothing is shown on the strength of a list we
|
|
156
|
+
could not parse. */
|
|
157
|
+
return { ok: true, snapshots: [], dropped, suppressed: validated.length, suppressions: [] };
|
|
158
|
+
}
|
|
159
|
+
const snapshots = visibleSnapshots({
|
|
160
|
+
snapshots: validated,
|
|
161
|
+
suppressions: read.suppressions
|
|
162
|
+
});
|
|
163
|
+
return {
|
|
164
|
+
ok: true,
|
|
165
|
+
snapshots,
|
|
166
|
+
dropped,
|
|
167
|
+
suppressed: validated.length - snapshots.length,
|
|
168
|
+
suppressions: read.suppressions
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* The cache document as stored, suppressions included and unfiltered.
|
|
173
|
+
*
|
|
174
|
+
* `readSnapshotCache` above is what a surface uses, and it hides suppressed
|
|
175
|
+
* rows. A writer needs the other thing: the rows exactly as they are on disk,
|
|
176
|
+
* so a fold can remove them properly instead of merging around a filtered view
|
|
177
|
+
* and quietly resurrecting what it could not see.
|
|
178
|
+
*/
|
|
179
|
+
export async function readCacheState(directory = resolveStateDirectory()) {
|
|
180
|
+
try {
|
|
181
|
+
await rejectSymlink(directory);
|
|
182
|
+
}
|
|
183
|
+
catch {
|
|
184
|
+
return { ok: false, reason: "unsafe" };
|
|
185
|
+
}
|
|
186
|
+
const document = await readJsonFileSafely(path.join(directory, CACHE_FILE_NAME));
|
|
187
|
+
if (!document.ok)
|
|
188
|
+
return document;
|
|
189
|
+
if (!isRecord(document.value))
|
|
190
|
+
return { ok: false, reason: "corrupt" };
|
|
191
|
+
const rawSnapshots = document.value["snapshots"];
|
|
192
|
+
if (!Array.isArray(rawSnapshots))
|
|
193
|
+
return { ok: false, reason: "corrupt" };
|
|
194
|
+
if (rawSnapshots.length > MAX_CACHE_ENTRIES)
|
|
195
|
+
return { ok: false, reason: "corrupt" };
|
|
196
|
+
const read = readSuppressions(document.value["suppressions"]);
|
|
197
|
+
if (!read.ok)
|
|
198
|
+
return { ok: false, reason: "corrupt" };
|
|
199
|
+
return {
|
|
200
|
+
ok: true,
|
|
201
|
+
state: {
|
|
202
|
+
snapshots: normalizeMeters(rawSnapshots),
|
|
203
|
+
suppressions: read.suppressions
|
|
204
|
+
}
|
|
205
|
+
};
|
|
134
206
|
}
|
|
135
207
|
function delay(milliseconds) {
|
|
136
208
|
return new Promise((resolve) => {
|
|
@@ -205,8 +277,10 @@ export async function writeFileAtomically(target, contents) {
|
|
|
205
277
|
async function reclaimStaleLock(lockPath) {
|
|
206
278
|
const now = Date.now();
|
|
207
279
|
let heldSince = null;
|
|
280
|
+
let observedContents = null;
|
|
208
281
|
try {
|
|
209
|
-
|
|
282
|
+
observedContents = await readFile(lockPath, "utf8");
|
|
283
|
+
const parsed = JSON.parse(observedContents);
|
|
210
284
|
const stamp = isRecord(parsed) ? parsed["at"] : undefined;
|
|
211
285
|
if (typeof stamp === "number" && Number.isFinite(stamp) && stamp <= now) {
|
|
212
286
|
heldSince = stamp;
|
|
@@ -215,38 +289,87 @@ async function reclaimStaleLock(lockPath) {
|
|
|
215
289
|
catch {
|
|
216
290
|
heldSince = null;
|
|
217
291
|
}
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
292
|
+
let observedDevice;
|
|
293
|
+
let observedInode;
|
|
294
|
+
let modificationTime;
|
|
295
|
+
try {
|
|
296
|
+
const observed = await lstat(lockPath);
|
|
297
|
+
observedDevice = observed.dev;
|
|
298
|
+
observedInode = observed.ino;
|
|
299
|
+
modificationTime = observed.mtimeMs;
|
|
300
|
+
}
|
|
301
|
+
catch (error) {
|
|
302
|
+
if (errorCode(error) === "ENOENT")
|
|
223
303
|
return true;
|
|
224
|
-
|
|
304
|
+
throw error;
|
|
305
|
+
}
|
|
306
|
+
if (heldSince === null) {
|
|
307
|
+
heldSince = modificationTime;
|
|
225
308
|
if (!Number.isFinite(heldSince) || heldSince > now)
|
|
226
309
|
heldSince = now;
|
|
227
310
|
}
|
|
228
311
|
if (now - heldSince < LOCK_STALE_MILLISECONDS)
|
|
229
312
|
return false;
|
|
230
|
-
|
|
231
|
-
|
|
313
|
+
try {
|
|
314
|
+
if (observedContents !== null &&
|
|
315
|
+
(await readFile(lockPath, "utf8")) !== observedContents)
|
|
316
|
+
return false;
|
|
317
|
+
const observed = await lstat(lockPath);
|
|
318
|
+
if (observed.dev !== observedDevice || observed.ino !== observedInode)
|
|
319
|
+
return false;
|
|
320
|
+
await unlink(lockPath);
|
|
321
|
+
return true;
|
|
322
|
+
}
|
|
323
|
+
catch (error) {
|
|
324
|
+
if (errorCode(error) === "ENOENT")
|
|
325
|
+
return true;
|
|
326
|
+
throw error;
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
const transientLockCodes = new Set(["EEXIST", "EPERM", "EACCES", "EBUSY"]);
|
|
330
|
+
async function lockPathExists(lockPath) {
|
|
331
|
+
try {
|
|
332
|
+
await lstat(lockPath);
|
|
333
|
+
return true;
|
|
334
|
+
}
|
|
335
|
+
catch (error) {
|
|
336
|
+
if (errorCode(error) === "ENOENT")
|
|
337
|
+
return false;
|
|
338
|
+
throw error;
|
|
339
|
+
}
|
|
232
340
|
}
|
|
233
341
|
async function acquireLock(lockPath) {
|
|
234
|
-
|
|
235
|
-
|
|
342
|
+
/* Contention has no deadline. A live owner releases the lock and an
|
|
343
|
+
abandoned owner becomes stale, so neither case should discard this write. */
|
|
344
|
+
for (let attempt = 0;; attempt += 1) {
|
|
236
345
|
try {
|
|
237
346
|
const handle = await open(lockPath, "wx", 0o600);
|
|
238
|
-
|
|
239
|
-
|
|
347
|
+
const token = JSON.stringify({
|
|
348
|
+
at: Date.now(),
|
|
349
|
+
id: randomUUID(),
|
|
350
|
+
pid: process.pid
|
|
351
|
+
});
|
|
352
|
+
try {
|
|
353
|
+
await handle.writeFile(token, "utf8");
|
|
354
|
+
return { handle, token };
|
|
355
|
+
}
|
|
356
|
+
catch (error) {
|
|
357
|
+
await handle.close().catch(() => undefined);
|
|
358
|
+
await unlink(lockPath).catch(() => undefined);
|
|
359
|
+
throw error;
|
|
360
|
+
}
|
|
240
361
|
}
|
|
241
362
|
catch (error) {
|
|
242
|
-
|
|
363
|
+
const code = errorCode(error);
|
|
364
|
+
if (code === undefined ||
|
|
365
|
+
!transientLockCodes.has(code) ||
|
|
366
|
+
!(await lockPathExists(lockPath)))
|
|
243
367
|
throw error;
|
|
244
368
|
if (!(await reclaimStaleLock(lockPath))) {
|
|
245
369
|
await delay(backoffMilliseconds(attempt));
|
|
246
370
|
}
|
|
247
371
|
}
|
|
248
372
|
}
|
|
249
|
-
throw new Error("Cache lock is busy");
|
|
250
373
|
}
|
|
251
374
|
async function releaseLock(lockPath, token) {
|
|
252
375
|
try {
|
|
@@ -264,6 +387,10 @@ function rejectOutOfBounds(snapshots) {
|
|
|
264
387
|
if (snapshots.some((snapshot) => normalizeMeter(snapshot) === null))
|
|
265
388
|
throw new Error("Snapshot bounds rejected");
|
|
266
389
|
}
|
|
390
|
+
/* Writers in this process take FIFO turns before competing for the filesystem
|
|
391
|
+
lock. Other processes still use the same lock, while one busy provider can
|
|
392
|
+
no longer make an earlier local waiter lose a bounded polling race. */
|
|
393
|
+
const processLockQueues = new Map();
|
|
267
394
|
/**
|
|
268
395
|
* Run one cache mutation while holding the single cache lock.
|
|
269
396
|
*
|
|
@@ -271,22 +398,63 @@ function rejectOutOfBounds(snapshots) {
|
|
|
271
398
|
* the lock exists only to keep two writers from interleaving.
|
|
272
399
|
*/
|
|
273
400
|
async function withCacheLock(directory, action) {
|
|
274
|
-
|
|
275
|
-
const
|
|
276
|
-
|
|
277
|
-
|
|
401
|
+
const absoluteDirectory = path.resolve(directory);
|
|
402
|
+
const queueKey = process.platform === "win32"
|
|
403
|
+
? absoluteDirectory.toLowerCase()
|
|
404
|
+
: absoluteDirectory;
|
|
405
|
+
const previousTurn = processLockQueues.get(queueKey);
|
|
406
|
+
let finishTurn = () => undefined;
|
|
407
|
+
const currentTurn = new Promise((resolve) => {
|
|
408
|
+
finishTurn = resolve;
|
|
409
|
+
});
|
|
410
|
+
processLockQueues.set(queueKey, currentTurn);
|
|
411
|
+
if (previousTurn !== undefined)
|
|
412
|
+
await previousTurn;
|
|
278
413
|
try {
|
|
279
|
-
|
|
414
|
+
await prepareStateDirectory(absoluteDirectory);
|
|
415
|
+
const lockPath = path.join(absoluteDirectory, CACHE_LOCK_NAME);
|
|
416
|
+
await rejectSymlink(lockPath);
|
|
417
|
+
const { handle, token } = await acquireLock(lockPath);
|
|
418
|
+
try {
|
|
419
|
+
return await action();
|
|
420
|
+
}
|
|
421
|
+
finally {
|
|
422
|
+
await handle.close().catch(() => undefined);
|
|
423
|
+
await releaseLock(lockPath, token);
|
|
424
|
+
}
|
|
280
425
|
}
|
|
281
426
|
finally {
|
|
282
|
-
|
|
283
|
-
|
|
427
|
+
finishTurn();
|
|
428
|
+
if (processLockQueues.get(queueKey) === currentTurn) {
|
|
429
|
+
processLockQueues.delete(queueKey);
|
|
430
|
+
}
|
|
284
431
|
}
|
|
285
432
|
}
|
|
286
|
-
|
|
433
|
+
/**
|
|
434
|
+
* Document version of the snapshot cache.
|
|
435
|
+
*
|
|
436
|
+
* It stayed at 1 through `accountId` and `provenance`, because both were
|
|
437
|
+
* optional fields an old reader could ignore without being wrong.
|
|
438
|
+
*
|
|
439
|
+
* Version 2 is the first change that fails that test. A `suppressions` array is
|
|
440
|
+
* an instruction to DISTRUST rows that are still present in the document, so a
|
|
441
|
+
* reader that ignores it does not miss a nicety, it shows a number the writer
|
|
442
|
+
* was withdrawing. That is a misread rather than an omission, which is exactly
|
|
443
|
+
* what the version number is for.
|
|
444
|
+
*
|
|
445
|
+
* A version 1 document is still read, and read correctly: it has no
|
|
446
|
+
* suppressions, which is true of it.
|
|
447
|
+
*/
|
|
448
|
+
export const CACHE_DOCUMENT_VERSION = 2;
|
|
449
|
+
async function replaceCache(directory, snapshots, suppressions = []) {
|
|
287
450
|
const file = path.join(directory, CACHE_FILE_NAME);
|
|
288
451
|
await rejectSymlink(file);
|
|
289
|
-
|
|
452
|
+
/* The suppressions key is written only when there is something to say, so a
|
|
453
|
+
machine that has never drifted keeps writing the document it always did. */
|
|
454
|
+
const document = suppressions.length === 0
|
|
455
|
+
? { snapshots, version: CACHE_DOCUMENT_VERSION }
|
|
456
|
+
: { snapshots, suppressions, version: CACHE_DOCUMENT_VERSION };
|
|
457
|
+
await writeFileAtomically(file, canonicalJson(document));
|
|
290
458
|
}
|
|
291
459
|
/**
|
|
292
460
|
* Replace the snapshot cache.
|
|
@@ -312,15 +480,45 @@ export async function writeSnapshotCache(snapshots, directory = resolveStateDire
|
|
|
312
480
|
export async function mergeSnapshotCache(incoming, directory = resolveStateDirectory()) {
|
|
313
481
|
rejectOutOfBounds(incoming);
|
|
314
482
|
return await withCacheLock(directory, async () => {
|
|
315
|
-
const cached = await
|
|
316
|
-
const
|
|
317
|
-
|
|
318
|
-
|
|
483
|
+
const cached = await readCacheState(directory);
|
|
484
|
+
const state = cached.ok
|
|
485
|
+
? cached.state
|
|
486
|
+
: { snapshots: [], suppressions: [] };
|
|
487
|
+
const merged = mergeSnapshots(state.snapshots, incoming);
|
|
488
|
+
if (canonicalJson(merged) === canonicalJson(state.snapshots)) {
|
|
319
489
|
return { merged, written: false };
|
|
320
490
|
}
|
|
321
491
|
rejectOutOfBounds(merged);
|
|
322
|
-
await replaceCache(directory, merged);
|
|
492
|
+
await replaceCache(directory, merged, state.suppressions);
|
|
323
493
|
return { merged, written: true };
|
|
324
494
|
});
|
|
325
495
|
}
|
|
496
|
+
/**
|
|
497
|
+
* Fold one collection report into the cache under the lock.
|
|
498
|
+
*
|
|
499
|
+
* The verb the desktop and the command line tool should both reach for, because
|
|
500
|
+
* it is the only one that can record a drift. `mergeSnapshotCache` above says
|
|
501
|
+
* "here are some rows"; this says "here is what a run of one provider actually
|
|
502
|
+
* achieved", and only the second can express that a provider stopped making
|
|
503
|
+
* sense. Reading, folding and writing all happen inside one lock, so a drift
|
|
504
|
+
* and a concurrent refresh cannot interleave into a document where a
|
|
505
|
+
* suppression exists and the row it suppresses has already been replaced.
|
|
506
|
+
*/
|
|
507
|
+
export async function applyCollectionReportToCache(report, directory = resolveStateDirectory()) {
|
|
508
|
+
if (report.ok)
|
|
509
|
+
rejectOutOfBounds(report.snapshots);
|
|
510
|
+
return await withCacheLock(directory, async () => {
|
|
511
|
+
const cached = await readCacheState(directory);
|
|
512
|
+
const before = cached.ok
|
|
513
|
+
? cached.state
|
|
514
|
+
: { snapshots: [], suppressions: [] };
|
|
515
|
+
const after = applyCollectionReport(before, report);
|
|
516
|
+
if (canonicalJson(after) === canonicalJson(before)) {
|
|
517
|
+
return { state: after, written: false };
|
|
518
|
+
}
|
|
519
|
+
rejectOutOfBounds(after.snapshots);
|
|
520
|
+
await replaceCache(directory, after.snapshots, after.suppressions);
|
|
521
|
+
return { state: after, written: true };
|
|
522
|
+
});
|
|
523
|
+
}
|
|
326
524
|
//# sourceMappingURL=cache.js.map
|
package/dist/cache.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"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"}
|