s3db.js 7.4.0 → 7.4.2

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/s3db.cjs.js CHANGED
@@ -9654,7 +9654,13 @@ class Client extends EventEmitter {
9654
9654
  if (metadata) {
9655
9655
  for (const [k, v] of Object.entries(metadata)) {
9656
9656
  const validKey = String(k).replace(/[^a-zA-Z0-9\-_]/g, "_");
9657
- stringMetadata[validKey] = String(v);
9657
+ const stringValue = String(v);
9658
+ const hasSpecialChars = /[^\x00-\x7F]/.test(stringValue);
9659
+ if (hasSpecialChars) {
9660
+ stringMetadata[validKey] = Buffer.from(stringValue, "utf8").toString("base64");
9661
+ } else {
9662
+ stringMetadata[validKey] = stringValue;
9663
+ }
9658
9664
  }
9659
9665
  }
9660
9666
  const options = {
@@ -9691,6 +9697,28 @@ class Client extends EventEmitter {
9691
9697
  let response, error;
9692
9698
  try {
9693
9699
  response = await this.sendCommand(new clientS3.GetObjectCommand(options));
9700
+ if (response.Metadata) {
9701
+ const decodedMetadata = {};
9702
+ for (const [key2, value] of Object.entries(response.Metadata)) {
9703
+ if (typeof value === "string") {
9704
+ try {
9705
+ const decoded = Buffer.from(value, "base64").toString("utf8");
9706
+ const hasSpecialChars = /[^\x00-\x7F]/.test(decoded);
9707
+ const isValidBase64 = Buffer.from(decoded, "utf8").toString("base64") === value;
9708
+ if (isValidBase64 && hasSpecialChars && decoded !== value) {
9709
+ decodedMetadata[key2] = decoded;
9710
+ } else {
9711
+ decodedMetadata[key2] = value;
9712
+ }
9713
+ } catch (decodeError) {
9714
+ decodedMetadata[key2] = value;
9715
+ }
9716
+ } else {
9717
+ decodedMetadata[key2] = value;
9718
+ }
9719
+ }
9720
+ response.Metadata = decodedMetadata;
9721
+ }
9694
9722
  return response;
9695
9723
  } catch (err) {
9696
9724
  error = err;
@@ -11168,6 +11196,14 @@ class Resource extends EventEmitter {
11168
11196
  this.passphrase = passphrase ?? "secret";
11169
11197
  this.versioningEnabled = versioningEnabled;
11170
11198
  this.idGenerator = this.configureIdGenerator(customIdGenerator, idSize);
11199
+ if (typeof customIdGenerator === "number" && customIdGenerator > 0) {
11200
+ this.idSize = customIdGenerator;
11201
+ } else if (typeof idSize === "number" && idSize > 0) {
11202
+ this.idSize = idSize;
11203
+ } else {
11204
+ this.idSize = 22;
11205
+ }
11206
+ this.idGeneratorType = this.getIdGeneratorType(customIdGenerator, this.idSize);
11171
11207
  this.config = {
11172
11208
  cache,
11173
11209
  hooks,
@@ -11223,7 +11259,7 @@ class Resource extends EventEmitter {
11223
11259
  */
11224
11260
  configureIdGenerator(customIdGenerator, idSize) {
11225
11261
  if (typeof customIdGenerator === "function") {
11226
- return customIdGenerator;
11262
+ return () => String(customIdGenerator());
11227
11263
  }
11228
11264
  if (typeof customIdGenerator === "number" && customIdGenerator > 0) {
11229
11265
  return nanoid.customAlphabet(nanoid.urlAlphabet, customIdGenerator);
@@ -11233,6 +11269,19 @@ class Resource extends EventEmitter {
11233
11269
  }
11234
11270
  return idGenerator;
11235
11271
  }
11272
+ /**
11273
+ * Get a serializable representation of the ID generator type
11274
+ * @param {Function|number} customIdGenerator - Custom ID generator function or size
11275
+ * @param {number} idSize - Size for auto-generated IDs
11276
+ * @returns {string|number} Serializable ID generator type
11277
+ * @private
11278
+ */
11279
+ getIdGeneratorType(customIdGenerator, idSize) {
11280
+ if (typeof customIdGenerator === "function") {
11281
+ return "custom_function";
11282
+ }
11283
+ return idSize;
11284
+ }
11236
11285
  /**
11237
11286
  * Get resource options (for backward compatibility with tests)
11238
11287
  */
@@ -13281,7 +13330,7 @@ class Database extends EventEmitter {
13281
13330
  super();
13282
13331
  this.version = "1";
13283
13332
  this.s3dbVersion = (() => {
13284
- const [ok, err, version] = try_fn_default(() => true ? "7.3.10" : "latest");
13333
+ const [ok, err, version] = try_fn_default(() => true ? "7.4.1" : "latest");
13285
13334
  return ok ? version : "latest";
13286
13335
  })();
13287
13336
  this.resources = {};
@@ -13352,6 +13401,18 @@ class Database extends EventEmitter {
13352
13401
  const currentVersion = resourceMetadata.currentVersion || "v0";
13353
13402
  const versionData = resourceMetadata.versions?.[currentVersion];
13354
13403
  if (versionData) {
13404
+ let restoredIdGenerator, restoredIdSize;
13405
+ if (versionData.idGenerator !== void 0) {
13406
+ if (versionData.idGenerator === "custom_function") {
13407
+ restoredIdGenerator = void 0;
13408
+ restoredIdSize = versionData.idSize || 22;
13409
+ } else if (typeof versionData.idGenerator === "number") {
13410
+ restoredIdGenerator = versionData.idGenerator;
13411
+ restoredIdSize = versionData.idSize || versionData.idGenerator;
13412
+ }
13413
+ } else {
13414
+ restoredIdSize = versionData.idSize || 22;
13415
+ }
13355
13416
  this.resources[name] = new resource_class_default({
13356
13417
  name,
13357
13418
  client: this.client,
@@ -13371,7 +13432,9 @@ class Database extends EventEmitter {
13371
13432
  autoDecrypt: versionData.autoDecrypt !== void 0 ? versionData.autoDecrypt : true,
13372
13433
  hooks: versionData.hooks || {},
13373
13434
  versioningEnabled: this.versioningEnabled,
13374
- map: versionData.map
13435
+ map: versionData.map,
13436
+ idGenerator: restoredIdGenerator,
13437
+ idSize: restoredIdSize
13375
13438
  });
13376
13439
  }
13377
13440
  }
@@ -13532,6 +13595,8 @@ class Database extends EventEmitter {
13532
13595
  autoDecrypt: resource.config.autoDecrypt,
13533
13596
  cache: resource.config.cache,
13534
13597
  hooks: resource.config.hooks,
13598
+ idSize: resource.idSize,
13599
+ idGenerator: resource.idGeneratorType,
13535
13600
  createdAt: isNewVersion ? (/* @__PURE__ */ new Date()).toISOString() : existingVersionData?.createdAt
13536
13601
  }
13537
13602
  }