@camstack/addon-remote-storage 1.2.44 → 1.2.45

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/dist/s3.addon.js CHANGED
@@ -2,7 +2,7 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_shared = require("./shared-CzYVi403.js");
5
+ const require_shared = require("./shared-BHqbklNT.js");
6
6
  let node_stream = require("node:stream");
7
7
  let _aws_sdk_client_s3 = require("@aws-sdk/client-s3");
8
8
  let _aws_sdk_lib_storage = require("@aws-sdk/lib-storage");
package/dist/s3.addon.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { c as BaseAddon, i as rearmIdleAbort, n as getOptionalBasePath, o as scheduleIdleAbort, s as storageProviderCapability, t as createSessionId } from "./shared-DsnRUNmJ.mjs";
1
+ import { c as BaseAddon, i as rearmIdleAbort, n as getOptionalBasePath, o as scheduleIdleAbort, s as storageProviderCapability, t as createSessionId } from "./shared-CSwUP1hZ.mjs";
2
2
  import { PassThrough } from "node:stream";
3
3
  import { DeleteObjectCommand, GetObjectCommand, HeadBucketCommand, HeadObjectCommand, ListObjectsV2Command, PutObjectCommand, S3Client } from "@aws-sdk/client-s3";
4
4
  import { Upload } from "@aws-sdk/lib-storage";
@@ -2,7 +2,7 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_shared = require("./shared-CzYVi403.js");
5
+ const require_shared = require("./shared-BHqbklNT.js");
6
6
  let ssh2 = require("ssh2");
7
7
  let node_path = require("node:path");
8
8
  node_path = require_shared.__toESM(node_path);
@@ -1,4 +1,4 @@
1
- import { a as safeJoinRemotePath, c as BaseAddon, i as rearmIdleAbort, o as scheduleIdleAbort, r as getRequiredBasePath, s as storageProviderCapability, t as createSessionId } from "./shared-DsnRUNmJ.mjs";
1
+ import { a as safeJoinRemotePath, c as BaseAddon, i as rearmIdleAbort, o as scheduleIdleAbort, r as getRequiredBasePath, s as storageProviderCapability, t as createSessionId } from "./shared-CSwUP1hZ.mjs";
2
2
  import { Client } from "ssh2";
3
3
  import * as path from "node:path";
4
4
  //#region src/providers/sftp/sftp-config-schema.ts
