@newrelic/preflight 1.70.0 → 1.72.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/README.md +2 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +7 -0
- package/dist/config.js.map +1 -1
- package/dist/dashboard/routes/api-handler.d.ts.map +1 -1
- package/dist/dashboard/routes/api-handler.js +11 -16
- package/dist/dashboard/routes/api-handler.js.map +1 -1
- package/dist/dashboard/subagent-timeline-store.d.ts +12 -1
- package/dist/dashboard/subagent-timeline-store.d.ts.map +1 -1
- package/dist/dashboard/subagent-timeline-store.js +32 -4
- package/dist/dashboard/subagent-timeline-store.js.map +1 -1
- package/dist/dashboard/workflow-store.d.ts.map +1 -1
- package/dist/dashboard/workflow-store.js +2 -3
- package/dist/dashboard/workflow-store.js.map +1 -1
- package/dist/hooks/collector-script.d.ts.map +1 -1
- package/dist/hooks/collector-script.js +14 -8
- package/dist/hooks/collector-script.js.map +1 -1
- package/dist/hooks/copilot-app-usage-watcher.d.ts.map +1 -1
- package/dist/hooks/copilot-app-usage-watcher.js +3 -4
- package/dist/hooks/copilot-app-usage-watcher.js.map +1 -1
- package/dist/hooks/copilot-usage-watcher.d.ts +25 -5
- package/dist/hooks/copilot-usage-watcher.d.ts.map +1 -1
- package/dist/hooks/copilot-usage-watcher.js +254 -92
- package/dist/hooks/copilot-usage-watcher.js.map +1 -1
- package/dist/hooks/event-processor.d.ts +24 -11
- package/dist/hooks/event-processor.d.ts.map +1 -1
- package/dist/hooks/event-processor.js +139 -45
- package/dist/hooks/event-processor.js.map +1 -1
- package/dist/hooks/index.d.ts +1 -1
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +1 -1
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/parent-transcript-watcher.d.ts +1 -1
- package/dist/hooks/parent-transcript-watcher.d.ts.map +1 -1
- package/dist/hooks/parent-transcript-watcher.js +11 -6
- package/dist/hooks/parent-transcript-watcher.js.map +1 -1
- package/dist/hooks/session-resolver.d.ts.map +1 -1
- package/dist/hooks/session-resolver.js +2 -1
- package/dist/hooks/session-resolver.js.map +1 -1
- package/dist/hooks/subagent-watcher.d.ts +21 -15
- package/dist/hooks/subagent-watcher.d.ts.map +1 -1
- package/dist/hooks/subagent-watcher.js +89 -73
- package/dist/hooks/subagent-watcher.js.map +1 -1
- package/dist/hooks/throttled-warning.d.ts +5 -5
- package/dist/hooks/throttled-warning.d.ts.map +1 -1
- package/dist/hooks/throttled-warning.js +14 -12
- package/dist/hooks/throttled-warning.js.map +1 -1
- package/dist/hooks/workflow-watcher.d.ts.map +1 -1
- package/dist/hooks/workflow-watcher.js +2 -2
- package/dist/hooks/workflow-watcher.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +57 -62
- package/dist/index.js.map +1 -1
- package/dist/install/cli.d.ts.map +1 -1
- package/dist/install/cli.js +131 -17
- package/dist/install/cli.js.map +1 -1
- package/dist/install/copilot-install-helper.d.ts +1 -0
- package/dist/install/copilot-install-helper.d.ts.map +1 -1
- package/dist/install/copilot-install-helper.js +82 -26
- package/dist/install/copilot-install-helper.js.map +1 -1
- package/dist/install/credentials.d.ts +23 -0
- package/dist/install/credentials.d.ts.map +1 -0
- package/dist/install/credentials.js +57 -0
- package/dist/install/credentials.js.map +1 -0
- package/dist/install/diagnostics.d.ts.map +1 -1
- package/dist/install/diagnostics.js +6 -3
- package/dist/install/diagnostics.js.map +1 -1
- package/dist/install/install-helper.d.ts +9 -0
- package/dist/install/install-helper.d.ts.map +1 -1
- package/dist/install/install-helper.js +42 -17
- package/dist/install/install-helper.js.map +1 -1
- package/dist/install/schedule.d.ts.map +1 -1
- package/dist/install/schedule.js +4 -1
- package/dist/install/schedule.js.map +1 -1
- package/dist/install/setup-wizard.d.ts.map +1 -1
- package/dist/install/setup-wizard.js +3 -3
- package/dist/install/setup-wizard.js.map +1 -1
- package/dist/install/target-user.d.ts +33 -0
- package/dist/install/target-user.d.ts.map +1 -0
- package/dist/install/target-user.js +121 -0
- package/dist/install/target-user.js.map +1 -0
- package/dist/lib/claude-config-dir.d.ts +3 -0
- package/dist/lib/claude-config-dir.d.ts.map +1 -0
- package/dist/lib/claude-config-dir.js +10 -0
- package/dist/lib/claude-config-dir.js.map +1 -0
- package/dist/lib/claude-settings-env.d.ts +18 -0
- package/dist/lib/claude-settings-env.d.ts.map +1 -0
- package/dist/lib/claude-settings-env.js +78 -0
- package/dist/lib/claude-settings-env.js.map +1 -0
- package/dist/lib/date.d.ts +7 -0
- package/dist/lib/date.d.ts.map +1 -1
- package/dist/lib/date.js +11 -1
- package/dist/lib/date.js.map +1 -1
- package/dist/lib/subagent-transcript-parser.d.ts +2 -0
- package/dist/lib/subagent-transcript-parser.d.ts.map +1 -1
- package/dist/lib/subagent-transcript-parser.js +5 -0
- package/dist/lib/subagent-transcript-parser.js.map +1 -1
- package/dist/lib/transcript-types.d.ts +4 -0
- package/dist/lib/transcript-types.d.ts.map +1 -1
- package/dist/metrics/cost-forecast.d.ts +2 -0
- package/dist/metrics/cost-forecast.d.ts.map +1 -1
- package/dist/metrics/cost-forecast.js +46 -24
- package/dist/metrics/cost-forecast.js.map +1 -1
- package/dist/metrics/cost-tracker.d.ts +3 -3
- package/dist/metrics/cost-tracker.js +3 -3
- package/dist/metrics/efficiency-score.d.ts +2 -2
- package/dist/metrics/efficiency-score.js +2 -2
- package/dist/metrics/first-save-baselines.d.ts +60 -0
- package/dist/metrics/first-save-baselines.d.ts.map +1 -0
- package/dist/metrics/first-save-baselines.js +77 -0
- package/dist/metrics/first-save-baselines.js.map +1 -0
- package/dist/metrics/local-session-aggregator.d.ts +6 -5
- package/dist/metrics/local-session-aggregator.d.ts.map +1 -1
- package/dist/metrics/local-session-aggregator.js +34 -6
- package/dist/metrics/local-session-aggregator.js.map +1 -1
- package/dist/metrics/model-pricing.d.ts +1 -1
- package/dist/metrics/model-pricing.d.ts.map +1 -1
- package/dist/metrics/model-pricing.js +2 -2
- package/dist/metrics/model-pricing.js.map +1 -1
- package/dist/metrics/model-usage-tracker.d.ts +2 -2
- package/dist/metrics/model-usage-tracker.js +2 -2
- package/dist/metrics/pricing-init.d.ts.map +1 -1
- package/dist/metrics/pricing-init.js +5 -3
- package/dist/metrics/pricing-init.js.map +1 -1
- package/dist/metrics/pricing-overlay.d.ts.map +1 -1
- package/dist/metrics/pricing-overlay.js +1 -4
- package/dist/metrics/pricing-overlay.js.map +1 -1
- package/dist/metrics/pricing-refresh.d.ts +16 -4
- package/dist/metrics/pricing-refresh.d.ts.map +1 -1
- package/dist/metrics/pricing-refresh.js +47 -1
- package/dist/metrics/pricing-refresh.js.map +1 -1
- package/dist/metrics/quality-proxy-tracker.d.ts +2 -2
- package/dist/metrics/quality-proxy-tracker.js +2 -2
- package/dist/metrics/session-tracker.d.ts +5 -1
- package/dist/metrics/session-tracker.d.ts.map +1 -1
- package/dist/metrics/session-tracker.js +58 -17
- package/dist/metrics/session-tracker.js.map +1 -1
- package/dist/metrics/task-detector.d.ts +2 -2
- package/dist/metrics/task-detector.js +2 -2
- package/dist/metrics/token-usage.d.ts +6 -0
- package/dist/metrics/token-usage.d.ts.map +1 -0
- package/dist/metrics/token-usage.js +34 -0
- package/dist/metrics/token-usage.js.map +1 -0
- package/dist/metrics/turn-cost-attributor.d.ts.map +1 -1
- package/dist/metrics/turn-cost-attributor.js +3 -0
- package/dist/metrics/turn-cost-attributor.js.map +1 -1
- package/dist/platforms/copilot-adapter.d.ts.map +1 -1
- package/dist/platforms/copilot-adapter.js +3 -0
- package/dist/platforms/copilot-adapter.js.map +1 -1
- package/dist/platforms/copilot-sdk-adapter.d.ts.map +1 -1
- package/dist/platforms/copilot-sdk-adapter.js +3 -0
- package/dist/platforms/copilot-sdk-adapter.js.map +1 -1
- package/dist/storage/drain-claims.d.ts +82 -0
- package/dist/storage/drain-claims.d.ts.map +1 -0
- package/dist/storage/drain-claims.js +239 -0
- package/dist/storage/drain-claims.js.map +1 -0
- package/dist/storage/hook-buffer.d.ts +7 -0
- package/dist/storage/hook-buffer.d.ts.map +1 -0
- package/dist/storage/hook-buffer.js +132 -0
- package/dist/storage/hook-buffer.js.map +1 -0
- package/dist/storage/local-store.d.ts +38 -16
- package/dist/storage/local-store.d.ts.map +1 -1
- package/dist/storage/local-store.js +228 -72
- package/dist/storage/local-store.js.map +1 -1
- package/dist/storage/retention.d.ts.map +1 -1
- package/dist/storage/retention.js +7 -6
- package/dist/storage/retention.js.map +1 -1
- package/dist/storage/session-store.d.ts +37 -8
- package/dist/storage/session-store.d.ts.map +1 -1
- package/dist/storage/session-store.js +255 -48
- package/dist/storage/session-store.js.map +1 -1
- package/dist/storage/types.d.ts +7 -0
- package/dist/storage/types.d.ts.map +1 -1
- package/dist/storage/types.js +4 -0
- package/dist/storage/types.js.map +1 -1
- package/dist/tools/cost-tools.d.ts.map +1 -1
- package/dist/tools/cost-tools.js +1 -0
- package/dist/tools/cost-tools.js.map +1 -1
- package/dist/web/assets/{index-U9DPZ-Tb.js → index-CZvLy2Qy.js} +2 -2
- package/dist/web/index.html +1 -1
- package/package.json +4 -1
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { closeSync, constants, fstatSync, openSync, readFileSync, readSync, statSync, unlinkSync, writeSync, } from 'node:fs';
|
|
2
|
+
export const DRAIN_SEAL = '\0preflight-drain-seal\n';
|
|
3
|
+
const TORN_SEAL_RE = /\0[a-z-]*/g;
|
|
4
|
+
const MAX_WRITES = 5;
|
|
5
|
+
const MAX_OPENS = 100;
|
|
6
|
+
// A short write leaves a fragment. Ending it with a control character as well as a newline keeps a
|
|
7
|
+
// fragment that is itself complete JSON from parsing as an event, since the line is written again whole.
|
|
8
|
+
const TORN_LINE_END = '\x1e\n';
|
|
9
|
+
const READ_ONLY_CODES = new Set(['EACCES', 'EPERM', 'EROFS']);
|
|
10
|
+
export function textBeforeSeal(raw) {
|
|
11
|
+
const seal = raw.indexOf(DRAIN_SEAL);
|
|
12
|
+
return (seal === -1 ? raw : raw.slice(0, seal)).replace(TORN_SEAL_RE, '');
|
|
13
|
+
}
|
|
14
|
+
function readRange(fd, start, end) {
|
|
15
|
+
const buf = Buffer.alloc(Math.max(0, end - start));
|
|
16
|
+
let read = 0;
|
|
17
|
+
while (read < buf.length) {
|
|
18
|
+
const n = readSync(fd, buf, read, buf.length - read, start + read);
|
|
19
|
+
if (n === 0)
|
|
20
|
+
break;
|
|
21
|
+
read += n;
|
|
22
|
+
}
|
|
23
|
+
return buf.subarray(0, read);
|
|
24
|
+
}
|
|
25
|
+
function readToEnd(fd, scratch) {
|
|
26
|
+
let total = 0;
|
|
27
|
+
for (let n; (n = readSync(fd, scratch, 0, scratch.length, null)) > 0;)
|
|
28
|
+
total += n;
|
|
29
|
+
return total;
|
|
30
|
+
}
|
|
31
|
+
// After an O_APPEND write the fd's offset is the end of that write. Reading
|
|
32
|
+
// on from it counts the bytes appended since, and a size that no further
|
|
33
|
+
// read moves past pins the offset.
|
|
34
|
+
function offsetAfterWrite(fd) {
|
|
35
|
+
const scratch = Buffer.alloc(64 * 1024);
|
|
36
|
+
let after = readToEnd(fd, scratch);
|
|
37
|
+
for (;;) {
|
|
38
|
+
const size = fstatSync(fd).size;
|
|
39
|
+
const more = readToEnd(fd, scratch);
|
|
40
|
+
if (more === 0)
|
|
41
|
+
return size - after;
|
|
42
|
+
after += more;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
function isAt(path, file) {
|
|
46
|
+
const now = statSync(path, { bigint: true, throwIfNoEntry: false });
|
|
47
|
+
return now !== undefined && now.ino === file.ino && now.dev === file.dev;
|
|
48
|
+
}
|
|
49
|
+
function appendOnce(path, data) {
|
|
50
|
+
const fd = openSync(path, constants.O_RDWR | constants.O_CREAT | constants.O_APPEND, 0o600);
|
|
51
|
+
try {
|
|
52
|
+
const opened = fstatSync(fd, { bigint: true });
|
|
53
|
+
if (!isAt(path, opened))
|
|
54
|
+
return 'moved';
|
|
55
|
+
const sealFloor = Number(opened.size);
|
|
56
|
+
const written = writeSync(fd, data);
|
|
57
|
+
if (written < data.length) {
|
|
58
|
+
writeSync(fd, TORN_LINE_END);
|
|
59
|
+
return 'redo';
|
|
60
|
+
}
|
|
61
|
+
if (isAt(path, opened))
|
|
62
|
+
return 'kept';
|
|
63
|
+
const start = offsetAfterWrite(fd) - data.length;
|
|
64
|
+
return readRange(fd, sealFloor, start).includes(DRAIN_SEAL) ? 'redo' : 'kept';
|
|
65
|
+
}
|
|
66
|
+
finally {
|
|
67
|
+
closeSync(fd);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
export function appendToHookBuffer(path, text) {
|
|
71
|
+
if (text.includes('\0')) {
|
|
72
|
+
throw new Error(`Hook buffer text contains NUL, which marks a drain seal: ${path}`);
|
|
73
|
+
}
|
|
74
|
+
if (!text.endsWith('\n') || text.indexOf('\n') !== text.length - 1) {
|
|
75
|
+
throw new Error(`Hook buffer text must be exactly one newline-terminated line: ${path}`);
|
|
76
|
+
}
|
|
77
|
+
const data = Buffer.from(text);
|
|
78
|
+
let writes = 0;
|
|
79
|
+
for (let opens = 0; opens < MAX_OPENS; opens++) {
|
|
80
|
+
const landing = appendOnce(path, data);
|
|
81
|
+
if (landing === 'kept')
|
|
82
|
+
return;
|
|
83
|
+
if (landing === 'redo' && ++writes === MAX_WRITES)
|
|
84
|
+
break;
|
|
85
|
+
}
|
|
86
|
+
throw new Error(`Hook buffer write raced a drain on all attempts and was not kept: ${path}`);
|
|
87
|
+
}
|
|
88
|
+
function writeSeal(fd, path) {
|
|
89
|
+
if (writeSync(fd, DRAIN_SEAL) < Buffer.byteLength(DRAIN_SEAL)) {
|
|
90
|
+
throw new Error(`Short write while sealing ${path}`);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
export function sealHookBuffer(path) {
|
|
94
|
+
const fd = openSync(path, constants.O_WRONLY | constants.O_APPEND);
|
|
95
|
+
try {
|
|
96
|
+
writeSeal(fd, path);
|
|
97
|
+
}
|
|
98
|
+
finally {
|
|
99
|
+
closeSync(fd);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
export function readSealed(path) {
|
|
103
|
+
let fd;
|
|
104
|
+
try {
|
|
105
|
+
fd = openSync(path, constants.O_RDWR | constants.O_APPEND);
|
|
106
|
+
}
|
|
107
|
+
catch (err) {
|
|
108
|
+
if (!READ_ONLY_CODES.has(err.code))
|
|
109
|
+
throw err;
|
|
110
|
+
// A writer running as the same user cannot open this file to append either, so no seal
|
|
111
|
+
// is needed. A writer with other credentials, or one whose fd opened before the
|
|
112
|
+
// permission change, can still append and lose that line.
|
|
113
|
+
return textBeforeSeal(readFileSync(path, 'utf-8'));
|
|
114
|
+
}
|
|
115
|
+
try {
|
|
116
|
+
const head = readRange(fd, 0, fstatSync(fd).size);
|
|
117
|
+
if (head.includes(DRAIN_SEAL))
|
|
118
|
+
return textBeforeSeal(head.toString('utf-8'));
|
|
119
|
+
writeSeal(fd, path);
|
|
120
|
+
const tail = readRange(fd, head.length, fstatSync(fd).size);
|
|
121
|
+
return textBeforeSeal(Buffer.concat([head, tail]).toString('utf-8'));
|
|
122
|
+
}
|
|
123
|
+
finally {
|
|
124
|
+
closeSync(fd);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
export function takeClaimText(path) {
|
|
128
|
+
const text = readSealed(path);
|
|
129
|
+
unlinkSync(path);
|
|
130
|
+
return text;
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=hook-buffer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook-buffer.js","sourceRoot":"","sources":["../../src/storage/hook-buffer.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,6 +11,10 @@ export declare class LocalStore {
|
|
|
11
11
|
private readonly storagePath;
|
|
12
12
|
private readonly bufferPath;
|
|
13
13
|
private readonly sessionId;
|
|
14
|
+
private readonly countedDir;
|
|
15
|
+
private readonly ownCountedIds;
|
|
16
|
+
private readonly holds;
|
|
17
|
+
private giveUpOrder;
|
|
14
18
|
/**
|
|
15
19
|
* @param storagePath The base storage directory (e.g. ~/.newrelic-preflight).
|
|
16
20
|
* @param bufferPathOrSessionId Either an explicit absolute buffer path
|
|
@@ -25,17 +29,26 @@ export declare class LocalStore {
|
|
|
25
29
|
*/
|
|
26
30
|
constructor(storagePath: string, bufferPathOrSessionId?: string, sessionId?: string);
|
|
27
31
|
initialize(): void;
|
|
28
|
-
/**
|
|
29
|
-
* Append a hook event as a JSON line to the buffer file.
|
|
30
|
-
* Uses appendFileSync for minimal latency (<5ms budget).
|
|
31
|
-
*/
|
|
32
32
|
appendToBuffer(event: HookEvent): void;
|
|
33
33
|
/**
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
34
|
+
* Drain this store's buffer, plus this process's own leftover claims of any
|
|
35
|
+
* buffer. The buffer is renamed into a claim of this process's own before it
|
|
36
|
+
* is read, so concurrent drainers never return an event twice, and a claim
|
|
37
|
+
* left by a drainer that died mid-drain is adopted by another.
|
|
38
|
+
*
|
|
39
|
+
* Reading a claim appends a seal to it first. A hook that opened the buffer
|
|
40
|
+
* before the rename and whose line lands after the seal writes the line
|
|
41
|
+
* again to the live buffer, so it is drained on a later pass.
|
|
37
42
|
*/
|
|
38
43
|
drainBuffer(): HookEvent[];
|
|
44
|
+
/**
|
|
45
|
+
* For a processor that is shutting down: every later drain takes each claim
|
|
46
|
+
* it can rather than holding the claims after one it cannot take. The
|
|
47
|
+
* processor flushes its pending pre events as timeouts right after its last
|
|
48
|
+
* drain, so a post left behind would pair with nothing and count its call
|
|
49
|
+
* twice.
|
|
50
|
+
*/
|
|
51
|
+
giveUpHeldOrder(): void;
|
|
39
52
|
/**
|
|
40
53
|
* Drain every per-session buffer file under the storage path. Used by
|
|
41
54
|
* `--local` standalone mode where the dashboard owner sees all live
|
|
@@ -44,15 +57,18 @@ export declare class LocalStore {
|
|
|
44
57
|
* MCP isn't running) are picked up too.
|
|
45
58
|
*
|
|
46
59
|
* A per-session buffer whose `active-<sessionId>.pid` heartbeat names a
|
|
47
|
-
* live PID is
|
|
48
|
-
* polling and draining that exact file via its own scoped drainBuffer() on
|
|
49
|
-
* the same cadence. Draining it here too would race that rename-then-read
|
|
50
|
-
* against the owner's — whichever process wins a given poll cycle silently
|
|
51
|
-
* keeps the batch, and the loser sees nothing, with no error on either
|
|
52
|
-
* side. The owner's copy always wins fairly since this call skips the file
|
|
53
|
-
* outright rather than racing it.
|
|
60
|
+
* live PID is left to that session's own `--stdio` process.
|
|
54
61
|
*/
|
|
55
62
|
drainAllBuffers(): HookEvent[];
|
|
63
|
+
/**
|
|
64
|
+
* Records toolUseIds this process counted without a post, in
|
|
65
|
+
* `counted/<sessionId>.<pid>.json`. Each process writes only its own file,
|
|
66
|
+
* so concurrent writers never lose each other's ids; readers take the union.
|
|
67
|
+
*/
|
|
68
|
+
rememberCountedToolUseIds(sessionId: string, ids: readonly string[], cap: number): boolean;
|
|
69
|
+
hasCountedToolUseId(sessionId: string, toolUseId: string): boolean;
|
|
70
|
+
gcCountedToolUseIds(now?: number): void;
|
|
71
|
+
private countedFileNames;
|
|
56
72
|
/**
|
|
57
73
|
* True when `buffer-<sessionId>.jsonl`'s matching `active-<sessionId>.pid`
|
|
58
74
|
* heartbeat names a currently-alive PID. `bufferFileName` must already be
|
|
@@ -77,7 +93,9 @@ export declare class LocalStore {
|
|
|
77
93
|
*
|
|
78
94
|
* The legacy shared `buffer.jsonl` is included so an upgrading user with
|
|
79
95
|
* unmigrated events still appears in aggregate views before the next
|
|
80
|
-
* `migrateLegacyBuffer()` runs.
|
|
96
|
+
* `migrateLegacyBuffer()` runs. Lines held in drain claims are included
|
|
97
|
+
* too: they are still waiting for a drainer to return them, so a claim
|
|
98
|
+
* that no drainer can unlink keeps showing up here.
|
|
81
99
|
*/
|
|
82
100
|
peekAllBuffers(): HookEvent[];
|
|
83
101
|
/**
|
|
@@ -285,12 +303,16 @@ export declare class LocalStore {
|
|
|
285
303
|
* accept this trade because re-migrating from `.migrating-<pid>` would
|
|
286
304
|
* re-append already-migrated partitions and produce duplicate events,
|
|
287
305
|
* which is worse than a once-only loss bounded by the size of the legacy
|
|
288
|
-
* file at upgrade time.
|
|
306
|
+
* file at upgrade time. The file is sealed, so recover it by hand with
|
|
307
|
+
* the text before the seal (`\0preflight-drain-seal`), not by appending
|
|
308
|
+
* it whole to a live buffer, where the seal would hide every later line.
|
|
289
309
|
*
|
|
290
310
|
* Returns the number of events migrated.
|
|
291
311
|
*/
|
|
292
312
|
migrateLegacyBuffer(): number;
|
|
313
|
+
private bufferDrains;
|
|
293
314
|
private drainPath;
|
|
315
|
+
private claimDrain;
|
|
294
316
|
/** The buffer path this store is currently scoped to (test helper). */
|
|
295
317
|
getBufferPath(): string;
|
|
296
318
|
/** The sessionId this store was scoped to, if any (test helper). */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local-store.d.ts","sourceRoot":"","sources":["../../src/storage/local-store.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"local-store.d.ts","sourceRoot":"","sources":["../../src/storage/local-store.ts"],"names":[],"mappings":"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"}
|