@avantf/dsh-plugin-base 0.3.1
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/LICENSE +21 -0
- package/README.md +303 -0
- package/dist/artifact.d.ts +29 -0
- package/dist/artifact.d.ts.map +1 -0
- package/dist/artifact.js +60 -0
- package/dist/artifact.js.map +1 -0
- package/dist/bootstrap.d.ts +54 -0
- package/dist/bootstrap.d.ts.map +1 -0
- package/dist/bootstrap.js +334 -0
- package/dist/bootstrap.js.map +1 -0
- package/dist/cli.d.ts +4 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +37 -0
- package/dist/cli.js.map +1 -0
- package/dist/compat.d.ts +413 -0
- package/dist/compat.d.ts.map +1 -0
- package/dist/compat.js +742 -0
- package/dist/compat.js.map +1 -0
- package/dist/conformance.d.ts +55 -0
- package/dist/conformance.d.ts.map +1 -0
- package/dist/conformance.js +702 -0
- package/dist/conformance.js.map +1 -0
- package/dist/errors.d.ts +26 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +28 -0
- package/dist/errors.js.map +1 -0
- package/dist/fs.d.ts +18 -0
- package/dist/fs.d.ts.map +1 -0
- package/dist/fs.js +152 -0
- package/dist/fs.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +35 -0
- package/dist/index.js.map +1 -0
- package/dist/integrity.d.ts +5 -0
- package/dist/integrity.d.ts.map +1 -0
- package/dist/integrity.js +33 -0
- package/dist/integrity.js.map +1 -0
- package/dist/interface.d.ts +262 -0
- package/dist/interface.d.ts.map +1 -0
- package/dist/interface.js +136 -0
- package/dist/interface.js.map +1 -0
- package/dist/interface_gate.d.ts +61 -0
- package/dist/interface_gate.d.ts.map +1 -0
- package/dist/interface_gate.js +103 -0
- package/dist/interface_gate.js.map +1 -0
- package/dist/internal.d.ts +23 -0
- package/dist/internal.d.ts.map +1 -0
- package/dist/internal.js +18 -0
- package/dist/internal.js.map +1 -0
- package/dist/kit/family.d.ts +52 -0
- package/dist/kit/family.d.ts.map +1 -0
- package/dist/kit/family.js +65 -0
- package/dist/kit/family.js.map +1 -0
- package/dist/kit/index.d.ts +26 -0
- package/dist/kit/index.d.ts.map +1 -0
- package/dist/kit/index.js +26 -0
- package/dist/kit/index.js.map +1 -0
- package/dist/kit/logger.d.ts +41 -0
- package/dist/kit/logger.d.ts.map +1 -0
- package/dist/kit/logger.js +42 -0
- package/dist/kit/logger.js.map +1 -0
- package/dist/kit/prompt_files.d.ts +90 -0
- package/dist/kit/prompt_files.d.ts.map +1 -0
- package/dist/kit/prompt_files.js +121 -0
- package/dist/kit/prompt_files.js.map +1 -0
- package/dist/kit/typert.d.ts +40 -0
- package/dist/kit/typert.d.ts.map +1 -0
- package/dist/kit/typert.js +17 -0
- package/dist/kit/typert.js.map +1 -0
- package/dist/layout.d.ts +28 -0
- package/dist/layout.d.ts.map +1 -0
- package/dist/layout.js +84 -0
- package/dist/layout.js.map +1 -0
- package/dist/lint.d.ts +33 -0
- package/dist/lint.d.ts.map +1 -0
- package/dist/lint.js +271 -0
- package/dist/lint.js.map +1 -0
- package/dist/lock.d.ts +12 -0
- package/dist/lock.d.ts.map +1 -0
- package/dist/lock.js +93 -0
- package/dist/lock.js.map +1 -0
- package/dist/manifest.d.ts +12 -0
- package/dist/manifest.d.ts.map +1 -0
- package/dist/manifest.js +75 -0
- package/dist/manifest.js.map +1 -0
- package/dist/net.d.ts +23 -0
- package/dist/net.d.ts.map +1 -0
- package/dist/net.js +112 -0
- package/dist/net.js.map +1 -0
- package/dist/package-name.d.ts +3 -0
- package/dist/package-name.d.ts.map +1 -0
- package/dist/package-name.js +13 -0
- package/dist/package-name.js.map +1 -0
- package/dist/preset.d.ts +46 -0
- package/dist/preset.d.ts.map +1 -0
- package/dist/preset.js +230 -0
- package/dist/preset.js.map +1 -0
- package/dist/providers/archive.d.ts +32 -0
- package/dist/providers/archive.d.ts.map +1 -0
- package/dist/providers/archive.js +248 -0
- package/dist/providers/archive.js.map +1 -0
- package/dist/providers/model.d.ts +25 -0
- package/dist/providers/model.d.ts.map +1 -0
- package/dist/providers/model.js +550 -0
- package/dist/providers/model.js.map +1 -0
- package/dist/providers/npm.d.ts +21 -0
- package/dist/providers/npm.d.ts.map +1 -0
- package/dist/providers/npm.js +458 -0
- package/dist/providers/npm.js.map +1 -0
- package/dist/provisioner.d.ts +21 -0
- package/dist/provisioner.d.ts.map +1 -0
- package/dist/provisioner.js +962 -0
- package/dist/provisioner.js.map +1 -0
- package/dist/semver.d.ts +31 -0
- package/dist/semver.d.ts.map +1 -0
- package/dist/semver.js +244 -0
- package/dist/semver.js.map +1 -0
- package/dist/state.d.ts +71 -0
- package/dist/state.d.ts.map +1 -0
- package/dist/state.js +225 -0
- package/dist/state.js.map +1 -0
- package/dist/tar.d.ts +10 -0
- package/dist/tar.d.ts.map +1 -0
- package/dist/tar.js +178 -0
- package/dist/tar.js.map +1 -0
- package/dist/types.d.ts +431 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/zip.d.ts +8 -0
- package/dist/zip.d.ts.map +1 -0
- package/dist/zip.js +109 -0
- package/dist/zip.js.map +1 -0
- package/package.json +84 -0
package/dist/state.js
ADDED
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The persisted state plane: `<home>/.envinit/{.layout.json,status.json,declared.json}`.
|
|
3
|
+
* @module state
|
|
4
|
+
*/
|
|
5
|
+
import { reasonOf } from './errors.js';
|
|
6
|
+
import { exists } from './fs.js';
|
|
7
|
+
import { decodeJson } from './manifest.js';
|
|
8
|
+
import { declaredPath, layoutPath, statusLockPath, statusPath } from './layout.js';
|
|
9
|
+
import { pidIsAlive } from './lock.js';
|
|
10
|
+
/** `<home>/status.json` schema version. */
|
|
11
|
+
export const STATUS_SCHEMA_VERSION = 1;
|
|
12
|
+
/** `<home>/.layout.json` schema version. */
|
|
13
|
+
export const LAYOUT_SCHEMA_VERSION = 1;
|
|
14
|
+
/** How long a status write waits for the short lock. */
|
|
15
|
+
const STATUS_LOCK_TIMEOUT_MS = 5_000;
|
|
16
|
+
const STATUS_LOCK_STALE_MS = 30_000;
|
|
17
|
+
/** Declarations older than this, from a dead pid, are dropped. */
|
|
18
|
+
const DECLARED_TTL_MS = 7 * 24 * 60 * 60 * 1000;
|
|
19
|
+
function isRecord(value) {
|
|
20
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
21
|
+
}
|
|
22
|
+
function str(value) {
|
|
23
|
+
return typeof value === 'string' && value !== '' ? value : undefined;
|
|
24
|
+
}
|
|
25
|
+
/** Read `<home>/.layout.json` as ok, none, too-new or mismatch. */
|
|
26
|
+
export async function readLayout(fs, home, layout) {
|
|
27
|
+
const path = layoutPath(home);
|
|
28
|
+
if (!(await exists(fs, path)))
|
|
29
|
+
return { kind: 'none' };
|
|
30
|
+
const raw = decodeJson(await fs.readFile(path));
|
|
31
|
+
if (!isRecord(raw))
|
|
32
|
+
return { kind: 'none' };
|
|
33
|
+
const schemaVersion = typeof raw['schemaVersion'] === 'number' ? raw['schemaVersion'] : LAYOUT_SCHEMA_VERSION;
|
|
34
|
+
const file = {
|
|
35
|
+
schemaVersion,
|
|
36
|
+
layout: str(raw['layout']) ?? '',
|
|
37
|
+
writtenBy: str(raw['writtenBy']) ?? '',
|
|
38
|
+
};
|
|
39
|
+
if (schemaVersion > LAYOUT_SCHEMA_VERSION)
|
|
40
|
+
return { kind: 'too-new' };
|
|
41
|
+
if (file.layout !== '' && file.layout !== layout)
|
|
42
|
+
return { kind: 'mismatch', file };
|
|
43
|
+
return { kind: 'ok', file };
|
|
44
|
+
}
|
|
45
|
+
/** Write the layout marker. */
|
|
46
|
+
export async function writeLayout(fs, home, layout, writtenBy) {
|
|
47
|
+
const file = { schemaVersion: LAYOUT_SCHEMA_VERSION, layout, writtenBy };
|
|
48
|
+
await fs.atomicWrite(layoutPath(home), new TextEncoder().encode(`${JSON.stringify(file, null, 2)}\n`));
|
|
49
|
+
}
|
|
50
|
+
/** Read `status.json`; a newer schema yields `too-new`. */
|
|
51
|
+
export async function readStatus(fs, home) {
|
|
52
|
+
const path = statusPath(home);
|
|
53
|
+
if (!(await exists(fs, path)))
|
|
54
|
+
return { kind: 'none' };
|
|
55
|
+
const raw = decodeJson(await fs.readFile(path));
|
|
56
|
+
if (!isRecord(raw))
|
|
57
|
+
return { kind: 'unreadable' };
|
|
58
|
+
const schemaVersion = typeof raw['schemaVersion'] === 'number' ? raw['schemaVersion'] : 0;
|
|
59
|
+
if (schemaVersion > STATUS_SCHEMA_VERSION)
|
|
60
|
+
return { kind: 'too-new' };
|
|
61
|
+
const rows = Array.isArray(raw['rows']) ? raw['rows'] : [];
|
|
62
|
+
const parsed = [];
|
|
63
|
+
for (const row of rows) {
|
|
64
|
+
if (!isRecord(row))
|
|
65
|
+
continue;
|
|
66
|
+
const key = str(row['key']);
|
|
67
|
+
const version = typeof row['version'] === 'string' ? row['version'] : undefined;
|
|
68
|
+
if (key === undefined || version === undefined)
|
|
69
|
+
continue;
|
|
70
|
+
const lastError = isRecord(row['last_error']) ? row['last_error'] : undefined;
|
|
71
|
+
const code = lastError === undefined ? undefined : str(lastError['code']);
|
|
72
|
+
const detail = lastError === undefined ? undefined : str(lastError['detail']);
|
|
73
|
+
const retryAfter = lastError === undefined ? undefined : lastError['retry_after'];
|
|
74
|
+
const source = str(row['source']);
|
|
75
|
+
const integrity = str(row['integrity']);
|
|
76
|
+
parsed.push({
|
|
77
|
+
key,
|
|
78
|
+
version,
|
|
79
|
+
items: Array.isArray(row['items']) ? row['items'].filter((item) => typeof item === 'string') : [],
|
|
80
|
+
plugins: Array.isArray(row['plugins']) ? row['plugins'].filter((plugin) => typeof plugin === 'string') : [],
|
|
81
|
+
...(source === undefined ? {} : { source: source }),
|
|
82
|
+
...(integrity === undefined ? {} : { integrity }),
|
|
83
|
+
updated_at: typeof row['updated_at'] === 'number' ? row['updated_at'] : 0,
|
|
84
|
+
...(code === undefined
|
|
85
|
+
? {}
|
|
86
|
+
: {
|
|
87
|
+
last_error: {
|
|
88
|
+
code,
|
|
89
|
+
...(detail === undefined ? {} : { detail }),
|
|
90
|
+
...(typeof retryAfter === 'number' ? { retry_after: retryAfter } : {}),
|
|
91
|
+
},
|
|
92
|
+
}),
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
return { kind: 'ok', rows: parsed };
|
|
96
|
+
}
|
|
97
|
+
/** Merge two row sets by `key × version`; newer `updated_at` wins, `items`/`plugins` are unioned. */
|
|
98
|
+
export function mergeRows(current, incoming) {
|
|
99
|
+
const merged = new Map();
|
|
100
|
+
for (const row of [...current, ...incoming]) {
|
|
101
|
+
const id = `${row.key}\u0000${row.version}`;
|
|
102
|
+
const previous = merged.get(id);
|
|
103
|
+
if (previous === undefined) {
|
|
104
|
+
merged.set(id, row);
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
const winner = previous.updated_at >= row.updated_at ? previous : row;
|
|
108
|
+
const loser = winner === previous ? row : previous;
|
|
109
|
+
merged.set(id, {
|
|
110
|
+
...winner,
|
|
111
|
+
items: [...new Set([...previous.items, ...row.items])].sort(),
|
|
112
|
+
plugins: [...new Set([...previous.plugins, ...row.plugins])].sort(),
|
|
113
|
+
...(winner.source === undefined && loser.source !== undefined ? { source: loser.source } : {}),
|
|
114
|
+
...(winner.integrity === undefined && loser.integrity !== undefined ? { integrity: loser.integrity } : {}),
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
// Fold a version-less row into the newest versioned row for the same key.
|
|
118
|
+
const newestVersioned = new Map();
|
|
119
|
+
for (const [id, row] of merged) {
|
|
120
|
+
if (row.version === '')
|
|
121
|
+
continue;
|
|
122
|
+
const incumbentId = newestVersioned.get(row.key);
|
|
123
|
+
const incumbent = incumbentId === undefined ? undefined : merged.get(incumbentId);
|
|
124
|
+
if (incumbent === undefined || incumbent.updated_at < row.updated_at)
|
|
125
|
+
newestVersioned.set(row.key, id);
|
|
126
|
+
}
|
|
127
|
+
for (const [id, row] of merged) {
|
|
128
|
+
if (row.version !== '')
|
|
129
|
+
continue;
|
|
130
|
+
const winnerId = newestVersioned.get(row.key);
|
|
131
|
+
const winner = winnerId === undefined ? undefined : merged.get(winnerId);
|
|
132
|
+
if (winnerId === undefined || winner === undefined || winner.updated_at < row.updated_at)
|
|
133
|
+
continue;
|
|
134
|
+
// Fold the unresolved row into the versioned one, unioning `items` and `plugins`.
|
|
135
|
+
merged.set(winnerId, {
|
|
136
|
+
...winner,
|
|
137
|
+
items: [...new Set([...winner.items, ...row.items])].sort(),
|
|
138
|
+
plugins: [...new Set([...winner.plugins, ...row.plugins])].sort(),
|
|
139
|
+
});
|
|
140
|
+
merged.delete(id);
|
|
141
|
+
}
|
|
142
|
+
return [...merged.values()];
|
|
143
|
+
}
|
|
144
|
+
async function withStatusLock(lock, home, work) {
|
|
145
|
+
const handle = await lock.acquire(statusLockPath(home), {
|
|
146
|
+
timeoutMs: STATUS_LOCK_TIMEOUT_MS,
|
|
147
|
+
staleMs: STATUS_LOCK_STALE_MS,
|
|
148
|
+
});
|
|
149
|
+
try {
|
|
150
|
+
return await work();
|
|
151
|
+
}
|
|
152
|
+
finally {
|
|
153
|
+
handle.dispose();
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
/** Persist rows by read-modify-write under the status short lock; returns `ok`, `read-only` or `too-new`. */
|
|
157
|
+
export async function persistStatus(fs, lock, home, rows, logger) {
|
|
158
|
+
try {
|
|
159
|
+
return await withStatusLock(lock, home, async () => {
|
|
160
|
+
const existing = await readStatus(fs, home);
|
|
161
|
+
if (existing.kind === 'too-new')
|
|
162
|
+
return 'too-new';
|
|
163
|
+
const base = existing.kind === 'ok' ? existing.rows : [];
|
|
164
|
+
const merged = mergeRows(base, rows);
|
|
165
|
+
const file = { schemaVersion: STATUS_SCHEMA_VERSION, rows: merged };
|
|
166
|
+
await fs.atomicWrite(statusPath(home), new TextEncoder().encode(`${JSON.stringify(file, null, 2)}\n`));
|
|
167
|
+
return 'ok';
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
catch (error) {
|
|
171
|
+
logger.warn(`state: could not persist status.json read-only: ${reasonOf(error).message}`);
|
|
172
|
+
return 'read-only';
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
/** Read the declared registry, tolerating every failure as "empty". */
|
|
176
|
+
export async function readDeclared(fs, home) {
|
|
177
|
+
const path = declaredPath(home);
|
|
178
|
+
if (!(await exists(fs, path)))
|
|
179
|
+
return {};
|
|
180
|
+
const raw = decodeJson(await fs.readFile(path));
|
|
181
|
+
if (!isRecord(raw))
|
|
182
|
+
return {};
|
|
183
|
+
const file = {};
|
|
184
|
+
const now = Date.now();
|
|
185
|
+
for (const [key, value] of Object.entries(raw)) {
|
|
186
|
+
if (!Array.isArray(value))
|
|
187
|
+
continue;
|
|
188
|
+
const entries = [];
|
|
189
|
+
for (const entry of value) {
|
|
190
|
+
if (!isRecord(entry))
|
|
191
|
+
continue;
|
|
192
|
+
const plugin = str(entry['plugin']);
|
|
193
|
+
const pid = typeof entry['pid'] === 'number' ? entry['pid'] : undefined;
|
|
194
|
+
const at = typeof entry['at'] === 'number' ? entry['at'] : 0;
|
|
195
|
+
if (plugin === undefined || pid === undefined)
|
|
196
|
+
continue;
|
|
197
|
+
// Drop entries that are stale or whose pid is gone.
|
|
198
|
+
const stale = now - at > DECLARED_TTL_MS;
|
|
199
|
+
if (stale || !pidIsAlive(pid))
|
|
200
|
+
continue;
|
|
201
|
+
entries.push({ plugin, pid, at });
|
|
202
|
+
}
|
|
203
|
+
if (entries.length > 0)
|
|
204
|
+
file[key] = entries;
|
|
205
|
+
}
|
|
206
|
+
return file;
|
|
207
|
+
}
|
|
208
|
+
/** Append one declaration for `key`, merging with what is already on disk. */
|
|
209
|
+
export async function recordDeclared(fs, lock, home, key, plugin, logger) {
|
|
210
|
+
try {
|
|
211
|
+
await withStatusLock(lock, home, async () => {
|
|
212
|
+
const file = await readDeclared(fs, home);
|
|
213
|
+
const entries = file[key] ?? [];
|
|
214
|
+
if (!entries.some(entry => entry.plugin === plugin && entry.pid === process.pid)) {
|
|
215
|
+
entries.push({ plugin, pid: process.pid, at: Date.now() });
|
|
216
|
+
}
|
|
217
|
+
file[key] = entries;
|
|
218
|
+
await fs.atomicWrite(declaredPath(home), new TextEncoder().encode(`${JSON.stringify(file, null, 2)}\n`));
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
catch (error) {
|
|
222
|
+
logger.warn(`state: could not record the declaration for ${key}: ${reasonOf(error).message}`);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
//# sourceMappingURL=state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"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"}
|
package/dist/tar.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ProvisionFs } from './types.js';
|
|
2
|
+
/** Normalise an entry name to a destination-relative path; `undefined` to skip, throws on escape. */
|
|
3
|
+
export declare function safeEntryPath(name: string): string | undefined;
|
|
4
|
+
export interface ExtractOptions {
|
|
5
|
+
/** Drop this many leading path segments. */
|
|
6
|
+
readonly strip?: number;
|
|
7
|
+
}
|
|
8
|
+
/** Extract an in-memory `.tar.gz` into `destination` through the injected {@link ProvisionFs}. */
|
|
9
|
+
export declare function extractTarGz(archive: Uint8Array, destination: string, fs: ProvisionFs, options?: ExtractOptions): Promise<void>;
|
|
10
|
+
//# sourceMappingURL=tar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tar.d.ts","sourceRoot":"","sources":["../src/tar.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAyC7C,qGAAqG;AACrG,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAiB9D;AAoBD,MAAM,WAAW,cAAc;IAC7B,4CAA4C;IAC5C,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CACxB;AAED,kGAAkG;AAClG,wBAAsB,YAAY,CAChC,OAAO,EAAE,UAAU,EACnB,WAAW,EAAE,MAAM,EACnB,EAAE,EAAE,WAAW,EACf,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAyEf"}
|
package/dist/tar.js
ADDED
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A minimal zero-dependency `tar` reader (plus gzip) with path-traversal checks.
|
|
3
|
+
* @module tar
|
|
4
|
+
*/
|
|
5
|
+
import { dirname, join, posix } from 'node:path';
|
|
6
|
+
import { gunzipSync } from 'node:zlib';
|
|
7
|
+
import { ProvisionError } from './errors.js';
|
|
8
|
+
/** Hard cap for one decompressed archive. */
|
|
9
|
+
const MAX_UNPACKED_BYTES = 1024 * 1024 * 1024;
|
|
10
|
+
const BLOCK = 512;
|
|
11
|
+
/** Decode a NUL-terminated field. */
|
|
12
|
+
function readString(block, offset, length) {
|
|
13
|
+
const slice = block.subarray(offset, offset + length);
|
|
14
|
+
const end = slice.indexOf(0);
|
|
15
|
+
const bytes = end === -1 ? slice : slice.subarray(0, end);
|
|
16
|
+
return new TextDecoder().decode(bytes);
|
|
17
|
+
}
|
|
18
|
+
/** Octal field; empty fields are zero. */
|
|
19
|
+
function readOctal(block, offset, length, field) {
|
|
20
|
+
const raw = readString(block, offset, length).trim();
|
|
21
|
+
if (raw === '')
|
|
22
|
+
return 0;
|
|
23
|
+
const value = Number.parseInt(raw, 8);
|
|
24
|
+
if (Number.isNaN(value) || value < 0) {
|
|
25
|
+
throw new ProvisionError('extract/failed', `tar 头字段 ${field} 不是合法的八进制数:${JSON.stringify(raw)}`);
|
|
26
|
+
}
|
|
27
|
+
return value;
|
|
28
|
+
}
|
|
29
|
+
/** Sum of the header with the checksum field treated as spaces. */
|
|
30
|
+
function headerChecksumIsValid(block) {
|
|
31
|
+
const recorded = readOctal(block, 148, 8, 'chksum');
|
|
32
|
+
let sum = 0;
|
|
33
|
+
for (let index = 0; index < BLOCK; index += 1) {
|
|
34
|
+
sum += index >= 148 && index < 156 ? 32 : (block[index] ?? 0);
|
|
35
|
+
}
|
|
36
|
+
return sum === recorded;
|
|
37
|
+
}
|
|
38
|
+
function isZeroBlock(block) {
|
|
39
|
+
for (let index = 0; index < BLOCK; index += 1)
|
|
40
|
+
if (block[index] !== 0)
|
|
41
|
+
return false;
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
/** Normalise an entry name to a destination-relative path; `undefined` to skip, throws on escape. */
|
|
45
|
+
export function safeEntryPath(name) {
|
|
46
|
+
if (name === '' || name === '.' || name === './')
|
|
47
|
+
return undefined;
|
|
48
|
+
if (name.includes('\0')) {
|
|
49
|
+
throw new ProvisionError('archive/path-traversal', `归档条目名含 NUL:${JSON.stringify(name)}`);
|
|
50
|
+
}
|
|
51
|
+
if (name.startsWith('/') || /^[a-zA-Z]:[\\/]/.test(name)) {
|
|
52
|
+
throw new ProvisionError('archive/path-traversal', `归档条目是绝对路径:${name}`);
|
|
53
|
+
}
|
|
54
|
+
// Check the raw segments before normalisation.
|
|
55
|
+
const raw = name.replaceAll('\\', '/').split('/');
|
|
56
|
+
if (raw.some(part => part === '..')) {
|
|
57
|
+
throw new ProvisionError('archive/path-traversal', `归档条目试图跳出目标目录:${name}`);
|
|
58
|
+
}
|
|
59
|
+
const normalised = posix.normalize(name.replaceAll('\\', '/'));
|
|
60
|
+
const parts = normalised.split('/').filter(part => part !== '' && part !== '.');
|
|
61
|
+
if (parts.length === 0)
|
|
62
|
+
return undefined;
|
|
63
|
+
return parts.join('/');
|
|
64
|
+
}
|
|
65
|
+
/** Parse one pax extended header record set for `path`. */
|
|
66
|
+
function paxPath(data) {
|
|
67
|
+
const text = new TextDecoder().decode(data);
|
|
68
|
+
let cursor = 0;
|
|
69
|
+
let path;
|
|
70
|
+
while (cursor < text.length) {
|
|
71
|
+
const space = text.indexOf(' ', cursor);
|
|
72
|
+
if (space === -1)
|
|
73
|
+
break;
|
|
74
|
+
const length = Number.parseInt(text.slice(cursor, space), 10);
|
|
75
|
+
if (Number.isNaN(length) || length <= 0)
|
|
76
|
+
break;
|
|
77
|
+
const record = text.slice(space + 1, cursor + length).replace(/\n$/, '');
|
|
78
|
+
const equals = record.indexOf('=');
|
|
79
|
+
if (equals > 0 && record.slice(0, equals) === 'path')
|
|
80
|
+
path = record.slice(equals + 1);
|
|
81
|
+
cursor += length;
|
|
82
|
+
}
|
|
83
|
+
return path;
|
|
84
|
+
}
|
|
85
|
+
/** Extract an in-memory `.tar.gz` into `destination` through the injected {@link ProvisionFs}. */
|
|
86
|
+
export async function extractTarGz(archive, destination, fs, options = {}) {
|
|
87
|
+
let data;
|
|
88
|
+
try {
|
|
89
|
+
data = gunzipSync(archive, { maxOutputLength: MAX_UNPACKED_BYTES });
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
throw new ProvisionError('extract/failed', `gzip 解压失败:${error instanceof Error ? error.message : String(error)}`);
|
|
93
|
+
}
|
|
94
|
+
const strip = options.strip ?? 0;
|
|
95
|
+
await fs.mkdir(destination);
|
|
96
|
+
let offset = 0;
|
|
97
|
+
let pendingLongName;
|
|
98
|
+
let pendingPaxPath;
|
|
99
|
+
while (offset + BLOCK <= data.length) {
|
|
100
|
+
const header = data.subarray(offset, offset + BLOCK);
|
|
101
|
+
if (isZeroBlock(header)) {
|
|
102
|
+
offset += BLOCK;
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
if (!headerChecksumIsValid(header)) {
|
|
106
|
+
throw new ProvisionError('extract/failed', `tar 头校验和不匹配(偏移 ${offset})`);
|
|
107
|
+
}
|
|
108
|
+
const size = readOctal(header, 124, 12, 'size');
|
|
109
|
+
const type = String.fromCharCode(header[156] ?? 0);
|
|
110
|
+
const bodyStart = offset + BLOCK;
|
|
111
|
+
const body = data.subarray(bodyStart, bodyStart + size);
|
|
112
|
+
const next = bodyStart + Math.ceil(size / BLOCK) * BLOCK;
|
|
113
|
+
if (type === 'L') {
|
|
114
|
+
pendingLongName = readString(body, 0, body.length);
|
|
115
|
+
offset = next;
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
if (type === 'x') {
|
|
119
|
+
pendingPaxPath = paxPath(body) ?? pendingPaxPath;
|
|
120
|
+
offset = next;
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
if (type === 'g') {
|
|
124
|
+
offset = next;
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
const prefix = readString(header, 345, 155);
|
|
128
|
+
const rawName = pendingLongName ?? pendingPaxPath ?? (prefix === '' ? readString(header, 0, 100) : `${prefix}/${readString(header, 0, 100)}`);
|
|
129
|
+
pendingLongName = undefined;
|
|
130
|
+
pendingPaxPath = undefined;
|
|
131
|
+
const relative = safeEntryPath(rawName);
|
|
132
|
+
if (relative !== undefined) {
|
|
133
|
+
const stripped = stripSegments(relative, strip);
|
|
134
|
+
if (stripped !== undefined) {
|
|
135
|
+
const target = join(destination, ...stripped.split('/'));
|
|
136
|
+
const isDirectory = type === '5' || rawName.endsWith('/');
|
|
137
|
+
if (isDirectory) {
|
|
138
|
+
await fs.mkdir(target);
|
|
139
|
+
}
|
|
140
|
+
else if (type === '0' || type === '\0' || type === '') {
|
|
141
|
+
await fs.mkdir(dirname(target));
|
|
142
|
+
await fs.writeFile(target, body);
|
|
143
|
+
}
|
|
144
|
+
else if (type === '2') {
|
|
145
|
+
const link = readString(header, 157, 100);
|
|
146
|
+
assertLinkStaysInside(destination, dirname(target), link);
|
|
147
|
+
await fs.mkdir(dirname(target));
|
|
148
|
+
await fs.symlink(link, target);
|
|
149
|
+
}
|
|
150
|
+
else if (type === '1') {
|
|
151
|
+
throw new ProvisionError('extract/failed', `不支持 tar 硬链接条目:${rawName}`);
|
|
152
|
+
}
|
|
153
|
+
// Other typeflags (character devices, fifos, …) are ignored.
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
offset = next;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
function stripSegments(relative, strip) {
|
|
160
|
+
if (strip === 0)
|
|
161
|
+
return relative;
|
|
162
|
+
const parts = relative.split('/');
|
|
163
|
+
if (parts.length <= strip)
|
|
164
|
+
return undefined;
|
|
165
|
+
return parts.slice(strip).join('/');
|
|
166
|
+
}
|
|
167
|
+
/** A symlink may point anywhere inside the destination, never outside it. */
|
|
168
|
+
function assertLinkStaysInside(destination, fromDir, link) {
|
|
169
|
+
if (link.startsWith('/') || /^[a-zA-Z]:[\\/]/.test(link)) {
|
|
170
|
+
throw new ProvisionError('archive/path-traversal', `归档符号链接指向绝对路径:${link}`);
|
|
171
|
+
}
|
|
172
|
+
const base = posix.relative(destination, fromDir);
|
|
173
|
+
const resolved = posix.normalize(posix.join(base === '' ? '.' : base, link));
|
|
174
|
+
if (resolved === '..' || resolved.startsWith('../')) {
|
|
175
|
+
throw new ProvisionError('archive/path-traversal', `归档符号链接跳出目标目录:${link}`);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=tar.js.map
|
package/dist/tar.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tar.js","sourceRoot":"","sources":["../src/tar.ts"],"names":[],"mappings":"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"}
|