@@ -8011,6 +8011,21 @@ var RelocateJobSchema = object({
8011
8011
  bytesMoved: number().int(),
8012
8012
  /** Total files discovered up front; null while (or when) unknown. */
8013
8013
  filesTotal: number().int().nullable(),
8014
+ /**
8015
+ * Rows this run CORRECTED while moving them — a durable mutation the move
8016
+ * made that nobody asked for, so it is reported where the operator reads the
8017
+ * job rather than only in a log line.
8018
+ *
8019
+ * A footage segment records its byte count in its own NAME, and the durable
8020
+ * hour row derives its aggregates from those names. A file that does not
8021
+ * match its name therefore makes the ledger's sums — and with them quota and
8022
+ * pressure eviction — wrong by the difference, and only a rename can fix it.
8023
+ * On 2026-08-30 one such row also stalled a 110 749-file drain permanently.
8024
+ *
8025
+ * Absent on lanes where the question has no meaning: a media blob's size is
8026
+ * in its row, not in its name, so `MediaRelocateEngine` never reconciles one.
8027
+ */
8028
+ rowsReconciled: number().int().nonnegative().optional(),
8014
8029
  startedAt: number(),
8015
8030
  finishedAt: number().nullable(),
8016
8031
  error: string().nullable()
@@ -8079,14 +8094,42 @@ var RelocateMediaInputSchema = object({
8079
8094
  /** Omitted = `move`, the pre-existing behaviour. */
8080
8095
  mode: MediaRelocateModeSchema.optional()
8081
8096
  });
8082
- /** How many rows still carry NO `locationId` — the population a repoint would
8083
- * silently re-aim at a disk that does not hold their bytes. Zero is the only
8084
- * value that permits a non-blocking `eventMedia` cutover. */
8085
- var UnstampedEventMediaCountSchema = object({
8086
- media: number().int().nonnegative(),
8087
- retrainFrames: number().int().nonnegative(),
8088
- total: number().int().nonnegative()
8097
+ /**
8098
+ * The unstamped population of ONE collection split, because the gate and the
8099
+ * operator ask two different questions and only one of them has to be cheap.
8100
+ *
8101
+ * `present` is the GATE: "is there at least one row that would be orphaned by a
8102
+ * repoint". It is a single indexed seek to the first matching row, so it stays
8103
+ * answerable on a saturated disk and answers in O(log n) precisely in the state
8104
+ * that matters — after a seal, when the population is empty.
8105
+ *
8106
+ * `rows` is the NUMBER, for the refusal message and the operator's sense of
8107
+ * scale. It is a second, indexed `COUNT(*)`, and `null` means **not
8108
+ * measurable** — never zero. `{ present: true, rows: null }` is a legitimate
8109
+ * and useful answer: "there are some, and this read could not say how many"
8110
+ * still refuses the cutover, which is the whole job.
8111
+ */
8112
+ var UnstampedRowsSchema = object({
8113
+ present: boolean(),
8114
+ rows: number().int().nonnegative().nullable()
8089
8115
  });
8116
+ /**
8117
+ * How many rows still carry NO `locationId` — the population a repoint would
8118
+ * silently re-aim at a disk that does not hold their bytes.
8119
+ *
8120
+ * **`null` = the count could not be taken**, and it is NOT permission to cut
8121
+ * over. The gate opens on a measured absence and on nothing else; an unread
8122
+ * collection and an empty one are different facts, and this repo has already
8123
+ * paid for conflating them (`RelocateResidueSchema`, D295).
8124
+ */
8125
+ var UnstampedEventMediaCountSchema = object({
8126
+ media: UnstampedRowsSchema,
8127
+ retrainFrames: UnstampedRowsSchema,
8128
+ /** True when EITHER collection holds one. The refusal reads this. */
8129
+ anyPresent: boolean(),
8130
+ /** Sum across both, or `null` when either lane could not be counted. */
8131
+ total: number().int().nonnegative().nullable()
8132
+ }).nullable();
8090
8133
  var StorageMigrationMediaMoveInputSchema = RelocateMediaInputSchema.extend({ leaseId: string().min(1) });
8091
8134
  /** The independently selectable logical storage classes — every class
8092
8135
  * `storage.listLocationDeclarations` reports, so an operator never meets a
@@ -8197,6 +8240,10 @@ var StorageMigrationMoveProgressSchema = object({
8197
8240
  /** The archive census — the **M** of "N of M" (D295). `null` = unknowable. */
8198
8241
  filesTotal: number().int().nonnegative().nullable(),
8199
8242
  bytesMoved: number().int().nonnegative(),
8243
+ /** Rows the mover corrected while moving them — see `RelocateJob`. Absent on
8244
+ * a lane that cannot reconcile. A migration that silently rewrote durable
8245
+ * rows would be the same failure as one that silently skipped them. */
8246
+ rowsReconciled: number().int().nonnegative().optional(),
8200
8247
  /** The MOVER's start, not the migration's: a drain restarted after an addon
8201
8248
  * crash gets a new mover, and a rate computed from the migration's start
8202
8249
  * would silently average in the time nothing was running. */
@@ -7988,6 +7988,21 @@ var RelocateJobSchema = object({
7988
7988
  bytesMoved: number().int(),
7989
7989
  /** Total files discovered up front; null while (or when) unknown. */
7990
7990
  filesTotal: number().int().nullable(),
7991
+ /**
7992
+ * Rows this run CORRECTED while moving them — a durable mutation the move
7993
+ * made that nobody asked for, so it is reported where the operator reads the
7994
+ * job rather than only in a log line.
7995
+ *
7996
+ * A footage segment records its byte count in its own NAME, and the durable
7997
+ * hour row derives its aggregates from those names. A file that does not
7998
+ * match its name therefore makes the ledger's sums — and with them quota and
7999
+ * pressure eviction — wrong by the difference, and only a rename can fix it.
8000
+ * On 2026-08-30 one such row also stalled a 110 749-file drain permanently.
8001
+ *
8002
+ * Absent on lanes where the question has no meaning: a media blob's size is
8003
+ * in its row, not in its name, so `MediaRelocateEngine` never reconciles one.
8004
+ */
8005
+ rowsReconciled: number().int().nonnegative().optional(),
7991
8006
  startedAt: number(),
7992
8007
  finishedAt: number().nullable(),
7993
8008
  error: string().nullable()
@@ -8056,14 +8071,42 @@ var RelocateMediaInputSchema = object({
8056
8071
  /** Omitted = `move`, the pre-existing behaviour. */
8057
8072
  mode: MediaRelocateModeSchema.optional()
8058
8073
  });
8059
- /** How many rows still carry NO `locationId` — the population a repoint would
8060
- * silently re-aim at a disk that does not hold their bytes. Zero is the only
8061
- * value that permits a non-blocking `eventMedia` cutover. */
8062
- var UnstampedEventMediaCountSchema = object({
8063
- media: number().int().nonnegative(),
8064
- retrainFrames: number().int().nonnegative(),
8065
- total: number().int().nonnegative()
8074
+ /**
8075
+ * The unstamped population of ONE collection split, because the gate and the
8076
+ * operator ask two different questions and only one of them has to be cheap.
8077
+ *
8078
+ * `present` is the GATE: "is there at least one row that would be orphaned by a
8079
+ * repoint". It is a single indexed seek to the first matching row, so it stays
8080
+ * answerable on a saturated disk and answers in O(log n) precisely in the state
8081
+ * that matters — after a seal, when the population is empty.
8082
+ *
8083
+ * `rows` is the NUMBER, for the refusal message and the operator's sense of
8084
+ * scale. It is a second, indexed `COUNT(*)`, and `null` means **not
8085
+ * measurable** — never zero. `{ present: true, rows: null }` is a legitimate
8086
+ * and useful answer: "there are some, and this read could not say how many"
8087
+ * still refuses the cutover, which is the whole job.
8088
+ */
8089
+ var UnstampedRowsSchema = object({
8090
+ present: boolean(),
8091
+ rows: number().int().nonnegative().nullable()
8066
8092
  });
8093
+ /**
8094
+ * How many rows still carry NO `locationId` — the population a repoint would
8095
+ * silently re-aim at a disk that does not hold their bytes.
8096
+ *
8097
+ * **`null` = the count could not be taken**, and it is NOT permission to cut
8098
+ * over. The gate opens on a measured absence and on nothing else; an unread
8099
+ * collection and an empty one are different facts, and this repo has already
8100
+ * paid for conflating them (`RelocateResidueSchema`, D295).
8101
+ */
8102
+ var UnstampedEventMediaCountSchema = object({
8103
+ media: UnstampedRowsSchema,
8104
+ retrainFrames: UnstampedRowsSchema,
8105
+ /** True when EITHER collection holds one. The refusal reads this. */
8106
+ anyPresent: boolean(),
8107
+ /** Sum across both, or `null` when either lane could not be counted. */
8108
+ total: number().int().nonnegative().nullable()
8109
+ }).nullable();
8067
8110
  var StorageMigrationMediaMoveInputSchema = RelocateMediaInputSchema.extend({ leaseId: string().min(1) });
8068
8111
  /** The independently selectable logical storage classes — every class
8069
8112
  * `storage.listLocationDeclarations` reports, so an operator never meets a
@@ -8174,6 +8217,10 @@ var StorageMigrationMoveProgressSchema = object({
8174
8217
  /** The archive census — the **M** of "N of M" (D295). `null` = unknowable. */
8175
8218
  filesTotal: number().int().nonnegative().nullable(),
8176
8219
  bytesMoved: number().int().nonnegative(),
8220
+ /** Rows the mover corrected while moving them — see `RelocateJob`. Absent on
8221
+ * a lane that cannot reconcile. A migration that silently rewrote durable
8222
+ * rows would be the same failure as one that silently skipped them. */
8223
+ rowsReconciled: number().int().nonnegative().optional(),
8177
8224
  /** The MOVER's start, not the migration's: a drain restarted after an addon
8178
8225
  * crash gets a new mover, and a rate computed from the migration's start
8179
8226
  * would silently average in the time nothing was running. */
package/dist/smb.addon.js CHANGED
@@ -2,7 +2,7 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_shared = require("./shared-CzYVi403.js");
5
+ const require_shared = require("./shared-BHqbklNT.js");
6
6
  let node_crypto = require("node:crypto");
7
7
  let node_path = require("node:path");
8
8
  node_path = require_shared.__toESM(node_path);
@@ -1,4 +1,4 @@
1
- import { c as BaseAddon, i as rearmIdleAbort, o as scheduleIdleAbort, s as storageProviderCapability } from "./shared-DsnRUNmJ.mjs";
1
+ import { c as BaseAddon, i as rearmIdleAbort, o as scheduleIdleAbort, s as storageProviderCapability } from "./shared-CSwUP1hZ.mjs";
2
2
  import { randomUUID } from "node:crypto";
3
3
  import * as path from "node:path";
4
4
  import * as fsp from "node:fs/promises";
@@ -2,7 +2,7 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_shared = require("./shared-CzYVi403.js");
5
+ const require_shared = require("./shared-BHqbklNT.js");
6
6
  let node_stream = require("node:stream");
7
7
  let webdav = require("webdav");
8
8
  //#region src/providers/webdav/webdav-config-schema.ts
@@ -1,4 +1,4 @@
1
- import { a as safeJoinRemotePath, c as BaseAddon, i as rearmIdleAbort, o as scheduleIdleAbort, r as getRequiredBasePath, s as storageProviderCapability, t as createSessionId } from "./shared-DsnRUNmJ.mjs";
1
+ import { a as safeJoinRemotePath, c as BaseAddon, i as rearmIdleAbort, o as scheduleIdleAbort, r as getRequiredBasePath, s as storageProviderCapability, t as createSessionId } from "./shared-CSwUP1hZ.mjs";
2
2
  import { PassThrough } from "node:stream";
3
3
  import { AuthType, createClient } from "webdav";
4
4
  //#region src/providers/webdav/webdav-config-schema.ts
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-remote-storage",
3
- "version": "1.2.44",
3
+ "version": "1.2.45",
4
4
  "description": "Remote storage providers (SFTP, S3, WebDAV, SMB) — unifies remote backends behind the storage-provider cap",
5
5
  "keywords": [
6
6
  "camstack",