@neottia/repository-store 0.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.
Files changed (98) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +76 -0
  3. package/binding.gyp +9 -0
  4. package/dist/errors.d.ts +43 -0
  5. package/dist/errors.d.ts.map +1 -0
  6. package/dist/errors.js +69 -0
  7. package/dist/errors.js.map +1 -0
  8. package/dist/files.d.ts +19 -0
  9. package/dist/files.d.ts.map +1 -0
  10. package/dist/files.js +113 -0
  11. package/dist/files.js.map +1 -0
  12. package/dist/index.d.ts +14 -0
  13. package/dist/index.d.ts.map +1 -0
  14. package/dist/index.js +11 -0
  15. package/dist/index.js.map +1 -0
  16. package/dist/internal/fault-injection.d.ts +13 -0
  17. package/dist/internal/fault-injection.d.ts.map +1 -0
  18. package/dist/internal/fault-injection.js +68 -0
  19. package/dist/internal/fault-injection.js.map +1 -0
  20. package/dist/internal/filesystem.d.ts +25 -0
  21. package/dist/internal/filesystem.d.ts.map +1 -0
  22. package/dist/internal/filesystem.js +199 -0
  23. package/dist/internal/filesystem.js.map +1 -0
  24. package/dist/internal/model.d.ts +43 -0
  25. package/dist/internal/model.d.ts.map +1 -0
  26. package/dist/internal/model.js +49 -0
  27. package/dist/internal/model.js.map +1 -0
  28. package/dist/internal/native-publication.d.ts +9 -0
  29. package/dist/internal/native-publication.d.ts.map +1 -0
  30. package/dist/internal/native-publication.js +65 -0
  31. package/dist/internal/native-publication.js.map +1 -0
  32. package/dist/internal/publication.d.ts +10 -0
  33. package/dist/internal/publication.d.ts.map +1 -0
  34. package/dist/internal/publication.js +223 -0
  35. package/dist/internal/publication.js.map +1 -0
  36. package/dist/lease.d.ts +24 -0
  37. package/dist/lease.d.ts.map +1 -0
  38. package/dist/lease.js +932 -0
  39. package/dist/lease.js.map +1 -0
  40. package/dist/limits.d.ts +15 -0
  41. package/dist/limits.d.ts.map +1 -0
  42. package/dist/limits.js +14 -0
  43. package/dist/limits.js.map +1 -0
  44. package/dist/paths.d.ts +15 -0
  45. package/dist/paths.d.ts.map +1 -0
  46. package/dist/paths.js +58 -0
  47. package/dist/paths.js.map +1 -0
  48. package/dist/revision.d.ts +4 -0
  49. package/dist/revision.d.ts.map +1 -0
  50. package/dist/revision.js +8 -0
  51. package/dist/revision.js.map +1 -0
  52. package/dist/sqlite/adapter.d.ts +48 -0
  53. package/dist/sqlite/adapter.d.ts.map +1 -0
  54. package/dist/sqlite/adapter.js +183 -0
  55. package/dist/sqlite/adapter.js.map +1 -0
  56. package/dist/sqlite/bun.d.ts +2 -0
  57. package/dist/sqlite/bun.d.ts.map +1 -0
  58. package/dist/sqlite/bun.js +7 -0
  59. package/dist/sqlite/bun.js.map +1 -0
  60. package/dist/sqlite/cache-publication.d.ts +6 -0
  61. package/dist/sqlite/cache-publication.d.ts.map +1 -0
  62. package/dist/sqlite/cache-publication.js +191 -0
  63. package/dist/sqlite/cache-publication.js.map +1 -0
  64. package/dist/sqlite/cache.d.ts +26 -0
  65. package/dist/sqlite/cache.d.ts.map +1 -0
  66. package/dist/sqlite/cache.js +527 -0
  67. package/dist/sqlite/cache.js.map +1 -0
  68. package/dist/sqlite/node.d.ts +2 -0
  69. package/dist/sqlite/node.d.ts.map +1 -0
  70. package/dist/sqlite/node.js +6 -0
  71. package/dist/sqlite/node.js.map +1 -0
  72. package/dist/sqlite/runtime.d.ts +4 -0
  73. package/dist/sqlite/runtime.d.ts.map +1 -0
  74. package/dist/sqlite/runtime.js +34 -0
  75. package/dist/sqlite/runtime.js.map +1 -0
  76. package/dist/testing.d.ts +2 -0
  77. package/dist/testing.d.ts.map +1 -0
  78. package/dist/testing.js +2 -0
  79. package/dist/testing.js.map +1 -0
  80. package/dist/transaction/apply.d.ts +8 -0
  81. package/dist/transaction/apply.d.ts.map +1 -0
  82. package/dist/transaction/apply.js +273 -0
  83. package/dist/transaction/apply.js.map +1 -0
  84. package/dist/transaction/journal.d.ts +17 -0
  85. package/dist/transaction/journal.d.ts.map +1 -0
  86. package/dist/transaction/journal.js +207 -0
  87. package/dist/transaction/journal.js.map +1 -0
  88. package/dist/transaction/recovery.d.ts +6 -0
  89. package/dist/transaction/recovery.d.ts.map +1 -0
  90. package/dist/transaction/recovery.js +138 -0
  91. package/dist/transaction/recovery.js.map +1 -0
  92. package/dist/transaction/types.d.ts +45 -0
  93. package/dist/transaction/types.d.ts.map +1 -0
  94. package/dist/transaction/types.js +2 -0
  95. package/dist/transaction/types.js.map +1 -0
  96. package/native/rename_noreplace.cc +145 -0
  97. package/package.json +71 -0
  98. package/scripts/install-native.mjs +10 -0
