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 +69 -4
- package/dist/s3db.cjs.min.js +1 -1
- package/dist/s3db.es.js +69 -4
- package/dist/s3db.es.min.js +1 -1
- package/dist/s3db.iife.js +69 -4
- package/dist/s3db.iife.min.js +1 -1
- package/package.json +1 -1
- package/src/client.class.js +41 -1
- package/src/database.class.js +22 -1
- package/src/resource.class.js +31 -2
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
|
-
|
|
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.
|
|
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
|
}
|