@indigoai-us/hq-cloud 5.16.0 → 5.18.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/.github/workflows/ci.yml +19 -0
- package/.github/workflows/publish.yml +53 -0
- package/dist/cli/share.d.ts +28 -0
- package/dist/cli/share.d.ts.map +1 -1
- package/dist/cli/share.js +227 -24
- package/dist/cli/share.js.map +1 -1
- package/dist/cli/share.test.js +414 -2
- package/dist/cli/share.test.js.map +1 -1
- package/dist/cli/sync.d.ts.map +1 -1
- package/dist/cli/sync.js +98 -17
- package/dist/cli/sync.js.map +1 -1
- package/dist/cli/sync.test.js +302 -0
- package/dist/cli/sync.test.js.map +1 -1
- package/dist/journal.d.ts +26 -0
- package/dist/journal.d.ts.map +1 -1
- package/dist/journal.js +31 -0
- package/dist/journal.js.map +1 -1
- package/dist/s3.d.ts +91 -0
- package/dist/s3.d.ts.map +1 -1
- package/dist/s3.js +245 -0
- package/dist/s3.js.map +1 -1
- package/dist/s3.test.js +347 -1
- package/dist/s3.test.js.map +1 -1
- package/package.json +1 -1
- package/src/cli/share.test.ts +510 -2
- package/src/cli/share.ts +305 -28
- package/src/cli/sync.test.ts +345 -0
- package/src/cli/sync.ts +133 -24
- package/src/journal.ts +33 -0
- package/src/s3.test.ts +415 -1
- package/src/s3.ts +271 -0
- package/tsconfig.json +12 -1
package/dist/s3.test.js
CHANGED
|
@@ -16,6 +16,15 @@ const sentCommands = [];
|
|
|
16
16
|
// `listRemoteFiles` push the Contents shape they want returned; the default
|
|
17
17
|
// is an empty bucket. Reset in beforeEach so cross-test leakage is impossible.
|
|
18
18
|
let nextListObjectsResponse = { Contents: [] };
|
|
19
|
+
// Per-test override for the GetObjectCommand response. The default fake
|
|
20
|
+
// doesn't model GET (downloadFile previously had no s3.test.ts coverage);
|
|
21
|
+
// downloadFile tests push the Body + Metadata shape they want returned.
|
|
22
|
+
let nextGetObjectResponse = {
|
|
23
|
+
Body: (async function* () {
|
|
24
|
+
yield new Uint8Array();
|
|
25
|
+
})(),
|
|
26
|
+
Metadata: {},
|
|
27
|
+
};
|
|
19
28
|
vi.mock("@aws-sdk/client-s3", () => {
|
|
20
29
|
class FakeS3Client {
|
|
21
30
|
async send(command) {
|
|
@@ -31,6 +40,9 @@ vi.mock("@aws-sdk/client-s3", () => {
|
|
|
31
40
|
if (command.constructor.name === "ListObjectsV2Command") {
|
|
32
41
|
return nextListObjectsResponse;
|
|
33
42
|
}
|
|
43
|
+
if (command.constructor.name === "GetObjectCommand") {
|
|
44
|
+
return nextGetObjectResponse;
|
|
45
|
+
}
|
|
34
46
|
return {};
|
|
35
47
|
}
|
|
36
48
|
}
|
|
@@ -76,7 +88,7 @@ vi.mock("@aws-sdk/client-s3", () => {
|
|
|
76
88
|
DeleteObjectCommand,
|
|
77
89
|
};
|
|
78
90
|
});
|
|
79
|
-
import { uploadFile, listRemoteFiles } from "./s3.js";
|
|
91
|
+
import { uploadFile, uploadSymlink, downloadFile, listRemoteFiles, SYMLINK_BODY_PREFIX, SYMLINK_MARKER_META_VALUE, encodeSymlinkMetadataValue, decodeSymlinkMetadataValue, } from "./s3.js";
|
|
80
92
|
function makeCtx() {
|
|
81
93
|
return {
|
|
82
94
|
uid: "cmp_TEST",
|
|
@@ -204,5 +216,339 @@ describe("listRemoteFiles", () => {
|
|
|
204
216
|
expect(files).toHaveLength(1);
|
|
205
217
|
expect(files[0].key).toBe("real.md");
|
|
206
218
|
});
|
|
219
|
+
// Regression: pre-fix, the 0-byte-guard relaxation (`if (!obj.Key) continue;`
|
|
220
|
+
// replacing `if (!obj.Key || !obj.Size) continue;`) was correct for
|
|
221
|
+
// legitimate placeholder files like `.gitkeep` but accidentally also let
|
|
222
|
+
// S3 directory-marker objects (0-byte, key ends in `/`) through to the
|
|
223
|
+
// planner. Two downstream sites blow up on those:
|
|
224
|
+
// 1. pull planner (cli/sync.ts `computePullPlan`): for any marker whose
|
|
225
|
+
// `path.join(root, key)` resolves to an existing local directory,
|
|
226
|
+
// `localExists=true` → `hashFile(localPath)` → `readFileSync` on dir
|
|
227
|
+
// → EISDIR "read". The runner reported this for `personal:(company)`.
|
|
228
|
+
// 2. download path (s3.ts `downloadFile`): for any marker whose local
|
|
229
|
+
// path doesn't exist, the planner classifies it `download`;
|
|
230
|
+
// `mkdirSync(path.dirname(localPath), recursive)` strips the trailing
|
|
231
|
+
// slash and creates the leaf as a directory, then `writeFileSync`
|
|
232
|
+
// on the trailing-slash path → EISDIR "open". The runner reported
|
|
233
|
+
// this for `indigo:lambda/`.
|
|
234
|
+
// The fix drops the *definitional* marker shape (trailing-slash AND
|
|
235
|
+
// size 0) at this site so neither path ever sees them. Real 0-byte
|
|
236
|
+
// placeholders (`.gitkeep`) never end in `/` and continue to flow
|
|
237
|
+
// through — covered by the test immediately above.
|
|
238
|
+
it("drops S3 directory-marker keys (trailing '/', size 0) from list results", async () => {
|
|
239
|
+
nextListObjectsResponse = {
|
|
240
|
+
Contents: [
|
|
241
|
+
{ Key: "real.md", Size: 42, LastModified: new Date(), ETag: '"e1"' },
|
|
242
|
+
{ Key: "projects/.gitkeep", Size: 0, LastModified: new Date(), ETag: '"e2"' },
|
|
243
|
+
{ Key: "lambda/", Size: 0, LastModified: new Date(), ETag: '"e3"' },
|
|
244
|
+
{ Key: "core/", Size: 0, LastModified: new Date(), ETag: '"e4"' },
|
|
245
|
+
{ Key: "deeply/nested/marker/", Size: 0, LastModified: new Date(), ETag: '"e5"' },
|
|
246
|
+
],
|
|
247
|
+
};
|
|
248
|
+
const files = await listRemoteFiles(makeCtx());
|
|
249
|
+
// Real files (including the 0-byte .gitkeep placeholder) pass through;
|
|
250
|
+
// every 0-byte trailing-slash marker is dropped.
|
|
251
|
+
expect(files.map((f) => f.key).sort()).toEqual([
|
|
252
|
+
"projects/.gitkeep",
|
|
253
|
+
"real.md",
|
|
254
|
+
]);
|
|
255
|
+
});
|
|
256
|
+
// Codex P2 follow-up: the marker filter must be definitionally
|
|
257
|
+
// constrained to size-0 trailing-slash keys. A hypothetical non-empty
|
|
258
|
+
// object whose key ends in `/` (no hq-cloud code path creates one,
|
|
259
|
+
// but `ListObjectsV2` returns whatever lives in the bucket) must
|
|
260
|
+
// NOT be silently hidden — that would mask real bucket state from
|
|
261
|
+
// the operator. Such an object will still surface EISDIR "open" at
|
|
262
|
+
// downloadFile when the local path is materialized, which is the
|
|
263
|
+
// signal needed to reconcile.
|
|
264
|
+
it("does NOT drop non-empty trailing-slash keys (preserves operator visibility)", async () => {
|
|
265
|
+
nextListObjectsResponse = {
|
|
266
|
+
Contents: [
|
|
267
|
+
{ Key: "real.md", Size: 42, LastModified: new Date(), ETag: '"e1"' },
|
|
268
|
+
// 0-byte marker — filtered.
|
|
269
|
+
{ Key: "marker/", Size: 0, LastModified: new Date(), ETag: '"e2"' },
|
|
270
|
+
// Non-zero, trailing slash — pathological but unfiltered so it
|
|
271
|
+
// stays visible. (Cannot be materialized locally; downloadFile
|
|
272
|
+
// will raise an explicit error pointing at this exact key.)
|
|
273
|
+
{ Key: "exports/report/", Size: 1024, LastModified: new Date(), ETag: '"e3"' },
|
|
274
|
+
],
|
|
275
|
+
};
|
|
276
|
+
const files = await listRemoteFiles(makeCtx());
|
|
277
|
+
expect(files.map((f) => f.key).sort()).toEqual([
|
|
278
|
+
"exports/report/",
|
|
279
|
+
"real.md",
|
|
280
|
+
]);
|
|
281
|
+
// Spot-check that the non-empty marker carried its real size.
|
|
282
|
+
expect(files.find((f) => f.key === "exports/report/").size).toBe(1024);
|
|
283
|
+
});
|
|
284
|
+
});
|
|
285
|
+
describe("uploadSymlink", () => {
|
|
286
|
+
beforeEach(() => {
|
|
287
|
+
sentCommands.length = 0;
|
|
288
|
+
});
|
|
289
|
+
it("PUTs the prefixed target as the body bytes and a marker-only metadata flag", async () => {
|
|
290
|
+
// Body = SYMLINK_BODY_PREFIX + target is the source of truth for
|
|
291
|
+
// the target string and is load-bearing for two distinct
|
|
292
|
+
// drift-detection properties:
|
|
293
|
+
// 1. S3 ETag = MD5(body) varies with target → cross-machine
|
|
294
|
+
// target-change propagation works through LIST etags.
|
|
295
|
+
// 2. The prefix means a symlink to "bar.md" doesn't share an
|
|
296
|
+
// ETag with a regular file containing "bar.md" → symlink ↔
|
|
297
|
+
// regular-file transitions on the same key are visible to
|
|
298
|
+
// peers via LIST.
|
|
299
|
+
// The metadata is now a fixed marker only — we used to store the
|
|
300
|
+
// base64'd target there, but S3's 2 KiB header limit made that
|
|
301
|
+
// brittle for long POSIX targets. Marker-only is bounded.
|
|
302
|
+
const target = "../real-target.md";
|
|
303
|
+
await uploadSymlink(makeCtx(), target, "policies/link.md");
|
|
304
|
+
const put = sentCommands.find((c) => c.name === "PutObjectCommand");
|
|
305
|
+
expect(put).toBeDefined();
|
|
306
|
+
const meta = put.input.Metadata;
|
|
307
|
+
expect(meta["hq-symlink-target"]).toBe(SYMLINK_MARKER_META_VALUE);
|
|
308
|
+
expect(put.input.Body).toBeDefined();
|
|
309
|
+
const body = put.input.Body;
|
|
310
|
+
expect(Buffer.from(body).toString("utf-8")).toBe(SYMLINK_BODY_PREFIX + target);
|
|
311
|
+
expect(put.input.Key).toBe("policies/link.md");
|
|
312
|
+
});
|
|
313
|
+
it("handles arbitrary Unicode targets via the body (metadata stays marker-only)", async () => {
|
|
314
|
+
// Codex round-9 P2 follow-up: S3 user-metadata is HTTP-header-
|
|
315
|
+
// bound. A POSIX symlink target can include any Unicode bytes;
|
|
316
|
+
// storing the target in metadata risked PutObject rejecting it.
|
|
317
|
+
// Now the body carries the target — UTF-8 bytes pass through
|
|
318
|
+
// S3 object content unmolested, no ASCII restriction, no header
|
|
319
|
+
// limit. Metadata stays as the constant marker.
|
|
320
|
+
sentCommands.length = 0;
|
|
321
|
+
const unicodeTarget = "café/🌳/Übung.md";
|
|
322
|
+
await uploadSymlink(makeCtx(), unicodeTarget, "weird-link.md");
|
|
323
|
+
const put = sentCommands.find((c) => c.name === "PutObjectCommand");
|
|
324
|
+
expect(put).toBeDefined();
|
|
325
|
+
const meta = put.input.Metadata;
|
|
326
|
+
expect(meta["hq-symlink-target"]).toBe(SYMLINK_MARKER_META_VALUE);
|
|
327
|
+
const body = Buffer.from(put.input.Body).toString("utf-8");
|
|
328
|
+
expect(body).toBe(SYMLINK_BODY_PREFIX + unicodeTarget);
|
|
329
|
+
});
|
|
330
|
+
it("handles long targets without exceeding S3's 2 KiB user-metadata limit", async () => {
|
|
331
|
+
// Codex round-13 P2 follow-up: pre-fix, the metadata value was
|
|
332
|
+
// base64(target) plus author fields plus the metadata key name.
|
|
333
|
+
// A target around 1.5 KiB after base64 inflation could push the
|
|
334
|
+
// total over S3's 2 KiB user-metadata cap and PutObject would
|
|
335
|
+
// reject the upload. With marker-only metadata, the target's
|
|
336
|
+
// size only contributes to the body — bounded by S3's 5 GB
|
|
337
|
+
// object size, not the header limit. Verify a 4 KiB target (well
|
|
338
|
+
// beyond the old breaking point) round-trips cleanly.
|
|
339
|
+
sentCommands.length = 0;
|
|
340
|
+
const longTarget = "deeply/nested/" + "x".repeat(4096);
|
|
341
|
+
await uploadSymlink(makeCtx(), longTarget, "long-link.md");
|
|
342
|
+
const put = sentCommands.find((c) => c.name === "PutObjectCommand");
|
|
343
|
+
const meta = put.input.Metadata;
|
|
344
|
+
expect(meta["hq-symlink-target"]).toBe(SYMLINK_MARKER_META_VALUE);
|
|
345
|
+
const body = Buffer.from(put.input.Body).toString("utf-8");
|
|
346
|
+
expect(body).toBe(SYMLINK_BODY_PREFIX + longTarget);
|
|
347
|
+
// Sanity: marker fits in the header limit by an enormous margin
|
|
348
|
+
// (1 byte vs 2048).
|
|
349
|
+
expect(meta["hq-symlink-target"].length).toBeLessThan(10);
|
|
350
|
+
});
|
|
351
|
+
it("encodeSymlinkMetadataValue / decodeSymlinkMetadataValue round-trip arbitrary UTF-8", async () => {
|
|
352
|
+
// Direct property test of the helpers — covers the legacy-fallback
|
|
353
|
+
// path via the round-trip check inside decodeSymlinkMetadataValue.
|
|
354
|
+
for (const sample of [
|
|
355
|
+
"",
|
|
356
|
+
"real.md",
|
|
357
|
+
"../sibling/file.md",
|
|
358
|
+
"café/🌳/Übung.md",
|
|
359
|
+
"/absolute/path/with spaces.md",
|
|
360
|
+
"deeply/nested/path/" + "x".repeat(200),
|
|
361
|
+
]) {
|
|
362
|
+
expect(decodeSymlinkMetadataValue(encodeSymlinkMetadataValue(sample))).toBe(sample);
|
|
363
|
+
}
|
|
364
|
+
// Legacy-fallback: a value that isn't valid base64 of UTF-8 (e.g.
|
|
365
|
+
// a raw target written by a pre-PR uploader) round-trips as-is.
|
|
366
|
+
// "real.md" happens to NOT be valid base64 (length not multiple
|
|
367
|
+
// of 4), so the decoder falls through to returning it raw.
|
|
368
|
+
expect(decodeSymlinkMetadataValue("real.md")).toBe("real.md");
|
|
369
|
+
});
|
|
370
|
+
it("produces a different body (and therefore a different S3 ETag) when target changes", async () => {
|
|
371
|
+
// Direct regression for the cross-machine target-propagation bug:
|
|
372
|
+
// two uploads with different targets must produce different bodies
|
|
373
|
+
// so S3-side etag comparison can detect the change. We assert on
|
|
374
|
+
// the body bytes rather than asking S3 for an ETag (the fake
|
|
375
|
+
// returns a constant ETag) — equality of body bytes is a necessary
|
|
376
|
+
// and sufficient property for ETag equality on PutObject.
|
|
377
|
+
sentCommands.length = 0;
|
|
378
|
+
await uploadSymlink(makeCtx(), "old-target.md", "policies/link.md");
|
|
379
|
+
await uploadSymlink(makeCtx(), "new-target.md", "policies/link.md");
|
|
380
|
+
const puts = sentCommands.filter((c) => c.name === "PutObjectCommand");
|
|
381
|
+
expect(puts).toHaveLength(2);
|
|
382
|
+
const bodies = puts.map((p) => Buffer.from(p.input.Body).toString("utf-8"));
|
|
383
|
+
expect(bodies[0]).not.toBe(bodies[1]);
|
|
384
|
+
expect(bodies[0]).toBe(SYMLINK_BODY_PREFIX + "old-target.md");
|
|
385
|
+
expect(bodies[1]).toBe(SYMLINK_BODY_PREFIX + "new-target.md");
|
|
386
|
+
});
|
|
387
|
+
it("produces a different body from a regular file containing the same target string (ETag distinguishability)", async () => {
|
|
388
|
+
// Codex round-4 P2 follow-up: pre-fix, a symlink whose target
|
|
389
|
+
// string equaled some regular file's exact contents produced an
|
|
390
|
+
// identical S3 ETag (since ETag = MD5(body) and bodies were equal).
|
|
391
|
+
// The LIST-based pull planner can't see per-object metadata, so
|
|
392
|
+
// it would classify a symlink ↔ regular-file transition on the
|
|
393
|
+
// same key as "no change" and never replace the local
|
|
394
|
+
// representation. The SYMLINK_BODY_PREFIX makes the bodies
|
|
395
|
+
// distinguishable for any realistic regular-file content.
|
|
396
|
+
sentCommands.length = 0;
|
|
397
|
+
const sharedString = "real.md";
|
|
398
|
+
// Make a regular file whose contents are exactly the target string
|
|
399
|
+
// — the worst-case collision shape pre-prefix.
|
|
400
|
+
const localFile = path.join(os.tmpdir(), `etag-distinguishability-${Date.now()}-${Math.random()}.md`);
|
|
401
|
+
fs.writeFileSync(localFile, sharedString);
|
|
402
|
+
await uploadSymlink(makeCtx(), sharedString, "case-key.md");
|
|
403
|
+
await uploadFile(makeCtx(), localFile, "regular-key.md");
|
|
404
|
+
fs.rmSync(localFile, { force: true });
|
|
405
|
+
const puts = sentCommands.filter((c) => c.name === "PutObjectCommand");
|
|
406
|
+
expect(puts).toHaveLength(2);
|
|
407
|
+
const symlinkBody = Buffer.from(puts[0].input.Body).toString("utf-8");
|
|
408
|
+
const regularBody = Buffer.from(puts[1].input.Body).toString("utf-8");
|
|
409
|
+
// The point of the prefix: symlink record body ≠ regular file body
|
|
410
|
+
// even when they describe the same string. Different bytes ⇒
|
|
411
|
+
// different MD5 ⇒ different S3 ETag ⇒ pull planner detects the
|
|
412
|
+
// transition via LIST without needing a per-object HEAD.
|
|
413
|
+
expect(symlinkBody).not.toBe(regularBody);
|
|
414
|
+
expect(regularBody).toBe(sharedString);
|
|
415
|
+
expect(symlinkBody).toBe(SYMLINK_BODY_PREFIX + sharedString);
|
|
416
|
+
});
|
|
417
|
+
it("forwards UploadAuthor alongside the symlink-target metadata", async () => {
|
|
418
|
+
await uploadSymlink(makeCtx(), "real.md", "policies/link.md", {
|
|
419
|
+
userSub: "abc-123",
|
|
420
|
+
email: "alice@example.com",
|
|
421
|
+
});
|
|
422
|
+
const put = sentCommands.find((c) => c.name === "PutObjectCommand");
|
|
423
|
+
const meta = put.input.Metadata;
|
|
424
|
+
// Marker-only metadata; target lives in the body.
|
|
425
|
+
expect(meta["hq-symlink-target"]).toBe(SYMLINK_MARKER_META_VALUE);
|
|
426
|
+
const body = Buffer.from(put.input.Body).toString("utf-8");
|
|
427
|
+
expect(body).toBe(SYMLINK_BODY_PREFIX + "real.md");
|
|
428
|
+
expect(meta["created-by"]).toBe("alice@example.com");
|
|
429
|
+
expect(meta["created-by-sub"]).toBe("abc-123");
|
|
430
|
+
});
|
|
431
|
+
});
|
|
432
|
+
describe("downloadFile", () => {
|
|
433
|
+
let tmpRoot;
|
|
434
|
+
beforeEach(() => {
|
|
435
|
+
sentCommands.length = 0;
|
|
436
|
+
tmpRoot = fs.mkdtempSync(path.join(os.tmpdir(), "s3-download-test-"));
|
|
437
|
+
});
|
|
438
|
+
it("materializes a symlink record as a real symlink, sourcing the target from the body", async () => {
|
|
439
|
+
// Round-13 contract: metadata is just a marker; the body
|
|
440
|
+
// (after stripping SYMLINK_BODY_PREFIX) is the source of truth
|
|
441
|
+
// for the target string. downloadFile must consume the body
|
|
442
|
+
// and use the post-prefix slice as the link target.
|
|
443
|
+
const target = "../real-target.md";
|
|
444
|
+
nextGetObjectResponse = {
|
|
445
|
+
Body: (async function* () {
|
|
446
|
+
yield new TextEncoder().encode(SYMLINK_BODY_PREFIX + target);
|
|
447
|
+
})(),
|
|
448
|
+
Metadata: { "hq-symlink-target": SYMLINK_MARKER_META_VALUE },
|
|
449
|
+
};
|
|
450
|
+
const localPath = path.join(tmpRoot, "policies", "link.md");
|
|
451
|
+
await downloadFile(makeCtx(), "policies/link.md", localPath);
|
|
452
|
+
const lstat = fs.lstatSync(localPath);
|
|
453
|
+
expect(lstat.isSymbolicLink()).toBe(true);
|
|
454
|
+
expect(fs.readlinkSync(localPath)).toBe(target);
|
|
455
|
+
});
|
|
456
|
+
it("recovers the target from legacy metadata-only uploads (body lacks the prefix)", async () => {
|
|
457
|
+
// Backward-compat: an in-flight upload from earlier in this
|
|
458
|
+
// PR's lifetime stored the target in metadata (raw or base64'd)
|
|
459
|
+
// rather than in the body. downloadFile must fall back to
|
|
460
|
+
// decoding the metadata value when the body doesn't start with
|
|
461
|
+
// SYMLINK_BODY_PREFIX. Tested with a base64'd metadata value
|
|
462
|
+
// and an empty body — the round-trip-validating decoder
|
|
463
|
+
// should recover the original target.
|
|
464
|
+
const target = "legacy/target.md";
|
|
465
|
+
const legacyMetadata = encodeSymlinkMetadataValue(target);
|
|
466
|
+
nextGetObjectResponse = {
|
|
467
|
+
Body: (async function* () {
|
|
468
|
+
yield new Uint8Array(); // empty body, like a v1-of-this-PR upload
|
|
469
|
+
})(),
|
|
470
|
+
Metadata: { "hq-symlink-target": legacyMetadata },
|
|
471
|
+
};
|
|
472
|
+
const localPath = path.join(tmpRoot, "legacy-link.md");
|
|
473
|
+
await downloadFile(makeCtx(), "legacy-link.md", localPath);
|
|
474
|
+
expect(fs.lstatSync(localPath).isSymbolicLink()).toBe(true);
|
|
475
|
+
expect(fs.readlinkSync(localPath)).toBe(target);
|
|
476
|
+
});
|
|
477
|
+
it("recovers a target longer than the legacy 2 KiB metadata limit from the body", async () => {
|
|
478
|
+
// Codex round-13 P2 motivating case: targets between ~1.5 KiB
|
|
479
|
+
// (after base64 inflation) and ~5 GiB (S3 object cap) used to
|
|
480
|
+
// fail PutObject under the metadata-based design but now
|
|
481
|
+
// round-trip cleanly through the body. We pick 600 chars: well
|
|
482
|
+
// past the old metadata-only break point (~1500 base64 bytes ≈
|
|
483
|
+
// ~1100 raw, plus header overhead crosses 2 KiB), and well
|
|
484
|
+
// under any sane filesystem's PATH_MAX symlink-target limit
|
|
485
|
+
// (Linux: 4096, macOS: 1024) so the test creates a real link.
|
|
486
|
+
const longTarget = "deeply/nested/path/" + "x".repeat(600);
|
|
487
|
+
nextGetObjectResponse = {
|
|
488
|
+
Body: (async function* () {
|
|
489
|
+
yield new TextEncoder().encode(SYMLINK_BODY_PREFIX + longTarget);
|
|
490
|
+
})(),
|
|
491
|
+
Metadata: { "hq-symlink-target": SYMLINK_MARKER_META_VALUE },
|
|
492
|
+
};
|
|
493
|
+
const localPath = path.join(tmpRoot, "long-link.md");
|
|
494
|
+
await downloadFile(makeCtx(), "long-link.md", localPath);
|
|
495
|
+
expect(fs.lstatSync(localPath).isSymbolicLink()).toBe(true);
|
|
496
|
+
expect(fs.readlinkSync(localPath)).toBe(longTarget);
|
|
497
|
+
});
|
|
498
|
+
it("falls back to writing a regular file when hq-symlink-target metadata is absent", async () => {
|
|
499
|
+
nextGetObjectResponse = {
|
|
500
|
+
Body: (async function* () {
|
|
501
|
+
yield new Uint8Array([104, 105]); // "hi"
|
|
502
|
+
})(),
|
|
503
|
+
Metadata: {},
|
|
504
|
+
};
|
|
505
|
+
const localPath = path.join(tmpRoot, "regular.md");
|
|
506
|
+
await downloadFile(makeCtx(), "regular.md", localPath);
|
|
507
|
+
const lstat = fs.lstatSync(localPath);
|
|
508
|
+
expect(lstat.isSymbolicLink()).toBe(false);
|
|
509
|
+
expect(fs.readFileSync(localPath, "utf-8")).toBe("hi");
|
|
510
|
+
});
|
|
511
|
+
it("replaces a stale local symlink with a regular file when remote transitions symlink → regular", async () => {
|
|
512
|
+
// Codex P2 follow-up: pre-fix, the regular-file branch went
|
|
513
|
+
// straight to writeFileSync. If localPath was a stale symlink from
|
|
514
|
+
// a prior sync (when this key was a symlink in cloud), writeFileSync
|
|
515
|
+
// would FOLLOW the link and overwrite the link's target file
|
|
516
|
+
// contents — leaving the link in place and the new "regular file at
|
|
517
|
+
// localPath" never materializing. The fix: lstat before write; if
|
|
518
|
+
// the existing entry is a symlink, unlink it first.
|
|
519
|
+
const localPath = path.join(tmpRoot, "transitioned.md");
|
|
520
|
+
const targetFile = path.join(tmpRoot, "stale-target.md");
|
|
521
|
+
fs.writeFileSync(targetFile, "do-not-clobber-me");
|
|
522
|
+
fs.symlinkSync(targetFile, localPath);
|
|
523
|
+
nextGetObjectResponse = {
|
|
524
|
+
Body: (async function* () {
|
|
525
|
+
yield new Uint8Array([110, 101, 119]); // "new"
|
|
526
|
+
})(),
|
|
527
|
+
Metadata: {}, // no symlink metadata → regular file path
|
|
528
|
+
};
|
|
529
|
+
await downloadFile(makeCtx(), "transitioned.md", localPath);
|
|
530
|
+
// localPath is now a regular file with the new content...
|
|
531
|
+
expect(fs.lstatSync(localPath).isSymbolicLink()).toBe(false);
|
|
532
|
+
expect(fs.readFileSync(localPath, "utf-8")).toBe("new");
|
|
533
|
+
// ...and the link's former target was NOT clobbered.
|
|
534
|
+
expect(fs.readFileSync(targetFile, "utf-8")).toBe("do-not-clobber-me");
|
|
535
|
+
});
|
|
536
|
+
it("replaces an existing entry when the link is rewritten (target change)", async () => {
|
|
537
|
+
// Pre-existing regular file at the target location must not block
|
|
538
|
+
// creation of a symlink — fs.symlinkSync would EEXIST otherwise.
|
|
539
|
+
// Same applies to a stale symlink whose target has changed: the new
|
|
540
|
+
// target string must win.
|
|
541
|
+
const localPath = path.join(tmpRoot, "rewrite.md");
|
|
542
|
+
fs.writeFileSync(localPath, "stale regular file");
|
|
543
|
+
nextGetObjectResponse = {
|
|
544
|
+
Body: (async function* () {
|
|
545
|
+
yield new Uint8Array();
|
|
546
|
+
})(),
|
|
547
|
+
Metadata: { "hq-symlink-target": "fresh-target.md" },
|
|
548
|
+
};
|
|
549
|
+
await downloadFile(makeCtx(), "rewrite.md", localPath);
|
|
550
|
+
expect(fs.lstatSync(localPath).isSymbolicLink()).toBe(true);
|
|
551
|
+
expect(fs.readlinkSync(localPath)).toBe("fresh-target.md");
|
|
552
|
+
});
|
|
207
553
|
});
|
|
208
554
|
//# sourceMappingURL=s3.test.js.map
|
package/dist/s3.test.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"s3.test.js","sourceRoot":"","sources":["../src/s3.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"s3.test.js","sourceRoot":"","sources":["../src/s3.test.ts"],"names":[],"mappings":"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"}
|