@@ -0,0 +1,191 @@
1
+ import { createHash, randomBytes } from 'node:crypto';
2
+ import { lstatSync, mkdirSync, opendirSync, renameSync, rmSync, rmdirSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ import { RecoveryError, ResourceLimitError } from '../errors.js';
5
+ import { assertSafeRegular, ensurePrivateDirectory, readRegularFile, syncDirectory } from '../internal/filesystem.js';
6
+ import { getPathState, getRootState, } from '../internal/model.js';
7
+ import { publishExactRegularFile, recoverExactPublication } from '../internal/publication.js';
8
+ import { assertLiveLease, checkControl } from '../lease.js';
9
+ import { resolveManagedPath, validateRelativePath } from '../paths.js';
10
+ import { computeByteRevision, isByteRevision } from '../revision.js';
11
+ import { writeDurableFile } from '../transaction/journal.js';
12
+ const STATE_NAME = /^([0-9a-f]{64})\.(prepare|active|cleanup)$/u;
13
+ export function recoverCachePublications(root, lease, options = {}) {
14
+ assertLiveLease(root, lease);
15
+ checkControl(options);
16
+ const state = requireRootState(root);
17
+ const publications = publicationRoot(state.authorityRoot, state.managedRootId);
18
+ const entries = readDirectoryBounded(publications, state.limits.maxFiles, () => new ResourceLimitError('Cache publication recovery exceeds maxFiles.')).sort();
19
+ for (const name of entries) {
20
+ checkControl(options);
21
+ const match = STATE_NAME.exec(name);
22
+ if (match === null)
23
+ continue;
24
+ const token = match[1];
25
+ const phase = match[2];
26
+ const directory = join(publications, name);
27
+ assertStateDirectory(directory);
28
+ if (phase === 'active') {
29
+ const manifest = readManifest(directory, state.limits.maxJournalBytes);
30
+ validateManifest(manifest, state.authorityId, state.managedRootId, token);
31
+ const path = resolveManagedPath(root, manifest.path);
32
+ const pathState = getPathState(path);
33
+ if (pathState === undefined)
34
+ throw malformed('Recovered cache path is not a repository-store handle.');
35
+ recoverExactPublication(pathState.absolutePath, token, [manifest.originalRevision, manifest.intendedRevision], state.limits.maxTemporaryBytes);
36
+ const cleanup = join(publications, `${token}.cleanup`);
37
+ renameSync(directory, cleanup);
38
+ syncDirectory(publications);
39
+ cleanupStateDirectory(cleanup, publications, state.limits.maxJournalBytes);
40
+ }
41
+ else {
42
+ cleanupStateDirectory(directory, publications, state.limits.maxJournalBytes);
43
+ }
44
+ }
45
+ }
46
+ export function publishCacheDatabase(root, lease, path, bytes, expected, options = {}) {
47
+ assertLiveLease(root, lease);
48
+ checkControl(options);
49
+ const state = requireRootState(root);
50
+ const pathState = getPathState(path);
51
+ if (pathState === undefined)
52
+ throw malformed('Cache path is not a repository-store handle.');
53
+ const publications = publicationRoot(state.authorityRoot, state.managedRootId);
54
+ const token = randomBytes(32).toString('hex');
55
+ const prepare = join(publications, `${token}.prepare`);
56
+ mkdirSync(prepare, { mode: 0o700 });
57
+ const unsigned = {
58
+ version: 1,
59
+ token,
60
+ authorityId: state.authorityId,
61
+ managedRootId: state.managedRootId,
62
+ path: path.relativePath,
63
+ originalRevision: expected?.revision ?? null,
64
+ intendedRevision: computeByteRevision(bytes),
65
+ createdAt: new Date().toISOString(),
66
+ };
67
+ const manifest = { ...unsigned, digest: digest(unsigned) };
68
+ writeDurableFile(join(prepare, 'manifest.json'), new TextEncoder().encode(JSON.stringify(manifest)));
69
+ syncDirectory(prepare);
70
+ const active = join(publications, `${token}.active`);
71
+ renameSync(prepare, active);
72
+ syncDirectory(publications);
73
+ let publicationError;
74
+ try {
75
+ publishExactRegularFile(pathState.absolutePath, bytes, expected, token);
76
+ }
77
+ catch (error) {
78
+ publicationError = error;
79
+ recoverExactPublication(pathState.absolutePath, token, [manifest.originalRevision, manifest.intendedRevision], state.limits.maxTemporaryBytes);
80
+ }
81
+ const cleanup = join(publications, `${token}.cleanup`);
82
+ renameSync(active, cleanup);
83
+ syncDirectory(publications);
84
+ cleanupStateDirectory(cleanup, publications, state.limits.maxJournalBytes);
85
+ if (publicationError !== undefined)
86
+ throw publicationError;
87
+ }
88
+ function publicationRoot(authorityRoot, managedRootId) {
89
+ if (!/^[0-9a-f]{64}$/u.test(managedRootId))
90
+ throw malformed('Managed-root cache identity is invalid.');
91
+ const path = join(authorityRoot, '.neottia', 'repository-store', 'cache-publications', managedRootId);
92
+ ensurePrivateDirectory(path);
93
+ return path;
94
+ }
95
+ function readManifest(directory, maxBytes) {
96
+ const path = join(directory, 'manifest.json');
97
+ const stat = lstatSync(path);
98
+ assertSafeRegular(stat, path);
99
+ if (stat.size > maxBytes)
100
+ throw malformed('Cache publication manifest exceeds maxJournalBytes.');
101
+ let value;
102
+ try {
103
+ value = JSON.parse(new TextDecoder().decode(readRegularFile(path, maxBytes)));
104
+ }
105
+ catch (error) {
106
+ throw malformed('Cache publication manifest is not valid JSON.', error);
107
+ }
108
+ if (!isManifest(value))
109
+ throw malformed('Cache publication manifest has an invalid schema.');
110
+ const { digest: actual, ...unsigned } = value;
111
+ if (digest(unsigned) !== actual)
112
+ throw malformed('Cache publication manifest digest does not match.');
113
+ return value;
114
+ }
115
+ function validateManifest(manifest, authorityId, managedRootId, token) {
116
+ if (manifest.authorityId !== authorityId || manifest.managedRootId !== managedRootId || manifest.token !== token)
117
+ throw malformed('Cache publication identity does not match its authority or state directory.');
118
+ validateRelativePath(manifest.path);
119
+ }
120
+ function cleanupStateDirectory(directory, parent, maxBytes) {
121
+ const entries = readDirectoryBounded(directory, 1, () => malformed('Cache publication state contains more than one artifact.'));
122
+ if (entries.some((name) => name !== 'manifest.json'))
123
+ throw malformed('Cache publication state contains an unowned artifact.');
124
+ if (entries.includes('manifest.json')) {
125
+ const path = join(directory, 'manifest.json');
126
+ const stat = lstatSync(path);
127
+ assertSafeRegular(stat, path);
128
+ if (stat.size > maxBytes)
129
+ throw malformed('Cache publication manifest exceeds maxJournalBytes.');
130
+ rmSync(path);
131
+ }
132
+ rmdirSync(directory);
133
+ syncDirectory(parent);
134
+ }
135
+ function readDirectoryBounded(path, limit, overflow) {
136
+ const directory = opendirSync(path);
137
+ const entries = [];
138
+ try {
139
+ while (true) {
140
+ const entry = directory.readSync();
141
+ if (entry === null)
142
+ return entries;
143
+ if (entries.length >= limit)
144
+ throw overflow();
145
+ entries.push(entry.name);
146
+ }
147
+ }
148
+ finally {
149
+ try {
150
+ directory.closeSync();
151
+ }
152
+ catch {
153
+ }
154
+ }
155
+ }
156
+ function assertStateDirectory(path) {
157
+ const stat = lstatSync(path);
158
+ if (stat.isSymbolicLink() || !stat.isDirectory())
159
+ throw malformed(`Unsafe cache publication state path: ${path}`);
160
+ }
161
+ function digest(manifest) {
162
+ return createHash('sha256').update(JSON.stringify(manifest)).digest('hex');
163
+ }
164
+ function isManifest(value) {
165
+ if (value === null || typeof value !== 'object' || Array.isArray(value))
166
+ return false;
167
+ const manifest = value;
168
+ return (manifest.version === 1 &&
169
+ typeof manifest.token === 'string' &&
170
+ /^[0-9a-f]{64}$/u.test(manifest.token) &&
171
+ typeof manifest.authorityId === 'string' &&
172
+ /^[0-9a-f]{64}$/u.test(manifest.authorityId) &&
173
+ typeof manifest.managedRootId === 'string' &&
174
+ /^[0-9a-f]{64}$/u.test(manifest.managedRootId) &&
175
+ typeof manifest.path === 'string' &&
176
+ (manifest.originalRevision === null || isByteRevision(manifest.originalRevision)) &&
177
+ isByteRevision(manifest.intendedRevision) &&
178
+ typeof manifest.createdAt === 'string' &&
179
+ typeof manifest.digest === 'string' &&
180
+ /^[0-9a-f]{64}$/u.test(manifest.digest));
181
+ }
182
+ function requireRootState(root) {
183
+ const state = getRootState(root);
184
+ if (state === undefined)
185
+ throw malformed('Managed root is not a repository-store handle.');
186
+ return state;
187
+ }
188
+ function malformed(message, cause) {
189
+ return new RecoveryError(message, 'RECOVERY_MALFORMED', undefined, cause === undefined ? undefined : { cause });
190
+ }
191
+ //# sourceMappingURL=cache-publication.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache-publication.js","sourceRoot":"","sources":["../../src/sqlite/cache-publication.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { SqliteConnection } from './adapter.js';
2
+ import { type ManagedPath, type ManagedRoot, type RepositoryLease } from '../internal/model.js';
3
+ import { type OperationControl } from '../lease.js';
4
+ export interface DisposableCacheSpecification {
5
+ readonly path: ManagedPath;
6
+ readonly applicationId: number;
7
+ readonly schemaVersion: number;
8
+ readonly canonicalDigest: string;
9
+ readonly schemaSql: readonly string[];
10
+ populate(database: SqliteConnection): Promise<void>;
11
+ healthCheck(database: SqliteConnection): Promise<void>;
12
+ }
13
+ export interface DisposableSqliteCache {
14
+ readonly state: 'ready';
15
+ readonly database: SqliteConnection;
16
+ close(): Promise<void>;
17
+ }
18
+ export type CacheRebuildReason = 'missing' | 'corrupt' | 'wrong-application' | 'wrong-schema' | 'stale-digest' | 'failed-integrity' | 'contradictory';
19
+ export type CacheOpenResult = DisposableSqliteCache | {
20
+ readonly state: 'rebuild-required';
21
+ readonly reason: CacheRebuildReason;
22
+ };
23
+ export declare function openDisposableSqliteCache(root: ManagedRoot, lease: RepositoryLease, specification: DisposableCacheSpecification, options?: OperationControl): Promise<CacheOpenResult>;
24
+ export declare function rebuildDisposableSqliteCache(root: ManagedRoot, lease: RepositoryLease, specification: DisposableCacheSpecification, options?: OperationControl): Promise<DisposableSqliteCache>;
25
+ export declare function removeDisposableSqliteCache(root: ManagedRoot, lease: RepositoryLease, path: ManagedPath, options?: OperationControl): Promise<void>;
26
+ //# sourceMappingURL=cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/sqlite/cache.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,gBAAgB,EAAqC,MAAM,cAAc,CAAC;AAYxF,OAAO,EAIL,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,eAAe,EACrB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAsD,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAIxG,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpD,WAAW,CAAC,QAAQ,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACxD;AAGD,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC;IACpC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,MAAM,MAAM,kBAAkB,GAC5B,SAAS,GAAG,SAAS,GAAG,mBAAmB,GAAG,cAAc,GAAG,cAAc,GAAG,kBAAkB,GAAG,eAAe,CAAC;AAGvH,MAAM,MAAM,eAAe,GACzB,qBAAqB,GAAG;IAAE,QAAQ,CAAC,KAAK,EAAE,kBAAkB,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,kBAAkB,CAAA;CAAE,CAAC;AAGtG,wBAAsB,yBAAyB,CAC7C,IAAI,EAAE,WAAW,EACjB,KAAK,EAAE,eAAe,EACtB,aAAa,EAAE,4BAA4B,EAC3C,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,eAAe,CAAC,CA4D1B;AAGD,wBAAsB,4BAA4B,CAChD,IAAI,EAAE,WAAW,EACjB,KAAK,EAAE,eAAe,EACtB,aAAa,EAAE,4BAA4B,EAC3C,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,qBAAqB,CAAC,CAuJhC;AAGD,wBAAsB,2BAA2B,CAC/C,IAAI,EAAE,WAAW,EACjB,KAAK,EAAE,eAAe,EACtB,IAAI,EAAE,WAAW,EACjB,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,IAAI,CAAC,CAWf"}