@ifc-lite/flow-nodes 0.8.0 → 0.9.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.
Files changed (51) hide show
  1. package/README.md +76 -0
  2. package/dist/bcf-publication-capacity.d.ts +5 -0
  3. package/dist/bcf-publication-capacity.d.ts.map +1 -0
  4. package/dist/bcf-publication-capacity.js +44 -0
  5. package/dist/bcf-publication-capacity.js.map +1 -0
  6. package/dist/bcf-publication-check.d.ts +4 -0
  7. package/dist/bcf-publication-check.d.ts.map +1 -0
  8. package/dist/bcf-publication-check.js +100 -0
  9. package/dist/bcf-publication-check.js.map +1 -0
  10. package/dist/bcf-publication-codec.d.ts +53 -0
  11. package/dist/bcf-publication-codec.d.ts.map +1 -0
  12. package/dist/bcf-publication-codec.js +247 -0
  13. package/dist/bcf-publication-codec.js.map +1 -0
  14. package/dist/bcf-publication-epochs.d.ts +17 -0
  15. package/dist/bcf-publication-epochs.d.ts.map +1 -0
  16. package/dist/bcf-publication-epochs.js +104 -0
  17. package/dist/bcf-publication-epochs.js.map +1 -0
  18. package/dist/bcf-publication-history.d.ts +8 -0
  19. package/dist/bcf-publication-history.d.ts.map +1 -0
  20. package/dist/bcf-publication-history.js +84 -0
  21. package/dist/bcf-publication-history.js.map +1 -0
  22. package/dist/bcf-publication-node.d.ts +4 -0
  23. package/dist/bcf-publication-node.d.ts.map +1 -0
  24. package/dist/bcf-publication-node.js +235 -0
  25. package/dist/bcf-publication-node.js.map +1 -0
  26. package/dist/bcf-publication-owner.d.ts +7 -0
  27. package/dist/bcf-publication-owner.d.ts.map +1 -0
  28. package/dist/bcf-publication-owner.js +94 -0
  29. package/dist/bcf-publication-owner.js.map +1 -0
  30. package/dist/bcf-publication-store.d.ts +40 -0
  31. package/dist/bcf-publication-store.d.ts.map +1 -0
  32. package/dist/bcf-publication-store.js +312 -0
  33. package/dist/bcf-publication-store.js.map +1 -0
  34. package/dist/bcf-publication-types.d.ts +105 -0
  35. package/dist/bcf-publication-types.d.ts.map +1 -0
  36. package/dist/bcf-publication-types.js +5 -0
  37. package/dist/bcf-publication-types.js.map +1 -0
  38. package/dist/host.d.ts +16 -1
  39. package/dist/host.d.ts.map +1 -1
  40. package/dist/host.js.map +1 -1
  41. package/dist/ids-nodes.d.ts.map +1 -1
  42. package/dist/ids-nodes.js +19 -5
  43. package/dist/ids-nodes.js.map +1 -1
  44. package/dist/index.d.ts.map +1 -1
  45. package/dist/index.js +2 -0
  46. package/dist/index.js.map +1 -1
  47. package/dist/review-node.d.ts +3 -0
  48. package/dist/review-node.d.ts.map +1 -0
  49. package/dist/review-node.js +20 -0
  50. package/dist/review-node.js.map +1 -0
  51. package/package.json +14 -8
