equipped 5.3.1 → 5.3.3
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/CHANGELOG.md +9 -0
- package/dist/cjs/cache/adapters/in-memory/index.cjs +155 -155
- package/dist/cjs/cache/adapters/in-memory/index.cjs.map +1 -1
- package/dist/cjs/cache/adapters/in-memory/index.min.cjs +3 -3
- package/dist/cjs/cache/adapters/in-memory/index.min.cjs.map +1 -1
- package/dist/cjs/dbs/adapters/mongodb/index.cjs.map +1 -1
- package/dist/cjs/dbs/adapters/mongodb/index.min.cjs +2 -2
- package/dist/cjs/dbs/adapters/mongodb/index.min.cjs.map +1 -1
- package/dist/cjs/dbs/index.cjs +181 -179
- package/dist/cjs/dbs/index.cjs.map +1 -1
- package/dist/cjs/dbs/index.min.cjs +3 -3
- package/dist/cjs/dbs/index.min.cjs.map +1 -1
- package/dist/cjs/errors/index.cjs +11 -0
- package/dist/cjs/errors/index.cjs.map +1 -1
- package/dist/cjs/errors/index.min.cjs +1 -1
- package/dist/cjs/errors/index.min.cjs.map +1 -1
- package/dist/cjs/events/adapters/kafka/index.cjs.map +1 -1
- package/dist/cjs/events/adapters/kafka/index.min.cjs +2 -2
- package/dist/cjs/events/adapters/kafka/index.min.cjs.map +1 -1
- package/dist/cjs/events/adapters/rabbitmq/index.cjs +179 -179
- package/dist/cjs/events/adapters/rabbitmq/index.cjs.map +1 -1
- package/dist/cjs/events/adapters/rabbitmq/index.min.cjs +3 -3
- package/dist/cjs/events/adapters/rabbitmq/index.min.cjs.map +1 -1
- package/dist/cjs/orm/adapters/mongodb/index.cjs +144 -144
- package/dist/cjs/orm/adapters/mongodb/index.cjs.map +1 -1
- package/dist/cjs/orm/adapters/mongodb/index.min.cjs +1 -1
- package/dist/cjs/orm/adapters/mongodb/index.min.cjs.map +1 -1
- package/dist/cjs/orm/adapters/postgresql/index.cjs +152 -215
- package/dist/cjs/orm/adapters/postgresql/index.cjs.map +1 -1
- package/dist/cjs/orm/adapters/postgresql/index.min.cjs +11 -11
- package/dist/cjs/orm/adapters/postgresql/index.min.cjs.map +1 -1
- package/dist/cjs/server/adapters/express/index.cjs +292 -225
- package/dist/cjs/server/adapters/express/index.cjs.map +1 -1
- package/dist/cjs/server/adapters/express/index.min.cjs +7 -7
- package/dist/cjs/server/adapters/express/index.min.cjs.map +1 -1
- package/dist/cjs/server/adapters/fastify/index.cjs +277 -210
- package/dist/cjs/server/adapters/fastify/index.cjs.map +1 -1
- package/dist/cjs/server/adapters/fastify/index.min.cjs +7 -7
- package/dist/cjs/server/adapters/fastify/index.min.cjs.map +1 -1
- package/dist/cjs/server/index.cjs +82 -15
- package/dist/cjs/server/index.cjs.map +1 -1
- package/dist/cjs/server/index.min.cjs +7 -7
- package/dist/cjs/server/index.min.cjs.map +1 -1
- package/dist/cjs/utilities/index.cjs +0 -5
- package/dist/cjs/utilities/index.cjs.map +1 -1
- package/dist/cjs/utilities/index.min.cjs +2 -2
- package/dist/cjs/utilities/index.min.cjs.map +1 -1
- package/dist/cjs/validations/index.cjs +1 -0
- package/dist/cjs/validations/index.cjs.map +1 -1
- package/dist/cjs/validations/index.min.cjs +1 -1
- package/dist/cjs/validations/index.min.cjs.map +1 -1
- package/dist/esm/cache/adapters/in-memory/index.min.mjs +1 -1
- package/dist/esm/cache/adapters/in-memory/index.min.mjs.map +1 -1
- package/dist/esm/cache/adapters/in-memory/index.mjs +6 -3
- package/dist/esm/cache/adapters/in-memory/index.mjs.map +1 -1
- package/dist/esm/cache/adapters/redis/index.min.mjs +1 -1
- package/dist/esm/cache/adapters/redis/index.mjs +5 -3
- package/dist/esm/cache/index.min.mjs +1 -1
- package/dist/esm/cache/index.mjs +2 -2
- package/dist/esm/{chunk-2GGMLKRP.min.mjs → chunk-4GZ43EQ2.min.mjs} +2 -2
- package/dist/esm/{chunk-IRYCN6PI.min.mjs → chunk-5FEVQT6K.min.mjs} +2 -2
- package/dist/esm/{chunk-LKS5ZE45.mjs → chunk-74GY55PM.mjs} +2 -2
- package/dist/esm/{chunk-A4P7P6BU.mjs → chunk-7N4WUZ7P.mjs} +167 -347
- package/dist/esm/chunk-7N4WUZ7P.mjs.map +1 -0
- package/dist/esm/chunk-A332TTED.mjs +135 -0
- package/dist/esm/chunk-A332TTED.mjs.map +1 -0
- package/dist/esm/{chunk-7CP7ZE2O.mjs → chunk-BONYW6LU.mjs} +9 -5
- package/dist/esm/{chunk-7CP7ZE2O.mjs.map → chunk-BONYW6LU.mjs.map} +1 -1
- package/dist/esm/{chunk-HXFNN6RI.mjs → chunk-C3G4W4ZV.mjs} +3 -3
- package/dist/esm/chunk-CU2HU5UE.min.mjs +2 -0
- package/dist/esm/chunk-CU2HU5UE.min.mjs.map +1 -0
- package/dist/esm/{chunk-676VIABN.min.mjs → chunk-LJZOS62I.min.mjs} +2 -2
- package/dist/esm/{chunk-7SQ5JQYR.min.mjs → chunk-MCX2O5IT.min.mjs} +2 -2
- package/dist/esm/{chunk-BWUFPMVG.mjs → chunk-MNKDFIVK.mjs} +2 -2
- package/dist/esm/chunk-N3OD4QL2.min.mjs +32 -0
- package/dist/esm/chunk-N3OD4QL2.min.mjs.map +1 -0
- package/dist/esm/chunk-NEF3UYFA.mjs +144 -0
- package/dist/esm/chunk-NEF3UYFA.mjs.map +1 -0
- package/dist/esm/{chunk-TSVHZZE4.mjs → chunk-RFJ5URMP.mjs} +5 -5
- package/dist/esm/chunk-RX4XPABH.min.mjs +2 -0
- package/dist/esm/{chunk-MQXTTWPS.min.mjs.map → chunk-RX4XPABH.min.mjs.map} +1 -1
- package/dist/esm/chunk-SPOVKWV3.min.mjs +2 -0
- package/dist/esm/chunk-SPOVKWV3.min.mjs.map +1 -0
- package/dist/esm/{chunk-3TP7NINX.mjs → chunk-XESM7IWM.mjs} +2 -2
- package/dist/esm/{chunk-5PZACGPI.mjs → chunk-XJKBHQWO.mjs} +7 -5
- package/dist/esm/{chunk-5PZACGPI.mjs.map → chunk-XJKBHQWO.mjs.map} +1 -1
- package/dist/esm/chunk-YC6V4HLT.min.mjs +2 -0
- package/dist/esm/{chunk-7NF7PV6S.min.mjs.map → chunk-YC6V4HLT.min.mjs.map} +1 -1
- package/dist/esm/{chunk-P4PRHHIY.min.mjs → chunk-YWQTFKNY.min.mjs} +2 -2
- package/dist/esm/dbs/adapters/mongodb/index.min.mjs +1 -1
- package/dist/esm/dbs/adapters/mongodb/index.min.mjs.map +1 -1
- package/dist/esm/dbs/adapters/mongodb/index.mjs +8 -5
- package/dist/esm/dbs/adapters/mongodb/index.mjs.map +1 -1
- package/dist/esm/dbs/index.min.mjs +1 -1
- package/dist/esm/dbs/index.mjs +5 -3
- package/dist/esm/errors/index.min.mjs +1 -1
- package/dist/esm/errors/index.mjs +3 -1
- package/dist/esm/events/adapters/kafka/index.min.mjs +1 -1
- package/dist/esm/events/adapters/kafka/index.mjs +4 -2
- package/dist/esm/events/adapters/rabbitmq/index.min.mjs +1 -1
- package/dist/esm/events/adapters/rabbitmq/index.min.mjs.map +1 -1
- package/dist/esm/events/adapters/rabbitmq/index.mjs +7 -3
- package/dist/esm/events/adapters/rabbitmq/index.mjs.map +1 -1
- package/dist/esm/index.min.mjs +1 -1
- package/dist/esm/index.mjs +1 -1
- package/dist/esm/instance/index.min.mjs +1 -1
- package/dist/esm/instance/index.mjs +1 -1
- package/dist/esm/introspection-TO27QT2X.min.mjs +2 -0
- package/dist/esm/{introspection-YJF3QAUK.mjs → introspection-ZUQYVEFC.mjs} +3 -3
- package/dist/esm/jobs/adapters/redis/index.min.mjs +1 -1
- package/dist/esm/jobs/adapters/redis/index.min.mjs.map +1 -1
- package/dist/esm/jobs/adapters/redis/index.mjs +10 -6
- package/dist/esm/jobs/adapters/redis/index.mjs.map +1 -1
- package/dist/esm/orm/adapters/in-memory/index.min.mjs +1 -1
- package/dist/esm/orm/adapters/in-memory/index.mjs +4 -3
- package/dist/esm/orm/adapters/json/index.min.mjs +1 -1
- package/dist/esm/orm/adapters/json/index.min.mjs.map +1 -1
- package/dist/esm/orm/adapters/json/index.mjs +6 -5
- package/dist/esm/orm/adapters/json/index.mjs.map +1 -1
- package/dist/esm/orm/adapters/mongodb/index.min.mjs +1 -1
- package/dist/esm/orm/adapters/mongodb/index.min.mjs.map +1 -1
- package/dist/esm/orm/adapters/mongodb/index.mjs +6 -4
- package/dist/esm/orm/adapters/mongodb/index.mjs.map +1 -1
- package/dist/esm/orm/adapters/postgresql/index.min.mjs +2 -2
- package/dist/esm/orm/adapters/postgresql/index.min.mjs.map +1 -1
- package/dist/esm/orm/adapters/postgresql/index.mjs +8 -5
- package/dist/esm/orm/adapters/postgresql/index.mjs.map +1 -1
- package/dist/esm/orm/index.min.mjs +1 -1
- package/dist/esm/orm/index.mjs +3 -3
- package/dist/esm/server/adapters/express/index.min.mjs +1 -1
- package/dist/esm/server/adapters/express/index.min.mjs.map +1 -1
- package/dist/esm/server/adapters/express/index.mjs +7 -3
- package/dist/esm/server/adapters/express/index.mjs.map +1 -1
- package/dist/esm/server/adapters/fastify/index.min.mjs +1 -1
- package/dist/esm/server/adapters/fastify/index.min.mjs.map +1 -1
- package/dist/esm/server/adapters/fastify/index.mjs +7 -3
- package/dist/esm/server/adapters/fastify/index.mjs.map +1 -1
- package/dist/esm/server/index.min.mjs +1 -1
- package/dist/esm/server/index.mjs +1 -1
- package/dist/esm/utilities/index.min.mjs +1 -1
- package/dist/esm/utilities/index.mjs +5 -4
- package/dist/esm/validations/index.min.mjs +1 -1
- package/dist/esm/validations/index.mjs +1 -1
- package/dist/types/{base-BDTBLZ9a.d.ts → base-BnwwLupM.d.ts} +3 -3
- package/dist/types/cache/adapters/in-memory/index.js +6 -3
- package/dist/types/cache/adapters/redis/index.js +5 -3
- package/dist/types/cache/index.js +2 -2
- package/dist/types/chunk-7MXHWHRV.js +134 -0
- package/dist/types/{chunk-LPB5LS7A.js → chunk-BKXNLF6X.js} +1 -1
- package/dist/types/{chunk-J3TGB5YQ.js → chunk-DZFKDZDZ.js} +8 -4
- package/dist/types/{chunk-YLJNBL6J.js → chunk-GQRSK2KP.js} +6 -4
- package/dist/types/chunk-PPD4WDG6.js +143 -0
- package/dist/types/{chunk-55CTVK7R.js → chunk-SZAA5GF6.js} +1 -1
- package/dist/types/{chunk-4DH3POYM.js → chunk-UGLZIYAR.js} +4 -4
- package/dist/types/{chunk-5Z26ZURE.js → chunk-UR7O43FC.js} +1 -1
- package/dist/types/{chunk-IZDJDGOV.js → chunk-X5ZDIXCZ.js} +2 -2
- package/dist/types/{chunk-TT5EORDK.js → chunk-YGIIUOQM.js} +166 -346
- package/dist/types/dbs/adapters/mongodb/index.js +8 -5
- package/dist/types/dbs/index.js +5 -3
- package/dist/types/errors/index.d.ts +8 -3
- package/dist/types/errors/index.js +3 -1
- package/dist/types/events/adapters/kafka/index.js +4 -2
- package/dist/types/events/adapters/rabbitmq/index.js +7 -3
- package/dist/types/index.js +1 -1
- package/dist/types/instance/index.js +1 -1
- package/dist/types/{introspection-EHGM4RMO.js → introspection-ZQMYTW6H.js} +2 -2
- package/dist/types/jobs/adapters/redis/index.js +10 -6
- package/dist/types/orm/adapters/in-memory/index.js +4 -3
- package/dist/types/orm/adapters/json/index.js +6 -5
- package/dist/types/orm/adapters/mongodb/index.js +6 -4
- package/dist/types/orm/adapters/postgresql/index.js +8 -5
- package/dist/types/orm/index.js +3 -3
- package/dist/types/{requestError-DdaL8hc3.d.ts → requestError-BmOhSuFb.d.ts} +1 -0
- package/dist/types/server/adapters/express/index.d.ts +2 -2
- package/dist/types/server/adapters/express/index.js +7 -3
- package/dist/types/server/adapters/fastify/index.d.ts +3 -3
- package/dist/types/server/adapters/fastify/index.js +7 -3
- package/dist/types/server/index.d.ts +4 -4
- package/dist/types/server/index.js +1 -1
- package/dist/types/utilities/index.d.ts +1 -2
- package/dist/types/utilities/index.js +5 -4
- package/dist/types/{validationError-oigtHqBi.d.ts → validationError-C2tVK4s7.d.ts} +1 -1
- package/dist/types/validations/index.d.ts +4 -4
- package/dist/types/validations/index.js +1 -1
- package/package.json +1 -1
- package/dist/esm/chunk-7NF7PV6S.min.mjs +0 -2
- package/dist/esm/chunk-A4P7P6BU.mjs.map +0 -1
- package/dist/esm/chunk-IN5YKIJ7.min.mjs +0 -32
- package/dist/esm/chunk-IN5YKIJ7.min.mjs.map +0 -1
- package/dist/esm/chunk-MQXTTWPS.min.mjs +0 -2
- package/dist/esm/introspection-THKMXV5V.min.mjs +0 -2
- /package/dist/esm/{chunk-2GGMLKRP.min.mjs.map → chunk-4GZ43EQ2.min.mjs.map} +0 -0
- /package/dist/esm/{chunk-IRYCN6PI.min.mjs.map → chunk-5FEVQT6K.min.mjs.map} +0 -0
- /package/dist/esm/{chunk-LKS5ZE45.mjs.map → chunk-74GY55PM.mjs.map} +0 -0
- /package/dist/esm/{chunk-HXFNN6RI.mjs.map → chunk-C3G4W4ZV.mjs.map} +0 -0
- /package/dist/esm/{chunk-676VIABN.min.mjs.map → chunk-LJZOS62I.min.mjs.map} +0 -0
- /package/dist/esm/{chunk-7SQ5JQYR.min.mjs.map → chunk-MCX2O5IT.min.mjs.map} +0 -0
- /package/dist/esm/{chunk-BWUFPMVG.mjs.map → chunk-MNKDFIVK.mjs.map} +0 -0
- /package/dist/esm/{chunk-TSVHZZE4.mjs.map → chunk-RFJ5URMP.mjs.map} +0 -0
- /package/dist/esm/{chunk-3TP7NINX.mjs.map → chunk-XESM7IWM.mjs.map} +0 -0
- /package/dist/esm/{chunk-P4PRHHIY.min.mjs.map → chunk-YWQTFKNY.min.mjs.map} +0 -0
- /package/dist/esm/{introspection-THKMXV5V.min.mjs.map → introspection-TO27QT2X.min.mjs.map} +0 -0
- /package/dist/esm/{introspection-YJF3QAUK.mjs.map → introspection-ZUQYVEFC.mjs.map} +0 -0
|
@@ -69,7 +69,7 @@ var import_cors = require("@fastify/cors");
|
|
|
69
69
|
var import_cors2 = require("cors");
|
|
70
70
|
var import_socket = require("socket.io");
|
|
71
71
|
var import_supertest = __toESM(require("supertest"), 1);
|
|
72
|
-
var
|
|
72
|
+
var import_valleyed7 = require("valleyed");
|
|
73
73
|
|
|
74
74
|
// src/events/adapters/base.ts
|
|
75
75
|
var EventBus = class {
|
|
@@ -708,6 +708,7 @@ var StatusCodes = {
|
|
|
708
708
|
NotAuthorized: 403,
|
|
709
709
|
NotFound: 404,
|
|
710
710
|
ValidationError: 422,
|
|
711
|
+
PreconditionRequired: 428,
|
|
711
712
|
TooManyRequests: 429,
|
|
712
713
|
TokenExpired: 461
|
|
713
714
|
};
|
|
@@ -961,170 +962,6 @@ var openapi = (config) => {
|
|
|
961
962
|
};
|
|
962
963
|
};
|
|
963
964
|
|
|
964
|
-
// src/utilities/configurable.ts
|
|
965
|
-
var import_valleyed7 = require("valleyed");
|
|
966
|
-
function configurable(pipeFn, base) {
|
|
967
|
-
const pipe = pipeFn();
|
|
968
|
-
import_valleyed7.v.compile(pipe);
|
|
969
|
-
class Configurable extends base {
|
|
970
|
-
constructor(config, ...baseArgs) {
|
|
971
|
-
super(...baseArgs);
|
|
972
|
-
this.config = config;
|
|
973
|
-
}
|
|
974
|
-
static create(input, ...args) {
|
|
975
|
-
const r = import_valleyed7.v.validate(pipe, input);
|
|
976
|
-
if (!r.valid) throw r.error;
|
|
977
|
-
return new this(r.value, ...args);
|
|
978
|
-
}
|
|
979
|
-
}
|
|
980
|
-
return Configurable;
|
|
981
|
-
}
|
|
982
|
-
if (void 0) {
|
|
983
|
-
const { describe, test, expect, expectTypeOf } = void 0;
|
|
984
|
-
const { v: v8 } = null;
|
|
985
|
-
const testPipe = () => v8.object({
|
|
986
|
-
host: v8.string(),
|
|
987
|
-
port: v8.number()
|
|
988
|
-
});
|
|
989
|
-
class TestBase {
|
|
990
|
-
baseValue;
|
|
991
|
-
constructor() {
|
|
992
|
-
this.baseValue = "base";
|
|
993
|
-
}
|
|
994
|
-
}
|
|
995
|
-
class TestBaseWithArgs {
|
|
996
|
-
label;
|
|
997
|
-
constructor(label) {
|
|
998
|
-
this.label = label;
|
|
999
|
-
}
|
|
1000
|
-
}
|
|
1001
|
-
describe("configurable", () => {
|
|
1002
|
-
test("validation runs in static create before constructor body executes", () => {
|
|
1003
|
-
let constructorRan = false;
|
|
1004
|
-
const Wrapped = configurable(testPipe, TestBase);
|
|
1005
|
-
class MyClass extends Wrapped {
|
|
1006
|
-
constructor(config) {
|
|
1007
|
-
super(config);
|
|
1008
|
-
constructorRan = true;
|
|
1009
|
-
}
|
|
1010
|
-
}
|
|
1011
|
-
expect(() => MyClass.create({ host: 123, port: "bad" })).toThrow();
|
|
1012
|
-
expect(constructorRan).toBe(false);
|
|
1013
|
-
MyClass.create({ host: "localhost", port: 3e3 });
|
|
1014
|
-
expect(constructorRan).toBe(true);
|
|
1015
|
-
});
|
|
1016
|
-
test("constructor receives validated value", () => {
|
|
1017
|
-
const Wrapped = configurable(testPipe, TestBase);
|
|
1018
|
-
let receivedConfig;
|
|
1019
|
-
class MyClass extends Wrapped {
|
|
1020
|
-
constructor(config) {
|
|
1021
|
-
super(config);
|
|
1022
|
-
receivedConfig = this.config;
|
|
1023
|
-
}
|
|
1024
|
-
}
|
|
1025
|
-
MyClass.create({ host: "localhost", port: 3e3 });
|
|
1026
|
-
expect(receivedConfig).toEqual({ host: "localhost", port: 3e3 });
|
|
1027
|
-
});
|
|
1028
|
-
test("external new is a compile error", () => {
|
|
1029
|
-
const Wrapped = configurable(testPipe, TestBase);
|
|
1030
|
-
class MyClass extends Wrapped {
|
|
1031
|
-
constructor(config) {
|
|
1032
|
-
super(config);
|
|
1033
|
-
}
|
|
1034
|
-
}
|
|
1035
|
-
void (() => new MyClass({ host: "localhost", port: 3e3 }));
|
|
1036
|
-
});
|
|
1037
|
-
test("static Config resolves to PipeOutput<P> at the type level", () => {
|
|
1038
|
-
const Wrapped = configurable(testPipe, TestBase);
|
|
1039
|
-
class MyClass extends Wrapped {
|
|
1040
|
-
constructor(config) {
|
|
1041
|
-
super(config);
|
|
1042
|
-
}
|
|
1043
|
-
}
|
|
1044
|
-
expectTypeOf().toEqualTypeOf();
|
|
1045
|
-
expect(MyClass.create).toBeTypeOf("function");
|
|
1046
|
-
});
|
|
1047
|
-
test("ConstructorParameters<This>-based extras inference works for non-zero-arg leaf signatures", () => {
|
|
1048
|
-
const Wrapped = configurable(testPipe, TestBase);
|
|
1049
|
-
class MyClass extends Wrapped {
|
|
1050
|
-
extra;
|
|
1051
|
-
constructor(config, extra) {
|
|
1052
|
-
super(config);
|
|
1053
|
-
this.extra = extra;
|
|
1054
|
-
}
|
|
1055
|
-
}
|
|
1056
|
-
const instance = MyClass.create({ host: "localhost", port: 3e3 }, 42);
|
|
1057
|
-
expect(instance.extra).toBe(42);
|
|
1058
|
-
expectTypeOf(instance).toHaveProperty("extra");
|
|
1059
|
-
expectTypeOf(instance.extra).toEqualTypeOf();
|
|
1060
|
-
void (() => MyClass.create({ host: "localhost", port: 3e3 }, "not-a-number"));
|
|
1061
|
-
});
|
|
1062
|
-
test("base-args forwarding works for non-zero-arg bases", () => {
|
|
1063
|
-
const Wrapped = configurable(testPipe, TestBaseWithArgs);
|
|
1064
|
-
class MyClass extends Wrapped {
|
|
1065
|
-
constructor(config, label) {
|
|
1066
|
-
super(config, label);
|
|
1067
|
-
}
|
|
1068
|
-
}
|
|
1069
|
-
const instance = MyClass.create({ host: "localhost", port: 3e3 }, "test-label");
|
|
1070
|
-
expect(instance.label).toBe("test-label");
|
|
1071
|
-
});
|
|
1072
|
-
test("config is accessible as protected readonly on instances", () => {
|
|
1073
|
-
const Wrapped = configurable(testPipe, TestBase);
|
|
1074
|
-
class MyClass extends Wrapped {
|
|
1075
|
-
constructor(config) {
|
|
1076
|
-
super(config);
|
|
1077
|
-
}
|
|
1078
|
-
getHost() {
|
|
1079
|
-
return this.config.host;
|
|
1080
|
-
}
|
|
1081
|
-
}
|
|
1082
|
-
const instance = MyClass.create({ host: "localhost", port: 3e3 });
|
|
1083
|
-
expect(instance.getHost()).toBe("localhost");
|
|
1084
|
-
});
|
|
1085
|
-
test("accepts an abstract base class", () => {
|
|
1086
|
-
class AbstractBase {
|
|
1087
|
-
}
|
|
1088
|
-
const Wrapped = configurable(testPipe, AbstractBase);
|
|
1089
|
-
class Concrete extends Wrapped {
|
|
1090
|
-
constructor(config) {
|
|
1091
|
-
super(config);
|
|
1092
|
-
}
|
|
1093
|
-
greet() {
|
|
1094
|
-
return `hello from ${this.config.host}`;
|
|
1095
|
-
}
|
|
1096
|
-
}
|
|
1097
|
-
const instance = Concrete.create({ host: "localhost", port: 3e3 });
|
|
1098
|
-
expect(instance.greet()).toBe("hello from localhost");
|
|
1099
|
-
expectTypeOf(instance).toHaveProperty("config");
|
|
1100
|
-
});
|
|
1101
|
-
});
|
|
1102
|
-
}
|
|
1103
|
-
|
|
1104
|
-
// src/utilities/json.ts
|
|
1105
|
-
var parseJSONValue = (data) => {
|
|
1106
|
-
try {
|
|
1107
|
-
if (data?.constructor?.name !== "String") return data;
|
|
1108
|
-
return JSON.parse(data);
|
|
1109
|
-
} catch {
|
|
1110
|
-
return data;
|
|
1111
|
-
}
|
|
1112
|
-
};
|
|
1113
|
-
function parseJSONObject(data) {
|
|
1114
|
-
return Object.fromEntries(Object.entries(data).map(([key, value]) => [key, parseJSONValue(value)]));
|
|
1115
|
-
}
|
|
1116
|
-
|
|
1117
|
-
// src/utilities/media.ts
|
|
1118
|
-
var import_music_metadata = require("music-metadata");
|
|
1119
|
-
var getMediaDuration = async (buffer) => {
|
|
1120
|
-
try {
|
|
1121
|
-
const meta = await (0, import_music_metadata.parseBuffer)(buffer);
|
|
1122
|
-
return meta.format.duration ?? 0;
|
|
1123
|
-
} catch {
|
|
1124
|
-
return 0;
|
|
1125
|
-
}
|
|
1126
|
-
};
|
|
1127
|
-
|
|
1128
965
|
// src/server/requests.ts
|
|
1129
966
|
var Request = class {
|
|
1130
967
|
ip;
|
|
@@ -1153,8 +990,10 @@ var Request = class {
|
|
|
1153
990
|
this.params = params;
|
|
1154
991
|
this.cookies = cookies;
|
|
1155
992
|
this.headers = headers;
|
|
1156
|
-
|
|
1157
|
-
|
|
993
|
+
const hasFiles = Object.keys(files).length > 0;
|
|
994
|
+
const bodyFields = body && typeof body === "object" && !Array.isArray(body) ? body : {};
|
|
995
|
+
this.query = query;
|
|
996
|
+
this.body = hasFiles ? Object.assign({}, bodyFields, files) : body;
|
|
1158
997
|
}
|
|
1159
998
|
pipe(stream, opts = {}) {
|
|
1160
999
|
return new Response({ ...opts, piped: true, body: stream });
|
|
@@ -1200,6 +1039,83 @@ var Response = class {
|
|
|
1200
1039
|
});
|
|
1201
1040
|
}
|
|
1202
1041
|
};
|
|
1042
|
+
if (void 0) {
|
|
1043
|
+
const { describe, expect, test } = void 0;
|
|
1044
|
+
describe("Request", () => {
|
|
1045
|
+
test("preserves adapter-provided query and body values without JSON normalization", () => {
|
|
1046
|
+
const query = {
|
|
1047
|
+
count: "10",
|
|
1048
|
+
active: "true",
|
|
1049
|
+
filter: '{"name":"test"}',
|
|
1050
|
+
quoted: '"value"'
|
|
1051
|
+
};
|
|
1052
|
+
const body = {
|
|
1053
|
+
count: "10",
|
|
1054
|
+
active: "false",
|
|
1055
|
+
payload: '{"nested":true}',
|
|
1056
|
+
quoted: '"value"'
|
|
1057
|
+
};
|
|
1058
|
+
const request = new Request({
|
|
1059
|
+
ip: void 0,
|
|
1060
|
+
body,
|
|
1061
|
+
cookies: {},
|
|
1062
|
+
params: {},
|
|
1063
|
+
query,
|
|
1064
|
+
method: "post",
|
|
1065
|
+
path: "/items",
|
|
1066
|
+
headers: {},
|
|
1067
|
+
files: {}
|
|
1068
|
+
});
|
|
1069
|
+
expect(request.query).toEqual(query);
|
|
1070
|
+
expect(request.body).toEqual(body);
|
|
1071
|
+
});
|
|
1072
|
+
test("continues merging uploaded files into body fields without parsing string fields", () => {
|
|
1073
|
+
const file = {
|
|
1074
|
+
name: "avatar.png",
|
|
1075
|
+
type: "image/png",
|
|
1076
|
+
size: 4,
|
|
1077
|
+
isTruncated: false,
|
|
1078
|
+
data: Buffer.from("file"),
|
|
1079
|
+
duration: 0
|
|
1080
|
+
};
|
|
1081
|
+
const body = { metadata: '{"alt":"avatar"}' };
|
|
1082
|
+
const request = new Request({
|
|
1083
|
+
ip: void 0,
|
|
1084
|
+
body,
|
|
1085
|
+
cookies: {},
|
|
1086
|
+
params: {},
|
|
1087
|
+
query: {},
|
|
1088
|
+
method: "post",
|
|
1089
|
+
path: "/upload",
|
|
1090
|
+
headers: {},
|
|
1091
|
+
files: { avatar: [file] }
|
|
1092
|
+
});
|
|
1093
|
+
expect(request.body).toEqual({ metadata: '{"alt":"avatar"}', avatar: [file] });
|
|
1094
|
+
});
|
|
1095
|
+
test("does not spread non-object body values when uploaded files are present", () => {
|
|
1096
|
+
const file = {
|
|
1097
|
+
name: "avatar.png",
|
|
1098
|
+
type: "image/png",
|
|
1099
|
+
size: 4,
|
|
1100
|
+
isTruncated: false,
|
|
1101
|
+
data: Buffer.from("file"),
|
|
1102
|
+
duration: 0
|
|
1103
|
+
};
|
|
1104
|
+
const request = new Request({
|
|
1105
|
+
ip: void 0,
|
|
1106
|
+
body: "raw text body",
|
|
1107
|
+
cookies: {},
|
|
1108
|
+
params: {},
|
|
1109
|
+
query: {},
|
|
1110
|
+
method: "post",
|
|
1111
|
+
path: "/upload",
|
|
1112
|
+
headers: {},
|
|
1113
|
+
files: { avatar: [file] }
|
|
1114
|
+
});
|
|
1115
|
+
expect(request.body).toEqual({ avatar: [file] });
|
|
1116
|
+
});
|
|
1117
|
+
});
|
|
1118
|
+
}
|
|
1203
1119
|
|
|
1204
1120
|
// src/server/requests-auth-methods/base.ts
|
|
1205
1121
|
var import_node_http2 = require("http2");
|
|
@@ -1330,50 +1246,50 @@ var SocketEmitter = class {
|
|
|
1330
1246
|
};
|
|
1331
1247
|
|
|
1332
1248
|
// src/server/adapters/base.ts
|
|
1333
|
-
var serverConfigPipe = () =>
|
|
1334
|
-
port:
|
|
1335
|
-
cors:
|
|
1336
|
-
|
|
1337
|
-
origin:
|
|
1338
|
-
methods:
|
|
1339
|
-
credentials:
|
|
1249
|
+
var serverConfigPipe = () => import_valleyed7.v.object({
|
|
1250
|
+
port: import_valleyed7.v.number(),
|
|
1251
|
+
cors: import_valleyed7.v.optional(
|
|
1252
|
+
import_valleyed7.v.object({
|
|
1253
|
+
origin: import_valleyed7.v.optional(import_valleyed7.v.or([import_valleyed7.v.array(import_valleyed7.v.string()), import_valleyed7.v.is(true)])),
|
|
1254
|
+
methods: import_valleyed7.v.optional(import_valleyed7.v.array(import_valleyed7.v.in(Object.values(Methods)))),
|
|
1255
|
+
credentials: import_valleyed7.v.optional(import_valleyed7.v.boolean())
|
|
1340
1256
|
})
|
|
1341
1257
|
),
|
|
1342
|
-
eventBus:
|
|
1343
|
-
publicPath:
|
|
1344
|
-
healthPath:
|
|
1345
|
-
openapi:
|
|
1346
|
-
|
|
1347
|
-
docsVersion:
|
|
1348
|
-
docsBaseUrl:
|
|
1349
|
-
docsPath:
|
|
1258
|
+
eventBus: import_valleyed7.v.optional(import_valleyed7.v.instanceOf(EventBus)),
|
|
1259
|
+
publicPath: import_valleyed7.v.optional(import_valleyed7.v.string()),
|
|
1260
|
+
healthPath: import_valleyed7.v.optional(import_valleyed7.v.string()),
|
|
1261
|
+
openapi: import_valleyed7.v.defaults(
|
|
1262
|
+
import_valleyed7.v.object({
|
|
1263
|
+
docsVersion: import_valleyed7.v.defaults(import_valleyed7.v.string(), "1.0.0"),
|
|
1264
|
+
docsBaseUrl: import_valleyed7.v.defaults(import_valleyed7.v.array(import_valleyed7.v.string()), ["/"]),
|
|
1265
|
+
docsPath: import_valleyed7.v.defaults(import_valleyed7.v.string(), "/__docs")
|
|
1350
1266
|
}),
|
|
1351
1267
|
{}
|
|
1352
1268
|
),
|
|
1353
|
-
requests:
|
|
1354
|
-
|
|
1355
|
-
log:
|
|
1356
|
-
rateLimit:
|
|
1357
|
-
|
|
1358
|
-
enabled:
|
|
1359
|
-
periodInMs:
|
|
1360
|
-
limit:
|
|
1269
|
+
requests: import_valleyed7.v.defaults(
|
|
1270
|
+
import_valleyed7.v.object({
|
|
1271
|
+
log: import_valleyed7.v.defaults(import_valleyed7.v.boolean(), true),
|
|
1272
|
+
rateLimit: import_valleyed7.v.defaults(
|
|
1273
|
+
import_valleyed7.v.object({
|
|
1274
|
+
enabled: import_valleyed7.v.defaults(import_valleyed7.v.boolean(), false),
|
|
1275
|
+
periodInMs: import_valleyed7.v.defaults(import_valleyed7.v.number(), 60 * 60 * 1e3),
|
|
1276
|
+
limit: import_valleyed7.v.defaults(import_valleyed7.v.number(), 5e3)
|
|
1361
1277
|
}),
|
|
1362
1278
|
{}
|
|
1363
1279
|
),
|
|
1364
|
-
slowdown:
|
|
1365
|
-
|
|
1366
|
-
enabled:
|
|
1367
|
-
periodInMs:
|
|
1368
|
-
delayAfter:
|
|
1369
|
-
delayInMs:
|
|
1280
|
+
slowdown: import_valleyed7.v.defaults(
|
|
1281
|
+
import_valleyed7.v.object({
|
|
1282
|
+
enabled: import_valleyed7.v.defaults(import_valleyed7.v.boolean(), false),
|
|
1283
|
+
periodInMs: import_valleyed7.v.defaults(import_valleyed7.v.number(), 10 * 60 * 1e3),
|
|
1284
|
+
delayAfter: import_valleyed7.v.defaults(import_valleyed7.v.number(), 2e3),
|
|
1285
|
+
delayInMs: import_valleyed7.v.defaults(import_valleyed7.v.number(), 500)
|
|
1370
1286
|
}),
|
|
1371
1287
|
{}
|
|
1372
1288
|
)
|
|
1373
1289
|
}),
|
|
1374
1290
|
{}
|
|
1375
1291
|
),
|
|
1376
|
-
socketsAuthMethods:
|
|
1292
|
+
socketsAuthMethods: import_valleyed7.v.defaults(import_valleyed7.v.array(import_valleyed7.v.instanceOf(BaseRequestAuthMethod)), [])
|
|
1377
1293
|
});
|
|
1378
1294
|
var rawResponseHandledSymbol = /* @__PURE__ */ Symbol("rawResponseHandled");
|
|
1379
1295
|
var rawResponseHandled = Object.freeze({ [rawResponseHandledSymbol]: true });
|
|
@@ -1394,7 +1310,7 @@ function writeRawHandlerError(response, error) {
|
|
|
1394
1310
|
var errorsSchemas = Object.entries(StatusCodes).filter(([, value]) => value > 399).map(([key, value]) => ({
|
|
1395
1311
|
status: value,
|
|
1396
1312
|
contentType: "application/json",
|
|
1397
|
-
pipe:
|
|
1313
|
+
pipe: import_valleyed7.v.meta(import_valleyed7.v.array(import_valleyed7.v.object({ message: import_valleyed7.v.string(), field: import_valleyed7.v.optional(import_valleyed7.v.string()) })), {
|
|
1398
1314
|
$refId: `Errors.${key}Response`,
|
|
1399
1315
|
description: `${key} Response`
|
|
1400
1316
|
})
|
|
@@ -1551,37 +1467,37 @@ var Server = class {
|
|
|
1551
1467
|
{ key: "responseCookies", type: "response" }
|
|
1552
1468
|
];
|
|
1553
1469
|
defs.forEach((def) => {
|
|
1554
|
-
const pipe = schema[def.key] ??
|
|
1470
|
+
const pipe = schema[def.key] ?? import_valleyed7.v.any();
|
|
1555
1471
|
if (def.skip) return;
|
|
1556
1472
|
if (def.type === "request") {
|
|
1557
1473
|
requestPipeDefs[def.key] = pipe;
|
|
1558
|
-
jsonSchema.request[def.key] =
|
|
1474
|
+
jsonSchema.request[def.key] = import_valleyed7.v.schema(pipe);
|
|
1559
1475
|
}
|
|
1560
1476
|
if (def.type === "response") {
|
|
1561
1477
|
const pipeRecords = errorsSchemas.concat({ status: defaultStatusCode, contentType, pipe });
|
|
1562
|
-
responsePipeDefs[def.key] =
|
|
1478
|
+
responsePipeDefs[def.key] = import_valleyed7.v.any().pipe((input) => {
|
|
1563
1479
|
const p = pipeRecords.find((rec) => rec.status === status)?.pipe;
|
|
1564
|
-
if (!p) throw
|
|
1565
|
-
const r =
|
|
1480
|
+
if (!p) throw import_valleyed7.PipeError.root(`schema not defined for status code: ${status}`, input);
|
|
1481
|
+
const r = import_valleyed7.v.validate(p, input);
|
|
1566
1482
|
if (!r.valid) throw r.error;
|
|
1567
1483
|
return r.value;
|
|
1568
1484
|
});
|
|
1569
1485
|
jsonSchema.response[def.key] = pipeRecords.map((record) => ({
|
|
1570
1486
|
status: record.status,
|
|
1571
1487
|
contentType: record.contentType,
|
|
1572
|
-
schema:
|
|
1488
|
+
schema: import_valleyed7.v.schema(record.pipe)
|
|
1573
1489
|
}));
|
|
1574
1490
|
}
|
|
1575
1491
|
});
|
|
1576
|
-
const requestPipe =
|
|
1577
|
-
|
|
1578
|
-
const responsePipe =
|
|
1579
|
-
|
|
1492
|
+
const requestPipe = import_valleyed7.v.object(requestPipeDefs);
|
|
1493
|
+
import_valleyed7.v.compile(requestPipe, { allErrors: true });
|
|
1494
|
+
const responsePipe = import_valleyed7.v.object(responsePipeDefs);
|
|
1495
|
+
import_valleyed7.v.compile(responsePipe, { allErrors: true });
|
|
1580
1496
|
const validateRequest = async (request) => {
|
|
1581
1497
|
if (!Object.keys(requestPipeDefs)) return request;
|
|
1582
1498
|
const validity = requestLocalStorage.run(
|
|
1583
1499
|
request,
|
|
1584
|
-
() =>
|
|
1500
|
+
() => import_valleyed7.v.validate(requestPipe, {
|
|
1585
1501
|
params: request.params,
|
|
1586
1502
|
headers: request.headers,
|
|
1587
1503
|
query: request.query,
|
|
@@ -1603,7 +1519,7 @@ var Server = class {
|
|
|
1603
1519
|
contentType = response.contentType;
|
|
1604
1520
|
const validity = responseLocalStorage.run(
|
|
1605
1521
|
response,
|
|
1606
|
-
() =>
|
|
1522
|
+
() => import_valleyed7.v.validate(responsePipe, {
|
|
1607
1523
|
responseHeaders: response.headers,
|
|
1608
1524
|
responseCookies: Object.fromEntries(Object.entries(response.cookies).map(([key, val]) => [key, val.value])),
|
|
1609
1525
|
response: response.body
|
|
@@ -1854,6 +1770,157 @@ var ValidationError = class extends RequestError {
|
|
|
1854
1770
|
}
|
|
1855
1771
|
};
|
|
1856
1772
|
|
|
1773
|
+
// src/utilities/configurable.ts
|
|
1774
|
+
var import_valleyed9 = require("valleyed");
|
|
1775
|
+
function configurable(pipeFn, base) {
|
|
1776
|
+
const pipe = pipeFn();
|
|
1777
|
+
import_valleyed9.v.compile(pipe);
|
|
1778
|
+
class Configurable extends base {
|
|
1779
|
+
constructor(config, ...baseArgs) {
|
|
1780
|
+
super(...baseArgs);
|
|
1781
|
+
this.config = config;
|
|
1782
|
+
}
|
|
1783
|
+
static create(input, ...args) {
|
|
1784
|
+
const r = import_valleyed9.v.validate(pipe, input);
|
|
1785
|
+
if (!r.valid) throw r.error;
|
|
1786
|
+
return new this(r.value, ...args);
|
|
1787
|
+
}
|
|
1788
|
+
}
|
|
1789
|
+
return Configurable;
|
|
1790
|
+
}
|
|
1791
|
+
if (void 0) {
|
|
1792
|
+
const { describe, test, expect, expectTypeOf } = void 0;
|
|
1793
|
+
const { v: v8 } = null;
|
|
1794
|
+
const testPipe = () => v8.object({
|
|
1795
|
+
host: v8.string(),
|
|
1796
|
+
port: v8.number()
|
|
1797
|
+
});
|
|
1798
|
+
class TestBase {
|
|
1799
|
+
baseValue;
|
|
1800
|
+
constructor() {
|
|
1801
|
+
this.baseValue = "base";
|
|
1802
|
+
}
|
|
1803
|
+
}
|
|
1804
|
+
class TestBaseWithArgs {
|
|
1805
|
+
label;
|
|
1806
|
+
constructor(label) {
|
|
1807
|
+
this.label = label;
|
|
1808
|
+
}
|
|
1809
|
+
}
|
|
1810
|
+
describe("configurable", () => {
|
|
1811
|
+
test("validation runs in static create before constructor body executes", () => {
|
|
1812
|
+
let constructorRan = false;
|
|
1813
|
+
const Wrapped = configurable(testPipe, TestBase);
|
|
1814
|
+
class MyClass extends Wrapped {
|
|
1815
|
+
constructor(config) {
|
|
1816
|
+
super(config);
|
|
1817
|
+
constructorRan = true;
|
|
1818
|
+
}
|
|
1819
|
+
}
|
|
1820
|
+
expect(() => MyClass.create({ host: 123, port: "bad" })).toThrow();
|
|
1821
|
+
expect(constructorRan).toBe(false);
|
|
1822
|
+
MyClass.create({ host: "localhost", port: 3e3 });
|
|
1823
|
+
expect(constructorRan).toBe(true);
|
|
1824
|
+
});
|
|
1825
|
+
test("constructor receives validated value", () => {
|
|
1826
|
+
const Wrapped = configurable(testPipe, TestBase);
|
|
1827
|
+
let receivedConfig;
|
|
1828
|
+
class MyClass extends Wrapped {
|
|
1829
|
+
constructor(config) {
|
|
1830
|
+
super(config);
|
|
1831
|
+
receivedConfig = this.config;
|
|
1832
|
+
}
|
|
1833
|
+
}
|
|
1834
|
+
MyClass.create({ host: "localhost", port: 3e3 });
|
|
1835
|
+
expect(receivedConfig).toEqual({ host: "localhost", port: 3e3 });
|
|
1836
|
+
});
|
|
1837
|
+
test("external new is a compile error", () => {
|
|
1838
|
+
const Wrapped = configurable(testPipe, TestBase);
|
|
1839
|
+
class MyClass extends Wrapped {
|
|
1840
|
+
constructor(config) {
|
|
1841
|
+
super(config);
|
|
1842
|
+
}
|
|
1843
|
+
}
|
|
1844
|
+
void (() => new MyClass({ host: "localhost", port: 3e3 }));
|
|
1845
|
+
});
|
|
1846
|
+
test("static Config resolves to PipeOutput<P> at the type level", () => {
|
|
1847
|
+
const Wrapped = configurable(testPipe, TestBase);
|
|
1848
|
+
class MyClass extends Wrapped {
|
|
1849
|
+
constructor(config) {
|
|
1850
|
+
super(config);
|
|
1851
|
+
}
|
|
1852
|
+
}
|
|
1853
|
+
expectTypeOf().toEqualTypeOf();
|
|
1854
|
+
expect(MyClass.create).toBeTypeOf("function");
|
|
1855
|
+
});
|
|
1856
|
+
test("ConstructorParameters<This>-based extras inference works for non-zero-arg leaf signatures", () => {
|
|
1857
|
+
const Wrapped = configurable(testPipe, TestBase);
|
|
1858
|
+
class MyClass extends Wrapped {
|
|
1859
|
+
extra;
|
|
1860
|
+
constructor(config, extra) {
|
|
1861
|
+
super(config);
|
|
1862
|
+
this.extra = extra;
|
|
1863
|
+
}
|
|
1864
|
+
}
|
|
1865
|
+
const instance = MyClass.create({ host: "localhost", port: 3e3 }, 42);
|
|
1866
|
+
expect(instance.extra).toBe(42);
|
|
1867
|
+
expectTypeOf(instance).toHaveProperty("extra");
|
|
1868
|
+
expectTypeOf(instance.extra).toEqualTypeOf();
|
|
1869
|
+
void (() => MyClass.create({ host: "localhost", port: 3e3 }, "not-a-number"));
|
|
1870
|
+
});
|
|
1871
|
+
test("base-args forwarding works for non-zero-arg bases", () => {
|
|
1872
|
+
const Wrapped = configurable(testPipe, TestBaseWithArgs);
|
|
1873
|
+
class MyClass extends Wrapped {
|
|
1874
|
+
constructor(config, label) {
|
|
1875
|
+
super(config, label);
|
|
1876
|
+
}
|
|
1877
|
+
}
|
|
1878
|
+
const instance = MyClass.create({ host: "localhost", port: 3e3 }, "test-label");
|
|
1879
|
+
expect(instance.label).toBe("test-label");
|
|
1880
|
+
});
|
|
1881
|
+
test("config is accessible as protected readonly on instances", () => {
|
|
1882
|
+
const Wrapped = configurable(testPipe, TestBase);
|
|
1883
|
+
class MyClass extends Wrapped {
|
|
1884
|
+
constructor(config) {
|
|
1885
|
+
super(config);
|
|
1886
|
+
}
|
|
1887
|
+
getHost() {
|
|
1888
|
+
return this.config.host;
|
|
1889
|
+
}
|
|
1890
|
+
}
|
|
1891
|
+
const instance = MyClass.create({ host: "localhost", port: 3e3 });
|
|
1892
|
+
expect(instance.getHost()).toBe("localhost");
|
|
1893
|
+
});
|
|
1894
|
+
test("accepts an abstract base class", () => {
|
|
1895
|
+
class AbstractBase {
|
|
1896
|
+
}
|
|
1897
|
+
const Wrapped = configurable(testPipe, AbstractBase);
|
|
1898
|
+
class Concrete extends Wrapped {
|
|
1899
|
+
constructor(config) {
|
|
1900
|
+
super(config);
|
|
1901
|
+
}
|
|
1902
|
+
greet() {
|
|
1903
|
+
return `hello from ${this.config.host}`;
|
|
1904
|
+
}
|
|
1905
|
+
}
|
|
1906
|
+
const instance = Concrete.create({ host: "localhost", port: 3e3 });
|
|
1907
|
+
expect(instance.greet()).toBe("hello from localhost");
|
|
1908
|
+
expectTypeOf(instance).toHaveProperty("config");
|
|
1909
|
+
});
|
|
1910
|
+
});
|
|
1911
|
+
}
|
|
1912
|
+
|
|
1913
|
+
// src/utilities/media.ts
|
|
1914
|
+
var import_music_metadata = require("music-metadata");
|
|
1915
|
+
var getMediaDuration = async (buffer) => {
|
|
1916
|
+
try {
|
|
1917
|
+
const meta = await (0, import_music_metadata.parseBuffer)(buffer);
|
|
1918
|
+
return meta.format.duration ?? 0;
|
|
1919
|
+
} catch {
|
|
1920
|
+
return 0;
|
|
1921
|
+
}
|
|
1922
|
+
};
|
|
1923
|
+
|
|
1857
1924
|
// src/server/adapters/fastify/index.ts
|
|
1858
1925
|
var FastifyServer = class extends configurable(serverConfigPipe, Server) {
|
|
1859
1926
|
#app;
|