@@ -0,0 +1,104 @@
1
+ /* This Source Code Form is subject to the terms of the Mozilla Public
2
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+ import { canonical, decodeCheck, MAX_CHECKS, record, refuse } from './bcf-publication-codec.js';
5
+ const MAX_EPOCH = Math.floor(Number.MAX_SAFE_INTEGER / MAX_CHECKS);
6
+ const code = (error) => record(error) ? error.code : undefined;
7
+ export function epochOf(checkId) {
8
+ const id = Number(checkId);
9
+ if (!Number.isSafeInteger(id) || id < 1 || String(id) !== checkId)
10
+ refuse('invalid check generation');
11
+ const epoch = Math.floor((id - 1) / MAX_CHECKS) + 1;
12
+ if (epoch > MAX_EPOCH)
13
+ refuse('check generation exceeds safe integer identity');
14
+ return epoch;
15
+ }
16
+ function marker(value, attempt, epoch) {
17
+ if (!record(value) || value.version !== 1 || value.id !== attempt.id || value.digest !== attempt.digest || value.epoch !== epoch
18
+ || Object.keys(value).some(k => !['version', 'id', 'digest', 'epoch', 'previous'].includes(k)))
19
+ refuse('invalid recovery epoch');
20
+ if (epoch === 1) {
21
+ if (value.previous !== undefined)
22
+ refuse('first epoch cannot have preceding proof');
23
+ }
24
+ else {
25
+ const checkId = String((epoch - 1) * MAX_CHECKS);
26
+ const previous = decodeCheck(value.previous, attempt, `${attempt.id}.checked-${checkId}.json`);
27
+ if (previous.checkId !== checkId || previous.settlement)
28
+ refuse('invalid preceding epoch proof');
29
+ }
30
+ return value;
31
+ }
32
+ /** Contiguous immutable markers permit bounded lookup; archived epoch bodies are never walked. */
33
+ export async function loadCheckEpoch(attempt, read) {
34
+ async function probe(epoch) {
35
+ try {
36
+ return marker(await read(epoch, 'marker.json'), attempt, epoch);
37
+ }
38
+ catch (error) {
39
+ if (code(error) === 'ENOENT')
40
+ return undefined;
41
+ throw error;
42
+ }
43
+ }
44
+ let latest = await probe(1);
45
+ if (!latest)
46
+ return { checks: [], pending: false };
47
+ let low = 1, high = 2;
48
+ while (high <= MAX_EPOCH) {
49
+ const found = await probe(high);
50
+ if (!found)
51
+ break;
52
+ latest = found;
53
+ low = high;
54
+ if (high === MAX_EPOCH)
55
+ break;
56
+ high = Math.min(MAX_EPOCH, high * 2);
57
+ }
58
+ while (high - low > 1) {
59
+ const middle = low + Math.floor((high - low) / 2);
60
+ const found = await probe(middle);
61
+ if (found) {
62
+ latest = found;
63
+ low = middle;
64
+ }
65
+ else
66
+ high = middle;
67
+ }
68
+ const checks = latest.previous ? [latest.previous] : [];
69
+ let missing = false, pending = false;
70
+ for (let offset = 1; offset <= MAX_CHECKS; offset += 1) {
71
+ const checkId = String((latest.epoch - 1) * MAX_CHECKS + offset);
72
+ const event = async (completed) => {
73
+ const filename = `${attempt.id}.${completed ? 'checked' : 'check'}-${checkId}.json`;
74
+ try {
75
+ return decodeCheck(await read(latest.epoch, filename), attempt, filename);
76
+ }
77
+ catch (error) {
78
+ if (code(error) === 'ENOENT')
79
+ return undefined;
80
+ throw error;
81
+ }
82
+ };
83
+ const request = await event(false), response = await event(true);
84
+ if (!request) {
85
+ if (response)
86
+ refuse('check response lacks reserved transition');
87
+ missing = true;
88
+ continue;
89
+ }
90
+ if (missing || pending || (response && request.settlement))
91
+ refuse('noncontiguous recovery epoch');
92
+ if (request.settlement && response)
93
+ refuse('settlement cannot have a response');
94
+ checks.push(response ?? request);
95
+ pending = !response && !request.settlement;
96
+ }
97
+ return { checks, pending };
98
+ }
99
+ /** Existing marker must contain the same immutable predecessor proof. */
100
+ export function verifyCheckEpoch(value, expected, attempt) {
101
+ if (canonical(marker(value, attempt, expected.epoch)) !== canonical(expected))
102
+ refuse('epoch predecessor proof changed');
103
+ }
104
+ //# sourceMappingURL=bcf-publication-epochs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bcf-publication-epochs.js","sourceRoot":"","sources":["../src/bcf-publication-epochs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { StoredBcfAttempt } from './bcf-publication-types.js';
2
+ import type { LoadedAttempt } from './bcf-publication-store.js';
3
+ /** Validate all predecessors, retaining at most selected+current payloads, never the whole journal. */
4
+ export declare function loadBcfHistory(names: string[], read: (name: string) => Promise<unknown>, readChecks: (attempt: StoredBcfAttempt) => Promise<{
5
+ checks: LoadedAttempt['checks'];
6
+ pending: boolean;
7
+ }>, targetId?: string, secrets?: readonly string[], visit?: (item: LoadedAttempt) => void): Promise<LoadedAttempt | undefined>;
8
+ //# sourceMappingURL=bcf-publication-history.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bcf-publication-history.d.ts","sourceRoot":"","sources":["../src/bcf-publication-history.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAEhE,uGAAuG;AACvG,wBAAsB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,EAC5F,UAAU,EAAE,CAAC,OAAO,EAAE,gBAAgB,KAAK,OAAO,CAAC;IAAE,MAAM,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,EACzG,QAAQ,CAAC,EAAE,MAAM,EAAE,OAAO,GAAE,SAAS,MAAM,EAAO,EAAE,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,aAAa,KAAK,IAAI,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CA6D/H"}
@@ -0,0 +1,84 @@
1
+ /* This Source Code Form is subject to the terms of the Mozilla Public
2
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+ import { canonical, credentialFree, decodeAttempt, decodeOutcome, MAX_GENERATIONS, NATIVE_METADATA, record, refuse } from './bcf-publication-codec.js';
5
+ import { ownerStatus } from './bcf-publication-owner.js';
6
+ /** Validate all predecessors, retaining at most selected+current payloads, never the whole journal. */
7
+ export async function loadBcfHistory(names, read, readChecks, targetId, secrets = [], visit) {
8
+ const intents = names.filter(name => name.endsWith('.intent.json'))
9
+ .sort((a, b) => Number(a.slice(65).split('.')[0]) - Number(b.slice(65).split('.')[0]));
10
+ const ids = new Set(intents.map(name => name.slice(0, -'.intent.json'.length)));
11
+ const relatedById = new Map();
12
+ for (const name of names) {
13
+ if (name.startsWith('.tmp-'))
14
+ continue;
15
+ const id = name.slice(0, name.indexOf('.'));
16
+ if (!ids.has(id))
17
+ refuse('orphaned publication record');
18
+ const related = relatedById.get(id) ?? [];
19
+ related.push(name);
20
+ relatedById.set(id, related);
21
+ }
22
+ let previousSettled = true;
23
+ let generation = 0;
24
+ let selected;
25
+ async function value(name) {
26
+ const result = await read(name);
27
+ credentialFree(result, secrets);
28
+ return result;
29
+ }
30
+ for (const filename of intents) {
31
+ const related = (relatedById.get(filename.slice(0, -'.intent.json'.length)) ?? [])
32
+ .filter(name => name !== filename && !name.endsWith('.epochs'));
33
+ // One generation has at most intent/outcome/owner records: bounded concurrent
34
+ // reads preserve full validation without serialising every filesystem roundtrip.
35
+ const [rawAttempt, records] = await Promise.all([value(filename),
36
+ Promise.all(related.map(async (name) => [name, await value(name)]))]);
37
+ const attempt = decodeAttempt(rawAttempt, filename);
38
+ if (attempt.generation !== ++generation || generation > MAX_GENERATIONS)
39
+ refuse('missing or excessive attempt generation');
40
+ if (!previousSettled)
41
+ refuse('attempt follows unresolved write');
42
+ const item = { attempt, checks: [], ownerStatus: NATIVE_METADATA.owner.unknown };
43
+ for (const [name, decoded] of records) {
44
+ if (name.endsWith('.outcome.json'))
45
+ item.outcome = decodeOutcome(decoded, attempt);
46
+ else if (name.endsWith('.owner-stopped.json')) {
47
+ if (!record(decoded) || decoded.version !== 1 || decoded.id !== attempt.id || decoded.digest !== attempt.digest
48
+ || decoded.assertion !== 'owner-stopped' || typeof decoded.at !== 'string' || !Number.isFinite(Date.parse(decoded.at))
49
+ || Object.keys(decoded).some(k => !['version', 'id', 'digest', 'at', 'assertion'].includes(k)))
50
+ refuse('invalid owner confirmation');
51
+ item.ownerConfirmed = true;
52
+ }
53
+ else
54
+ refuse('unrecognized root publication record');
55
+ }
56
+ const recovery = await readChecks(attempt);
57
+ item.checks = recovery.checks;
58
+ item.checkPending = recovery.pending;
59
+ if (item.checks.length && item.outcome && ['done', 'failed'].includes(item.outcome.state))
60
+ refuse('settled response cannot have recovery transitions');
61
+ for (let index = 0; index < item.checks.length; index += 1) {
62
+ const event = item.checks[index];
63
+ const settlement = event.settlement;
64
+ if (!settlement)
65
+ continue;
66
+ const proof = item.checks[index - 1];
67
+ if (index !== item.checks.length - 1 || !proof || proof.checkId !== settlement.proofCheckId
68
+ || canonical(proof.check) !== canonical(event.check)
69
+ || !(settlement.outcome.state === 'done'
70
+ ? proof.check.candidates.some(candidate => candidate.guid === settlement.outcome.receipt?.remoteGuid)
71
+ : proof.check.result === 'absent' && proof.check.candidates.length === 0))
72
+ refuse('settlement lacks latest checked proof');
73
+ item.reconciled = settlement.outcome;
74
+ }
75
+ previousSettled = ['done', 'failed'].includes((item.reconciled ?? item.outcome)?.state ?? 'uncertain');
76
+ if (!item.outcome && !item.reconciled)
77
+ item.ownerStatus = await ownerStatus(item.attempt);
78
+ visit?.(item);
79
+ if (targetId === undefined || targetId === attempt.id)
80
+ selected = item;
81
+ }
82
+ return selected;
83
+ }
84
+ //# sourceMappingURL=bcf-publication-history.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bcf-publication-history.js","sourceRoot":"","sources":["../src/bcf-publication-history.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { NativeBcfPublicationOptions, NativeBcfWriteGateway } from './bcf-publication-types.js';
2
+ /** Durable native gateway. An interrupted immutable intent is never automatically retried. */
3
+ export declare function createNativeBcfWriteGateway(options?: NativeBcfPublicationOptions): NativeBcfWriteGateway;
4
+ //# sourceMappingURL=bcf-publication-node.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bcf-publication-node.d.ts","sourceRoot":"","sources":["../src/bcf-publication-node.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EACV,2BAA2B,EAAE,qBAAqB,EACnD,MAAM,4BAA4B,CAAC;AAYpC,8FAA8F;AAC9F,wBAAgB,2BAA2B,CAAC,OAAO,GAAE,2BAAgC,GAAG,qBAAqB,CAyK5G"}
@@ -0,0 +1,235 @@
1
+ /* This Source Code Form is subject to the terms of the Mozilla Public
2
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+ import process from 'node:process';
5
+ import { homedir } from 'node:os';
6
+ import { join, resolve } from 'node:path';
7
+ import { classifyWriteError } from './bcf-publication.js';
8
+ import { assertNativeRepresentable, credentialFree, hash, intentDigest, MAX_CHECKS, MAX_GENERATIONS, NATIVE_METADATA, normalizeIntent, refuse, text } from './bcf-publication-codec.js';
9
+ import { lookupNativeBcfAttempt } from './bcf-publication-check.js';
10
+ import { BcfPublicationStore, entryOf } from './bcf-publication-store.js';
11
+ import { currentOwner } from './bcf-publication-owner.js';
12
+ const active = new Set();
13
+ // send has finished locally, even if persisting its outcome failed. Other processes remain conservative.
14
+ const finished = new Set();
15
+ let reservations = 0;
16
+ async function reserved(send) {
17
+ if (reservations + finished.size >= 64)
18
+ refuse('local unsettled-send limit reached; recover completed sends before creating more');
19
+ reservations += 1;
20
+ try {
21
+ return await send();
22
+ }
23
+ finally {
24
+ reservations -= 1;
25
+ }
26
+ }
27
+ /** Durable native gateway. An interrupted immutable intent is never automatically retried. */
28
+ export function createNativeBcfWriteGateway(options = {}) {
29
+ const configured = options.directory ?? (process.env.IFCLITE_BCF_OUTBOX_DIR || undefined);
30
+ const root = resolve(configured ?? join(homedir(), '.ifc-lite', 'bcf-outbox'));
31
+ const store = new BcfPublicationStore(join(root, hash(options.namespace ?? 'local')));
32
+ const secrets = options.secrets ?? [];
33
+ const key = (id) => `${store.directory}/${id}`;
34
+ function publicEntry(item) {
35
+ if (item.outcome || item.reconciled)
36
+ finished.delete(key(item.attempt.id));
37
+ return entryOf(item, finished.has(key(item.attempt.id)));
38
+ }
39
+ async function all(digest, targetId) {
40
+ const items = await store.load(digest, targetId, secrets);
41
+ for (const item of items) {
42
+ credentialFree(item, secrets);
43
+ if (item.outcome || item.reconciled)
44
+ finished.delete(key(item.attempt.id));
45
+ }
46
+ return items;
47
+ }
48
+ async function loaded(id) {
49
+ if (!/^[a-f0-9]{64}-[1-9][0-9]*$/.test(id))
50
+ refuse('invalid entry id');
51
+ const found = (await all(id.slice(0, 64), id)).find(item => item.attempt.id === id);
52
+ if (!found)
53
+ refuse('unknown publication entry');
54
+ return found;
55
+ }
56
+ function recoverable(item) {
57
+ if (item.reconciled || item.outcome?.state === 'done' || item.outcome?.state === 'failed')
58
+ refuse('entry is already settled');
59
+ if (active.has(key(item.attempt.id)))
60
+ refuse('write owner is still active');
61
+ if (!item.outcome && !finished.has(key(item.attempt.id))) {
62
+ if (item.ownerStatus === 'alive')
63
+ refuse('write owner is still active');
64
+ if (item.ownerStatus === 'unknown' && !item.ownerConfirmed)
65
+ refuse('write owner is unknown; confirm it stopped before checking');
66
+ }
67
+ }
68
+ async function page(pageOptions) {
69
+ const result = await store.page(pageOptions, secrets);
70
+ return { ...result, entries: result.entries.map(entry => {
71
+ if (entry.receipt || entry.failure)
72
+ finished.delete(key(entry.id));
73
+ return entry.state === 'sending' && finished.has(key(entry.id)) ? { ...entry, state: NATIVE_METADATA.state.uncertain } : entry;
74
+ }) };
75
+ }
76
+ return {
77
+ async write(input, send, ephemeralSecrets = []) {
78
+ const sensitive = [...secrets, ...ephemeralSecrets];
79
+ const intent = normalizeIntent(input, sensitive);
80
+ assertNativeRepresentable(sensitive);
81
+ return reserved(async () => {
82
+ const digest = intentDigest(intent);
83
+ const existing = await all(digest);
84
+ for (const item of existing)
85
+ credentialFree(item, sensitive);
86
+ const current = existing.filter(item => item.attempt.digest === digest).at(-1);
87
+ if (current && !['done', 'failed'].includes(publicEntry(current).state)) {
88
+ refuse(`identical earlier write ${current.attempt.id} has an unknown outcome; check and reconcile it before running again`);
89
+ }
90
+ const generation = (current?.attempt.generation ?? 0) + 1;
91
+ if (generation > MAX_GENERATIONS)
92
+ refuse('per-intent generation limit reached; existing receipts remain recoverable');
93
+ const id = `${digest}-${generation}`;
94
+ const attempt = { version: 1, id, digest, generation, intent, queuedAt: new Date().toISOString(),
95
+ owner: await currentOwner() };
96
+ // Only our successful exclusive link can own this local activity key.
97
+ // Following directory-fsync failure still leaves a recoverable visible intent.
98
+ let linkedOwned = false;
99
+ let outcomeSaved = false;
100
+ try {
101
+ await store.publish(`${id}.intent.json`, attempt, sensitive, () => {
102
+ linkedOwned = true;
103
+ active.add(key(id));
104
+ });
105
+ let result;
106
+ try {
107
+ result = await send();
108
+ if (!result || typeof result !== 'object')
109
+ refuse('server returned an invalid receipt');
110
+ const representations = sensitive.filter(secret => secret.length > 0)
111
+ .flatMap(secret => [...new Set([secret, JSON.stringify(secret).slice(1, -1)])]);
112
+ for (const field of ['guid', 'topic_guid', 'viewpoint_guid', 'reply_to_comment_guid']) {
113
+ const value = Reflect.get(result, field);
114
+ if (field !== 'guid' && (value === undefined || value === null))
115
+ continue;
116
+ if (!text(value))
117
+ refuse('server returned an invalid receipt');
118
+ if (representations.some(secret => value.includes(secret)))
119
+ refuse('server receipt contains credential text');
120
+ }
121
+ credentialFree({ remoteGuid: result.guid }, sensitive);
122
+ }
123
+ catch (error) {
124
+ const classified = classifyWriteError(error, new Date().toISOString());
125
+ const outcome = { version: 1, id, digest, state: classified.state,
126
+ failure: { ...classified.failure, message: classified.state === 'failed'
127
+ ? NATIVE_METADATA.message.refused : NATIVE_METADATA.message.unknown } };
128
+ await store.publish(`${id}.outcome.json`, outcome, sensitive);
129
+ outcomeSaved = true;
130
+ if (classified.state === 'failed')
131
+ throw new Error(`BCF publication ${id}: request refused (${classified.failure.code}${classified.failure.status ? `, HTTP ${classified.failure.status}` : ''}).`);
132
+ throw new Error(`BCF publication ${id}: outcome unknown; check and explicitly reconcile the recorded intent before sending again.`);
133
+ }
134
+ const outcome = { version: 1, id, digest, state: NATIVE_METADATA.state.done,
135
+ receipt: { remoteGuid: result.guid, at: new Date().toISOString(), evidence: NATIVE_METADATA.evidence.response } };
136
+ // Receipt persistence is part of success. A failed save leaves the durable intent unresolved.
137
+ await store.publish(`${id}.outcome.json`, outcome, sensitive);
138
+ outcomeSaved = true;
139
+ return result;
140
+ }
141
+ finally {
142
+ // An EEXIST loser must never clear or complete the winner's live key.
143
+ if (linkedOwned) {
144
+ active.delete(key(id));
145
+ if (outcomeSaved)
146
+ finished.delete(key(id));
147
+ else
148
+ finished.add(key(id));
149
+ }
150
+ }
151
+ });
152
+ },
153
+ async list() {
154
+ const result = await page({ limit: 1_000 });
155
+ if (result.nextCursor)
156
+ refuse('list exceeds one bounded page (row, byte or work limit); use listPage and its cursor');
157
+ return result.entries;
158
+ },
159
+ async listPage(pageOptions) {
160
+ return page(pageOptions);
161
+ },
162
+ async check(entryId, checkOptions) {
163
+ const sensitive = [...secrets, ...(checkOptions.token ? [checkOptions.token] : [])];
164
+ assertNativeRepresentable(sensitive);
165
+ let item = await loaded(entryId);
166
+ if (checkOptions.confirmOwnerStopped && !item.outcome && !finished.has(key(item.attempt.id))) {
167
+ if (active.has(key(item.attempt.id)) || item.ownerStatus === 'alive')
168
+ refuse('write owner is still active');
169
+ if (item.ownerStatus === 'unknown' && !item.ownerConfirmed) {
170
+ await store.publish(`${entryId}.owner-stopped.json`, { version: 1, id: entryId, digest: item.attempt.digest,
171
+ at: new Date().toISOString(), assertion: NATIVE_METADATA.assertion }, sensitive);
172
+ item = await loaded(entryId);
173
+ }
174
+ }
175
+ recoverable(item);
176
+ const previous = item.checks.at(-1);
177
+ const checkId = item.checkPending ? previous.checkId : String(Number(previous?.checkId ?? 0) + 1);
178
+ // Manual recovery resumes an interrupted GET reservation, never a create.
179
+ if (!item.checkPending) {
180
+ if (!previous || Number(previous.checkId) % MAX_CHECKS === 0)
181
+ await store.ensureEpoch(item.attempt, previous, sensitive);
182
+ await store.publish(`${entryId}.check-${checkId}.json`, { version: 1, id: entryId, digest: item.attempt.digest, checkId,
183
+ check: { at: new Date().toISOString(), result: NATIVE_METADATA.check.unavailable, candidates: [] } }, sensitive);
184
+ }
185
+ let check;
186
+ let failed = false;
187
+ try {
188
+ check = await lookupNativeBcfAttempt(item.attempt, checkOptions, secrets);
189
+ }
190
+ catch {
191
+ failed = true;
192
+ check = { at: new Date().toISOString(), result: NATIVE_METADATA.check.unavailable, candidates: [] };
193
+ }
194
+ recoverable(await loaded(entryId));
195
+ await store.publish(`${entryId}.checked-${checkId}.json`, { version: 1, id: entryId, digest: item.attempt.digest, checkId, check }, sensitive);
196
+ if (failed)
197
+ throw new Error('BCF publication check unavailable: network grant denied or server result unverified; no state was released.');
198
+ return publicEntry(await loaded(entryId));
199
+ },
200
+ async confirmAbsent(entryId) {
201
+ const item = await loaded(entryId);
202
+ recoverable(item);
203
+ const checked = item.checks.at(-1);
204
+ if (checked?.check.result !== 'absent' || checked.check.candidates.length || checked.check.fullReadAccessConfirmed !== true)
205
+ refuse('latest persisted check did not prove absence');
206
+ const outcome = { version: 1, id: entryId, digest: item.attempt.digest, state: NATIVE_METADATA.state.failed,
207
+ failure: { code: NATIVE_METADATA.confirmedAbsent, message: NATIVE_METADATA.message.absent, at: new Date().toISOString() } };
208
+ const nextId = String(Number(checked.checkId) + 1);
209
+ if (Number(checked.checkId) % MAX_CHECKS === 0)
210
+ await store.ensureEpoch(item.attempt, checked, secrets);
211
+ // A resolution and the next check compete for this SAME exclusive transition.
212
+ await store.publish(`${entryId}.check-${nextId}.json`, { version: 1, id: entryId, digest: item.attempt.digest,
213
+ checkId: nextId, check: checked.check, settlement: { outcome, proofCheckId: checked.checkId } }, secrets);
214
+ return publicEntry(await loaded(entryId));
215
+ },
216
+ async reconcile(entryId, candidateGuid) {
217
+ const item = await loaded(entryId);
218
+ recoverable(item);
219
+ credentialFree({ candidateGuid }, secrets);
220
+ const checked = item.checks.at(-1);
221
+ if (!checked?.check.candidates.some(candidate => candidate.guid === candidateGuid))
222
+ refuse('GUID is not a candidate from the latest persisted server check');
223
+ const outcome = { version: 1, id: entryId, digest: item.attempt.digest, state: NATIVE_METADATA.state.done,
224
+ receipt: { remoteGuid: candidateGuid, at: new Date().toISOString(), evidence: NATIVE_METADATA.evidence.reconciled } };
225
+ const nextId = String(Number(checked.checkId) + 1);
226
+ if (Number(checked.checkId) % MAX_CHECKS === 0)
227
+ await store.ensureEpoch(item.attempt, checked, secrets);
228
+ // A resolution and the next check compete for this SAME exclusive transition.
229
+ await store.publish(`${entryId}.check-${nextId}.json`, { version: 1, id: entryId, digest: item.attempt.digest,
230
+ checkId: nextId, check: checked.check, settlement: { outcome, proofCheckId: checked.checkId } }, secrets);
231
+ return publicEntry(await loaded(entryId));
232
+ },
233
+ };
234
+ }
235
+ //# sourceMappingURL=bcf-publication-node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bcf-publication-node.js","sourceRoot":"","sources":["../src/bcf-publication-node.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { NativeBcfOwnerStatus, StoredBcfAttempt } from './bcf-publication-types.js';
2
+ type Owner = StoredBcfAttempt['owner'];
3
+ export declare function currentOwner(): Promise<Owner>;
4
+ /** PID existence alone cannot identify a process instance. Foreign/legacy owners stay unknown. */
5
+ export declare function ownerStatus(attempt: StoredBcfAttempt): Promise<NativeBcfOwnerStatus>;
6
+ export {};
7
+ //# sourceMappingURL=bcf-publication-owner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bcf-publication-owner.d.ts","sourceRoot":"","sources":["../src/bcf-publication-owner.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAEzF,KAAK,KAAK,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;AAgDvC,wBAAsB,YAAY,IAAI,OAAO,CAAC,KAAK,CAAC,CAGnD;AAED,kGAAkG;AAClG,wBAAsB,WAAW,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAY1F"}
@@ -0,0 +1,94 @@
1
+ /* This Source Code Form is subject to the terms of the Mozilla Public
2
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+ import process from 'node:process';
5
+ import { readFile, readlink } from 'node:fs/promises';
6
+ import { hostname } from 'node:os';
7
+ import { spawn } from 'node:child_process';
8
+ import { hash, NATIVE_METADATA, record } from './bcf-publication-codec.js';
9
+ const code = (error) => record(error) ? error.code : undefined;
10
+ async function linuxOwner(pid) {
11
+ const [machine, boot, domain, stat] = await Promise.all([
12
+ readFile('/etc/machine-id', 'utf8'), readFile('/proc/sys/kernel/random/boot_id', 'utf8'),
13
+ readlink('/proc/self/ns/pid'), readFile(`/proc/${pid}/stat`, 'utf8'),
14
+ ]);
15
+ // comm may contain spaces and parentheses; field22 follows the final ')'.
16
+ const fields = stat.slice(stat.lastIndexOf(')') + 2).trim().split(/\s+/);
17
+ const start = fields[19];
18
+ if (!machine.trim() || !boot.trim() || typeof start !== 'string' || !/^\d+$/.test(start))
19
+ throw new Error('Process identity unavailable');
20
+ return { pid, host: hash(machine.trim()), boot: hash(boot.trim()), domain: hash(domain), instance: hash(start) };
21
+ }
22
+ /** Fixed native query, bounded output/time; no credential, shell interpolation or RPC. */
23
+ async function windowsOwner(pid) {
24
+ const script = `$p=Get-CimInstance Win32_Process -Filter 'ProcessId=${pid}'; if(!$p){exit 3}; `
25
+ + '$m=Get-CimInstance Win32_ComputerSystemProduct; $o=Get-CimInstance Win32_OperatingSystem; '
26
+ + '@{machine=$m.UUID;boot=$o.LastBootUpTime.ToUniversalTime().ToString("o");start=$p.CreationDate.ToUniversalTime().ToString("o")}|ConvertTo-Json -Compress';
27
+ const output = await new Promise((resolve, reject) => {
28
+ const child = spawn('powershell.exe', ['-NoProfile', '-NonInteractive', '-Command', script], { stdio: ['ignore', 'pipe', 'ignore'] });
29
+ let bytes = '';
30
+ const timer = setTimeout(() => { child.kill(); reject(new Error('Process identity query timed out')); }, 2_000);
31
+ child.stdout.on('data', chunk => {
32
+ bytes += String(chunk);
33
+ if (bytes.length > 8_192) {
34
+ child.kill();
35
+ reject(new Error('Process identity query exceeded bound'));
36
+ }
37
+ });
38
+ child.once('error', error => { clearTimeout(timer); reject(error); });
39
+ child.once('close', status => {
40
+ clearTimeout(timer);
41
+ if (status === 0)
42
+ resolve(bytes);
43
+ else
44
+ reject(Object.assign(new Error('Process identity query unavailable'), { code: status === 3 ? 'ESRCH' : 'EIO' }));
45
+ });
46
+ });
47
+ const value = JSON.parse(output);
48
+ if (!record(value) || !['machine', 'boot', 'start'].every(k => typeof value[k] === 'string' && value[k])) {
49
+ throw new Error('Invalid process identity response');
50
+ }
51
+ return { pid, host: hash(String(value.machine)), boot: hash(String(value.boot)), domain: hash('windows'), instance: hash(String(value.start)) };
52
+ }
53
+ async function observedOwner(pid) {
54
+ if (process.platform === 'linux')
55
+ return linuxOwner(pid);
56
+ if (process.platform === 'win32')
57
+ return windowsOwner(pid);
58
+ throw new Error('Process identity unsupported on this host');
59
+ }
60
+ export async function currentOwner() {
61
+ try {
62
+ return await observedOwner(process.pid);
63
+ }
64
+ catch {
65
+ return { pid: process.pid, host: hash(hostname()) };
66
+ } // Explicit unknown identity; never proof of death.
67
+ }
68
+ /** PID existence alone cannot identify a process instance. Foreign/legacy owners stay unknown. */
69
+ export async function ownerStatus(attempt) {
70
+ const owner = attempt.owner;
71
+ if (!owner.instance || !owner.boot || !owner.domain)
72
+ return NATIVE_METADATA.owner.unknown;
73
+ let local;
74
+ try {
75
+ local = await observedOwner(process.pid);
76
+ }
77
+ catch {
78
+ return NATIVE_METADATA.owner.unknown;
79
+ }
80
+ if (local.host !== owner.host || !local.boot || !local.domain)
81
+ return NATIVE_METADATA.owner.unknown;
82
+ if (local.boot !== owner.boot)
83
+ return NATIVE_METADATA.owner.dead;
84
+ if (local.domain !== owner.domain)
85
+ return NATIVE_METADATA.owner.unknown;
86
+ try {
87
+ const observed = await observedOwner(owner.pid);
88
+ return observed.instance === owner.instance ? NATIVE_METADATA.owner.alive : NATIVE_METADATA.owner.dead;
89
+ }
90
+ catch (error) {
91
+ return ['ENOENT', 'ESRCH'].includes(String(code(error))) ? NATIVE_METADATA.owner.dead : NATIVE_METADATA.owner.unknown;
92
+ }
93
+ }
94
+ //# sourceMappingURL=bcf-publication-owner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bcf-publication-owner.js","sourceRoot":"","sources":["../src/bcf-publication-owner.ts"],"names":[],"mappings":"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"}