@slicemachine/manager 0.1.1-dev-plugins.4 → 0.1.1-dev-plugins.5
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/__node_modules/@msgpack/msgpack/dist.es5_esm/CachedKeyDecoder.cjs +65 -0
- package/dist/__node_modules/@msgpack/msgpack/dist.es5_esm/CachedKeyDecoder.cjs.map +1 -0
- package/dist/__node_modules/@msgpack/msgpack/dist.es5_esm/CachedKeyDecoder.js +65 -0
- package/dist/__node_modules/@msgpack/msgpack/dist.es5_esm/CachedKeyDecoder.js.map +1 -0
- package/dist/__node_modules/@msgpack/msgpack/dist.es5_esm/DecodeError.cjs +40 -0
- package/dist/__node_modules/@msgpack/msgpack/dist.es5_esm/DecodeError.cjs.map +1 -0
- package/dist/__node_modules/@msgpack/msgpack/dist.es5_esm/DecodeError.js +40 -0
- package/dist/__node_modules/@msgpack/msgpack/dist.es5_esm/DecodeError.js.map +1 -0
- package/dist/__node_modules/@msgpack/msgpack/dist.es5_esm/Decoder.cjs +801 -0
- package/dist/__node_modules/@msgpack/msgpack/dist.es5_esm/Decoder.cjs.map +1 -0
- package/dist/__node_modules/@msgpack/msgpack/dist.es5_esm/Decoder.js +801 -0
- package/dist/__node_modules/@msgpack/msgpack/dist.es5_esm/Decoder.js.map +1 -0
- package/dist/__node_modules/@msgpack/msgpack/dist.es5_esm/Encoder.cjs +351 -0
- package/dist/__node_modules/@msgpack/msgpack/dist.es5_esm/Encoder.cjs.map +1 -0
- package/dist/__node_modules/@msgpack/msgpack/dist.es5_esm/Encoder.js +351 -0
- package/dist/__node_modules/@msgpack/msgpack/dist.es5_esm/Encoder.js.map +1 -0
- package/dist/__node_modules/@msgpack/msgpack/dist.es5_esm/ExtData.cjs +11 -0
- package/dist/__node_modules/@msgpack/msgpack/dist.es5_esm/ExtData.cjs.map +1 -0
- package/dist/__node_modules/@msgpack/msgpack/dist.es5_esm/ExtData.js +11 -0
- package/dist/__node_modules/@msgpack/msgpack/dist.es5_esm/ExtData.js.map +1 -0
- package/dist/__node_modules/@msgpack/msgpack/dist.es5_esm/ExtensionCodec.cjs +62 -0
- package/dist/__node_modules/@msgpack/msgpack/dist.es5_esm/ExtensionCodec.cjs.map +1 -0
- package/dist/__node_modules/@msgpack/msgpack/dist.es5_esm/ExtensionCodec.js +62 -0
- package/dist/__node_modules/@msgpack/msgpack/dist.es5_esm/ExtensionCodec.js.map +1 -0
- package/dist/__node_modules/@msgpack/msgpack/dist.es5_esm/decode.cjs +14 -0
- package/dist/__node_modules/@msgpack/msgpack/dist.es5_esm/decode.cjs.map +1 -0
- package/dist/__node_modules/@msgpack/msgpack/dist.es5_esm/decode.js +14 -0
- package/dist/__node_modules/@msgpack/msgpack/dist.es5_esm/decode.js.map +1 -0
- package/dist/__node_modules/@msgpack/msgpack/dist.es5_esm/encode.cjs +13 -0
- package/dist/__node_modules/@msgpack/msgpack/dist.es5_esm/encode.cjs.map +1 -0
- package/dist/__node_modules/@msgpack/msgpack/dist.es5_esm/encode.js +13 -0
- package/dist/__node_modules/@msgpack/msgpack/dist.es5_esm/encode.js.map +1 -0
- package/dist/__node_modules/@msgpack/msgpack/dist.es5_esm/timestamp.cjs +91 -0
- package/dist/__node_modules/@msgpack/msgpack/dist.es5_esm/timestamp.cjs.map +1 -0
- package/dist/__node_modules/@msgpack/msgpack/dist.es5_esm/timestamp.js +91 -0
- package/dist/__node_modules/@msgpack/msgpack/dist.es5_esm/timestamp.js.map +1 -0
- package/dist/__node_modules/@msgpack/msgpack/dist.es5_esm/utils/int.cjs +31 -0
- package/dist/__node_modules/@msgpack/msgpack/dist.es5_esm/utils/int.cjs.map +1 -0
- package/dist/__node_modules/@msgpack/msgpack/dist.es5_esm/utils/int.js +31 -0
- package/dist/__node_modules/@msgpack/msgpack/dist.es5_esm/utils/int.js.map +1 -0
- package/dist/__node_modules/@msgpack/msgpack/dist.es5_esm/utils/prettyByte.cjs +7 -0
- package/dist/__node_modules/@msgpack/msgpack/dist.es5_esm/utils/prettyByte.cjs.map +1 -0
- package/dist/__node_modules/@msgpack/msgpack/dist.es5_esm/utils/prettyByte.js +7 -0
- package/dist/__node_modules/@msgpack/msgpack/dist.es5_esm/utils/prettyByte.js.map +1 -0
- package/dist/__node_modules/@msgpack/msgpack/dist.es5_esm/utils/typedArrays.cjs +23 -0
- package/dist/__node_modules/@msgpack/msgpack/dist.es5_esm/utils/typedArrays.cjs.map +1 -0
- package/dist/__node_modules/@msgpack/msgpack/dist.es5_esm/utils/typedArrays.js +23 -0
- package/dist/__node_modules/@msgpack/msgpack/dist.es5_esm/utils/typedArrays.js.map +1 -0
- package/dist/__node_modules/@msgpack/msgpack/dist.es5_esm/utils/utf8.cjs +132 -0
- package/dist/__node_modules/@msgpack/msgpack/dist.es5_esm/utils/utf8.cjs.map +1 -0
- package/dist/__node_modules/@msgpack/msgpack/dist.es5_esm/utils/utf8.js +132 -0
- package/dist/__node_modules/@msgpack/msgpack/dist.es5_esm/utils/utf8.js.map +1 -0
- package/dist/__node_modules/r19/dist/client/createRPCClient.cjs +29 -11
- package/dist/__node_modules/r19/dist/client/createRPCClient.cjs.map +1 -1
- package/dist/__node_modules/r19/dist/client/createRPCClient.js +29 -11
- package/dist/__node_modules/r19/dist/client/createRPCClient.js.map +1 -1
- package/dist/__node_modules/r19/dist/createRPCMiddleware.cjs +5 -4
- package/dist/__node_modules/r19/dist/createRPCMiddleware.cjs.map +1 -1
- package/dist/__node_modules/r19/dist/createRPCMiddleware.js +6 -5
- package/dist/__node_modules/r19/dist/createRPCMiddleware.js.map +1 -1
- package/dist/__node_modules/r19/dist/handleRPCRequest.cjs +39 -110
- package/dist/__node_modules/r19/dist/handleRPCRequest.cjs.map +1 -1
- package/dist/__node_modules/r19/dist/handleRPCRequest.js +39 -110
- package/dist/__node_modules/r19/dist/handleRPCRequest.js.map +1 -1
- package/dist/__node_modules/r19/dist/lib/replaceLeaves.cjs +28 -0
- package/dist/__node_modules/r19/dist/lib/replaceLeaves.cjs.map +1 -0
- package/dist/__node_modules/r19/dist/lib/replaceLeaves.js +28 -0
- package/dist/__node_modules/r19/dist/lib/replaceLeaves.js.map +1 -0
- package/dist/managers/createSliceMachineManagerMiddleware.cjs +0 -4
- package/dist/managers/createSliceMachineManagerMiddleware.cjs.map +1 -1
- package/dist/managers/createSliceMachineManagerMiddleware.js +0 -4
- package/dist/managers/createSliceMachineManagerMiddleware.js.map +1 -1
- package/dist/managers/screenshots/ScreenshotsManager.cjs +33 -16
- package/dist/managers/screenshots/ScreenshotsManager.cjs.map +1 -1
- package/dist/managers/screenshots/ScreenshotsManager.d.ts +2 -4
- package/dist/managers/screenshots/ScreenshotsManager.js +34 -17
- package/dist/managers/screenshots/ScreenshotsManager.js.map +1 -1
- package/dist/test/createSliceMachineManagerMSWHandler.cjs +3 -10
- package/dist/test/createSliceMachineManagerMSWHandler.cjs.map +1 -1
- package/dist/test/createSliceMachineManagerMSWHandler.js +3 -10
- package/dist/test/createSliceMachineManagerMSWHandler.js.map +1 -1
- package/package.json +4 -4
- package/src/client/index.ts +1 -1
- package/src/managers/screenshots/ScreenshotsManager.ts +65 -18
- package/src/test/createSliceMachineManagerMSWHandler.ts +2 -14
- package/dist/__node_modules/busboy/lib/index.cjs +0 -51
- package/dist/__node_modules/busboy/lib/index.cjs.map +0 -1
- package/dist/__node_modules/busboy/lib/index.js +0 -52
- package/dist/__node_modules/busboy/lib/index.js.map +0 -1
- package/dist/__node_modules/busboy/lib/types/multipart.cjs +0 -1046
- package/dist/__node_modules/busboy/lib/types/multipart.cjs.map +0 -1
- package/dist/__node_modules/busboy/lib/types/multipart.js +0 -1047
- package/dist/__node_modules/busboy/lib/types/multipart.js.map +0 -1
- package/dist/__node_modules/busboy/lib/types/urlencoded.cjs +0 -545
- package/dist/__node_modules/busboy/lib/types/urlencoded.cjs.map +0 -1
- package/dist/__node_modules/busboy/lib/types/urlencoded.js +0 -546
- package/dist/__node_modules/busboy/lib/types/urlencoded.js.map +0 -1
- package/dist/__node_modules/busboy/lib/utils.cjs +0 -1681
- package/dist/__node_modules/busboy/lib/utils.cjs.map +0 -1
- package/dist/__node_modules/busboy/lib/utils.js +0 -1682
- package/dist/__node_modules/busboy/lib/utils.js.map +0 -1
- package/dist/__node_modules/devalue/src/constants.cjs +0 -15
- package/dist/__node_modules/devalue/src/constants.cjs.map +0 -1
- package/dist/__node_modules/devalue/src/constants.js +0 -15
- package/dist/__node_modules/devalue/src/constants.js.map +0 -1
- package/dist/__node_modules/devalue/src/parse.cjs +0 -95
- package/dist/__node_modules/devalue/src/parse.cjs.map +0 -1
- package/dist/__node_modules/devalue/src/parse.js +0 -95
- package/dist/__node_modules/devalue/src/parse.js.map +0 -1
- package/dist/__node_modules/devalue/src/stringify.cjs +0 -140
- package/dist/__node_modules/devalue/src/stringify.cjs.map +0 -1
- package/dist/__node_modules/devalue/src/stringify.js +0 -140
- package/dist/__node_modules/devalue/src/stringify.js.map +0 -1
- package/dist/__node_modules/devalue/src/uneval.cjs +0 -4
- package/dist/__node_modules/devalue/src/uneval.cjs.map +0 -1
- package/dist/__node_modules/devalue/src/uneval.js +0 -3
- package/dist/__node_modules/devalue/src/uneval.js.map +0 -1
- package/dist/__node_modules/devalue/src/utils.cjs +0 -68
- package/dist/__node_modules/devalue/src/utils.cjs.map +0 -1
- package/dist/__node_modules/devalue/src/utils.js +0 -68
- package/dist/__node_modules/devalue/src/utils.js.map +0 -1
- package/dist/__node_modules/formdata-node/lib/browser.cjs +0 -16
- package/dist/__node_modules/formdata-node/lib/browser.cjs.map +0 -1
- package/dist/__node_modules/formdata-node/lib/browser.js +0 -16
- package/dist/__node_modules/formdata-node/lib/browser.js.map +0 -1
- package/dist/__node_modules/r19/dist/constants.cjs +0 -5
- package/dist/__node_modules/r19/dist/constants.cjs.map +0 -1
- package/dist/__node_modules/r19/dist/constants.js +0 -5
- package/dist/__node_modules/r19/dist/constants.js.map +0 -1
- package/dist/__node_modules/r19/dist/lib/encodeFormData.cjs +0 -46
- package/dist/__node_modules/r19/dist/lib/encodeFormData.cjs.map +0 -1
- package/dist/__node_modules/r19/dist/lib/encodeFormData.js +0 -46
- package/dist/__node_modules/r19/dist/lib/encodeFormData.js.map +0 -1
- package/dist/__node_modules/r19/dist/lib/flattenObject.cjs +0 -43
- package/dist/__node_modules/r19/dist/lib/flattenObject.cjs.map +0 -1
- package/dist/__node_modules/r19/dist/lib/flattenObject.js +0 -43
- package/dist/__node_modules/r19/dist/lib/flattenObject.js.map +0 -1
- package/dist/__node_modules/r19/dist/lib/formDataToObject.client.cjs +0 -19
- package/dist/__node_modules/r19/dist/lib/formDataToObject.client.cjs.map +0 -1
- package/dist/__node_modules/r19/dist/lib/formDataToObject.client.js +0 -19
- package/dist/__node_modules/r19/dist/lib/formDataToObject.client.js.map +0 -1
- package/dist/__node_modules/r19/dist/lib/objectToFormData.client.cjs +0 -20
- package/dist/__node_modules/r19/dist/lib/objectToFormData.client.cjs.map +0 -1
- package/dist/__node_modules/r19/dist/lib/objectToFormData.client.js +0 -20
- package/dist/__node_modules/r19/dist/lib/objectToFormData.client.js.map +0 -1
- package/dist/__node_modules/r19/dist/lib/objectToFormData.server.cjs +0 -22
- package/dist/__node_modules/r19/dist/lib/objectToFormData.server.cjs.map +0 -1
- package/dist/__node_modules/r19/dist/lib/objectToFormData.server.js +0 -22
- package/dist/__node_modules/r19/dist/lib/objectToFormData.server.js.map +0 -1
- package/dist/__node_modules/r19/dist/lib/unflattenObject.cjs +0 -20
- package/dist/__node_modules/r19/dist/lib/unflattenObject.cjs.map +0 -1
- package/dist/__node_modules/r19/dist/lib/unflattenObject.js +0 -20
- package/dist/__node_modules/r19/dist/lib/unflattenObject.js.map +0 -1
- package/dist/__node_modules/streamsearch/lib/sbmh.cjs +0 -393
- package/dist/__node_modules/streamsearch/lib/sbmh.cjs.map +0 -1
- package/dist/__node_modules/streamsearch/lib/sbmh.js +0 -394
- package/dist/__node_modules/streamsearch/lib/sbmh.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handleRPCRequest.cjs","sources":["../../../../../../node_modules/r19/dist/handleRPCRequest.js"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"handleRPCRequest.cjs","sources":["../../../../../../node_modules/r19/dist/handleRPCRequest.js"],"sourcesContent":["import { Buffer } from \"node:buffer\";\nimport { decode, encode } from \"@msgpack/msgpack\";\nimport { isErrorLike } from \"./lib/isErrorLike.js\";\nimport { replaceLeaves } from \"./lib/replaceLeaves.js\";\nconst findProcedure = (procedures, path) => {\n path = [...path];\n let proceduresPointer = procedures;\n while (path.length > 0) {\n const pathSegment = path.shift();\n if (pathSegment) {\n proceduresPointer = proceduresPointer[pathSegment];\n if (typeof proceduresPointer === \"function\") {\n return proceduresPointer;\n } else if (proceduresPointer === void 0) {\n return;\n }\n }\n }\n};\nconst handleRPCRequest = async (args) => {\n if (!args.body) {\n throw new Error(\"Invalid request body. Only requests from an r19 client are accepted.\");\n }\n const clientArgs = decode(Buffer.from(args.body));\n const procedure = findProcedure(args.procedures, clientArgs.procedurePath);\n const headers = {\n \"Content-Type\": \"application/msgpack\"\n };\n if (!procedure) {\n const body = encode({\n error: {\n name: \"RPCError\",\n message: `Invalid procedure name: ${clientArgs.procedurePath.join(\".\")}`\n }\n });\n return {\n body,\n headers,\n statusCode: 500\n };\n }\n let res;\n try {\n const procedureArgs = await replaceLeaves(clientArgs.procedureArgs, async (value) => {\n if (value instanceof ArrayBuffer) {\n return Buffer.from(value);\n }\n return value;\n });\n res = await procedure(procedureArgs);\n res = await replaceLeaves(res, async (value) => {\n if (isErrorLike(value)) {\n return {\n name: value.name,\n message: value.message,\n stack: process.env.NODE_ENV === \"development\" ? value.stack : void 0\n };\n }\n if (typeof value === \"function\") {\n throw new Error(\"r19 does not support function return values.\");\n }\n return value;\n });\n } catch (error) {\n if (isErrorLike(error)) {\n const body = encode({\n error: {\n name: error.name,\n message: error.message,\n stack: process.env.NODE_ENV === \"development\" ? error.stack : void 0\n }\n }, { ignoreUndefined: true });\n return {\n body,\n headers,\n statusCode: 500\n };\n }\n throw error;\n }\n try {\n const body = encode({\n data: res\n }, { ignoreUndefined: true });\n return {\n body,\n headers\n };\n } catch (error) {\n if (error instanceof Error) {\n console.error(error);\n const body = encode({\n error: {\n name: \"RPCError\",\n message: \"Unable to serialize server response. Check the server log for details.\"\n }\n });\n return {\n body,\n headers,\n statusCode: 500\n };\n }\n throw error;\n }\n};\nexport {\n handleRPCRequest\n};\n//# sourceMappingURL=handleRPCRequest.js.map\n"],"names":["decode","Buffer","encode","replaceLeaves","isErrorLike"],"mappings":";;;;;;;AAIA,MAAM,gBAAgB,CAAC,YAAY,SAAS;AAC1C,SAAO,CAAC,GAAG,IAAI;AACf,MAAI,oBAAoB;AACxB,SAAO,KAAK,SAAS,GAAG;AACtB,UAAM,cAAc,KAAK;AACzB,QAAI,aAAa;AACf,0BAAoB,kBAAkB,WAAW;AACjD,UAAI,OAAO,sBAAsB,YAAY;AAC3C,eAAO;AAAA,MACf,WAAiB,sBAAsB,QAAQ;AACvC;AAAA,MACD;AAAA,IACF;AAAA,EACF;AACH;AACK,MAAC,mBAAmB,OAAO,SAAS;AACvC,MAAI,CAAC,KAAK,MAAM;AACd,UAAM,IAAI,MAAM,sEAAsE;AAAA,EACvF;AACD,QAAM,aAAaA,OAAAA,OAAOC,YAAM,OAAC,KAAK,KAAK,IAAI,CAAC;AAChD,QAAM,YAAY,cAAc,KAAK,YAAY,WAAW,aAAa;AACzE,QAAM,UAAU;AAAA,IACd,gBAAgB;AAAA,EACpB;AACE,MAAI,CAAC,WAAW;AACd,UAAM,OAAOC,OAAAA,OAAO;AAAA,MAClB,OAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,2BAA2B,WAAW,cAAc,KAAK,GAAG;AAAA,MACtE;AAAA,IACP,CAAK;AACD,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,YAAY;AAAA,IAClB;AAAA,EACG;AACD,MAAI;AACJ,MAAI;AACF,UAAM,gBAAgB,MAAMC,cAAa,cAAC,WAAW,eAAe,OAAO,UAAU;AACnF,UAAI,iBAAiB,aAAa;AAChC,eAAOF,YAAM,OAAC,KAAK,KAAK;AAAA,MACzB;AACD,aAAO;AAAA,IACb,CAAK;AACD,UAAM,MAAM,UAAU,aAAa;AACnC,UAAM,MAAME,cAAAA,cAAc,KAAK,OAAO,UAAU;AAC9C,UAAIC,YAAAA,YAAY,KAAK,GAAG;AACtB,eAAO;AAAA,UACL,MAAM,MAAM;AAAA,UACZ,SAAS,MAAM;AAAA,UACf,OAAO,QAAQ,IAAI,aAAa,gBAAgB,MAAM,QAAQ;AAAA,QACxE;AAAA,MACO;AACD,UAAI,OAAO,UAAU,YAAY;AAC/B,cAAM,IAAI,MAAM,8CAA8C;AAAA,MAC/D;AACD,aAAO;AAAA,IACb,CAAK;AAAA,EACF,SAAQ,OAAP;AACA,QAAIA,YAAAA,YAAY,KAAK,GAAG;AACtB,YAAM,OAAOF,OAAAA,OAAO;AAAA,QAClB,OAAO;AAAA,UACL,MAAM,MAAM;AAAA,UACZ,SAAS,MAAM;AAAA,UACf,OAAO,QAAQ,IAAI,aAAa,gBAAgB,MAAM,QAAQ;AAAA,QAC/D;AAAA,MACT,GAAS,EAAE,iBAAiB,KAAI,CAAE;AAC5B,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA,YAAY;AAAA,MACpB;AAAA,IACK;AACD,UAAM;AAAA,EACP;AACD,MAAI;AACF,UAAM,OAAOA,OAAAA,OAAO;AAAA,MAClB,MAAM;AAAA,IACZ,GAAO,EAAE,iBAAiB,KAAI,CAAE;AAC5B,WAAO;AAAA,MACL;AAAA,MACA;AAAA,IACN;AAAA,EACG,SAAQ,OAAP;AACA,QAAI,iBAAiB,OAAO;AAC1B,cAAQ,MAAM,KAAK;AACnB,YAAM,OAAOA,OAAAA,OAAO;AAAA,QAClB,OAAO;AAAA,UACL,MAAM;AAAA,UACN,SAAS;AAAA,QACV;AAAA,MACT,CAAO;AACD,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA,YAAY;AAAA,MACpB;AAAA,IACK;AACD,UAAM;AAAA,EACP;AACH;;"}
|
|
@@ -1,15 +1,8 @@
|
|
|
1
|
-
import { Readable } from "node:stream";
|
|
2
1
|
import { Buffer } from "node:buffer";
|
|
3
|
-
import
|
|
4
|
-
import "
|
|
5
|
-
import { parse } from "../../devalue/src/parse.js";
|
|
6
|
-
import "../../devalue/src/utils.js";
|
|
7
|
-
import { encodeFormData } from "./lib/encodeFormData.js";
|
|
2
|
+
import { encode } from "../../@msgpack/msgpack/dist.es5_esm/encode.js";
|
|
3
|
+
import { decode } from "../../@msgpack/msgpack/dist.es5_esm/decode.js";
|
|
8
4
|
import { isErrorLike } from "./lib/isErrorLike.js";
|
|
9
|
-
import {
|
|
10
|
-
import { unflattenObject } from "./lib/unflattenObject.js";
|
|
11
|
-
import { formDataToObject } from "./lib/formDataToObject.client.js";
|
|
12
|
-
import { FORM_DATA_BOUNDARY_PREFIX } from "./constants.js";
|
|
5
|
+
import { replaceLeaves } from "./lib/replaceLeaves.js";
|
|
13
6
|
const findProcedure = (procedures, path) => {
|
|
14
7
|
path = [...path];
|
|
15
8
|
let proceduresPointer = procedures;
|
|
@@ -25,119 +18,61 @@ const findProcedure = (procedures, path) => {
|
|
|
25
18
|
}
|
|
26
19
|
}
|
|
27
20
|
};
|
|
28
|
-
const readRPCClientArgs = async (args) => {
|
|
29
|
-
const bb = lib({
|
|
30
|
-
headers: {
|
|
31
|
-
"content-type": args.contentTypeHeader
|
|
32
|
-
}
|
|
33
|
-
});
|
|
34
|
-
const clientArgs = {};
|
|
35
|
-
const promise = new Promise((resolve, reject) => {
|
|
36
|
-
bb.on("file", (name, file, _info) => {
|
|
37
|
-
const chunks = [];
|
|
38
|
-
file.on("data", (data) => {
|
|
39
|
-
chunks.push(data);
|
|
40
|
-
});
|
|
41
|
-
file.on("close", () => {
|
|
42
|
-
clientArgs[name] = Buffer.concat(chunks);
|
|
43
|
-
});
|
|
44
|
-
});
|
|
45
|
-
bb.on("field", (name, value, _info) => {
|
|
46
|
-
clientArgs[name] = parse(value);
|
|
47
|
-
});
|
|
48
|
-
bb.on("close", () => {
|
|
49
|
-
const unflattenedArgs = unflattenObject(clientArgs);
|
|
50
|
-
resolve(unflattenedArgs);
|
|
51
|
-
});
|
|
52
|
-
bb.on("error", (error) => {
|
|
53
|
-
reject(error);
|
|
54
|
-
});
|
|
55
|
-
});
|
|
56
|
-
Readable.from(args.body).pipe(bb);
|
|
57
|
-
return promise;
|
|
58
|
-
};
|
|
59
|
-
const isPlainObject = (value) => {
|
|
60
|
-
if (typeof value !== "object" || value === null) {
|
|
61
|
-
return false;
|
|
62
|
-
}
|
|
63
|
-
const prototype = Object.getPrototypeOf(value);
|
|
64
|
-
return (prototype === null || prototype === Object.prototype || Object.getPrototypeOf(prototype) === null) && !(Symbol.toStringTag in value) && !(Symbol.iterator in value);
|
|
65
|
-
};
|
|
66
|
-
const prepareRes = (res) => {
|
|
67
|
-
if (Array.isArray(res)) {
|
|
68
|
-
const preparedRes = [];
|
|
69
|
-
for (let i = 0; i < res.length; i++) {
|
|
70
|
-
preparedRes[i] = prepareRes(res[i]);
|
|
71
|
-
}
|
|
72
|
-
return preparedRes;
|
|
73
|
-
}
|
|
74
|
-
if (isPlainObject(res)) {
|
|
75
|
-
const preparedRes = {};
|
|
76
|
-
for (const key in res) {
|
|
77
|
-
preparedRes[key] = prepareRes(res[key]);
|
|
78
|
-
}
|
|
79
|
-
return preparedRes;
|
|
80
|
-
}
|
|
81
|
-
if (res instanceof Error || isErrorLike(res)) {
|
|
82
|
-
return {
|
|
83
|
-
name: res.name,
|
|
84
|
-
message: res.message,
|
|
85
|
-
stack: process.env.NODE_ENV === "development" ? res.stack : void 0
|
|
86
|
-
};
|
|
87
|
-
}
|
|
88
|
-
return res;
|
|
89
|
-
};
|
|
90
21
|
const handleRPCRequest = async (args) => {
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
if (!args.body) {
|
|
94
|
-
throw new Error("Invalid request body. Only requests from an r19 client are accepted.");
|
|
95
|
-
}
|
|
96
|
-
if (!args.contentTypeHeader) {
|
|
97
|
-
throw new Error("Invalid Content-Type header. Only requests from an r19 client are accepted.");
|
|
98
|
-
}
|
|
99
|
-
clientArgs = await readRPCClientArgs({
|
|
100
|
-
contentTypeHeader: args.contentTypeHeader,
|
|
101
|
-
body: args.body
|
|
102
|
-
});
|
|
103
|
-
} else {
|
|
104
|
-
clientArgs = formDataToObject(args.formData);
|
|
22
|
+
if (!args.body) {
|
|
23
|
+
throw new Error("Invalid request body. Only requests from an r19 client are accepted.");
|
|
105
24
|
}
|
|
25
|
+
const clientArgs = decode(Buffer.from(args.body));
|
|
106
26
|
const procedure = findProcedure(args.procedures, clientArgs.procedurePath);
|
|
27
|
+
const headers = {
|
|
28
|
+
"Content-Type": "application/msgpack"
|
|
29
|
+
};
|
|
107
30
|
if (!procedure) {
|
|
108
|
-
const
|
|
31
|
+
const body = encode({
|
|
109
32
|
error: {
|
|
110
33
|
name: "RPCError",
|
|
111
34
|
message: `Invalid procedure name: ${clientArgs.procedurePath.join(".")}`
|
|
112
35
|
}
|
|
113
36
|
});
|
|
114
|
-
const { headers, stream } = encodeFormData(formData, {
|
|
115
|
-
boundaryPrefix: FORM_DATA_BOUNDARY_PREFIX
|
|
116
|
-
});
|
|
117
37
|
return {
|
|
118
|
-
|
|
38
|
+
body,
|
|
119
39
|
headers,
|
|
120
40
|
statusCode: 500
|
|
121
41
|
};
|
|
122
42
|
}
|
|
123
43
|
let res;
|
|
124
44
|
try {
|
|
125
|
-
|
|
126
|
-
|
|
45
|
+
const procedureArgs = await replaceLeaves(clientArgs.procedureArgs, async (value) => {
|
|
46
|
+
if (value instanceof ArrayBuffer) {
|
|
47
|
+
return Buffer.from(value);
|
|
48
|
+
}
|
|
49
|
+
return value;
|
|
50
|
+
});
|
|
51
|
+
res = await procedure(procedureArgs);
|
|
52
|
+
res = await replaceLeaves(res, async (value) => {
|
|
53
|
+
if (isErrorLike(value)) {
|
|
54
|
+
return {
|
|
55
|
+
name: value.name,
|
|
56
|
+
message: value.message,
|
|
57
|
+
stack: process.env.NODE_ENV === "development" ? value.stack : void 0
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
if (typeof value === "function") {
|
|
61
|
+
throw new Error("r19 does not support function return values.");
|
|
62
|
+
}
|
|
63
|
+
return value;
|
|
64
|
+
});
|
|
127
65
|
} catch (error) {
|
|
128
66
|
if (isErrorLike(error)) {
|
|
129
|
-
const
|
|
67
|
+
const body = encode({
|
|
130
68
|
error: {
|
|
131
69
|
name: error.name,
|
|
132
70
|
message: error.message,
|
|
133
71
|
stack: process.env.NODE_ENV === "development" ? error.stack : void 0
|
|
134
72
|
}
|
|
135
|
-
});
|
|
136
|
-
const { headers, stream } = encodeFormData(formData, {
|
|
137
|
-
boundaryPrefix: FORM_DATA_BOUNDARY_PREFIX
|
|
138
|
-
});
|
|
73
|
+
}, { ignoreUndefined: true });
|
|
139
74
|
return {
|
|
140
|
-
|
|
75
|
+
body,
|
|
141
76
|
headers,
|
|
142
77
|
statusCode: 500
|
|
143
78
|
};
|
|
@@ -145,30 +80,24 @@ const handleRPCRequest = async (args) => {
|
|
|
145
80
|
throw error;
|
|
146
81
|
}
|
|
147
82
|
try {
|
|
148
|
-
const
|
|
83
|
+
const body = encode({
|
|
149
84
|
data: res
|
|
150
|
-
});
|
|
151
|
-
const { headers, stream } = encodeFormData(formData, {
|
|
152
|
-
boundaryPrefix: FORM_DATA_BOUNDARY_PREFIX
|
|
153
|
-
});
|
|
85
|
+
}, { ignoreUndefined: true });
|
|
154
86
|
return {
|
|
155
|
-
|
|
87
|
+
body,
|
|
156
88
|
headers
|
|
157
89
|
};
|
|
158
90
|
} catch (error) {
|
|
159
91
|
if (error instanceof Error) {
|
|
160
92
|
console.error(error);
|
|
161
|
-
const
|
|
93
|
+
const body = encode({
|
|
162
94
|
error: {
|
|
163
95
|
name: "RPCError",
|
|
164
96
|
message: "Unable to serialize server response. Check the server log for details."
|
|
165
97
|
}
|
|
166
98
|
});
|
|
167
|
-
const { headers, stream } = encodeFormData(formData, {
|
|
168
|
-
boundaryPrefix: FORM_DATA_BOUNDARY_PREFIX
|
|
169
|
-
});
|
|
170
99
|
return {
|
|
171
|
-
|
|
100
|
+
body,
|
|
172
101
|
headers,
|
|
173
102
|
statusCode: 500
|
|
174
103
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handleRPCRequest.js","sources":["../../../../../../node_modules/r19/dist/handleRPCRequest.js"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"handleRPCRequest.js","sources":["../../../../../../node_modules/r19/dist/handleRPCRequest.js"],"sourcesContent":["import { Buffer } from \"node:buffer\";\nimport { decode, encode } from \"@msgpack/msgpack\";\nimport { isErrorLike } from \"./lib/isErrorLike.js\";\nimport { replaceLeaves } from \"./lib/replaceLeaves.js\";\nconst findProcedure = (procedures, path) => {\n path = [...path];\n let proceduresPointer = procedures;\n while (path.length > 0) {\n const pathSegment = path.shift();\n if (pathSegment) {\n proceduresPointer = proceduresPointer[pathSegment];\n if (typeof proceduresPointer === \"function\") {\n return proceduresPointer;\n } else if (proceduresPointer === void 0) {\n return;\n }\n }\n }\n};\nconst handleRPCRequest = async (args) => {\n if (!args.body) {\n throw new Error(\"Invalid request body. Only requests from an r19 client are accepted.\");\n }\n const clientArgs = decode(Buffer.from(args.body));\n const procedure = findProcedure(args.procedures, clientArgs.procedurePath);\n const headers = {\n \"Content-Type\": \"application/msgpack\"\n };\n if (!procedure) {\n const body = encode({\n error: {\n name: \"RPCError\",\n message: `Invalid procedure name: ${clientArgs.procedurePath.join(\".\")}`\n }\n });\n return {\n body,\n headers,\n statusCode: 500\n };\n }\n let res;\n try {\n const procedureArgs = await replaceLeaves(clientArgs.procedureArgs, async (value) => {\n if (value instanceof ArrayBuffer) {\n return Buffer.from(value);\n }\n return value;\n });\n res = await procedure(procedureArgs);\n res = await replaceLeaves(res, async (value) => {\n if (isErrorLike(value)) {\n return {\n name: value.name,\n message: value.message,\n stack: process.env.NODE_ENV === \"development\" ? value.stack : void 0\n };\n }\n if (typeof value === \"function\") {\n throw new Error(\"r19 does not support function return values.\");\n }\n return value;\n });\n } catch (error) {\n if (isErrorLike(error)) {\n const body = encode({\n error: {\n name: error.name,\n message: error.message,\n stack: process.env.NODE_ENV === \"development\" ? error.stack : void 0\n }\n }, { ignoreUndefined: true });\n return {\n body,\n headers,\n statusCode: 500\n };\n }\n throw error;\n }\n try {\n const body = encode({\n data: res\n }, { ignoreUndefined: true });\n return {\n body,\n headers\n };\n } catch (error) {\n if (error instanceof Error) {\n console.error(error);\n const body = encode({\n error: {\n name: \"RPCError\",\n message: \"Unable to serialize server response. Check the server log for details.\"\n }\n });\n return {\n body,\n headers,\n statusCode: 500\n };\n }\n throw error;\n }\n};\nexport {\n handleRPCRequest\n};\n//# sourceMappingURL=handleRPCRequest.js.map\n"],"names":[],"mappings":";;;;;AAIA,MAAM,gBAAgB,CAAC,YAAY,SAAS;AAC1C,SAAO,CAAC,GAAG,IAAI;AACf,MAAI,oBAAoB;AACxB,SAAO,KAAK,SAAS,GAAG;AACtB,UAAM,cAAc,KAAK;AACzB,QAAI,aAAa;AACf,0BAAoB,kBAAkB,WAAW;AACjD,UAAI,OAAO,sBAAsB,YAAY;AAC3C,eAAO;AAAA,MACf,WAAiB,sBAAsB,QAAQ;AACvC;AAAA,MACD;AAAA,IACF;AAAA,EACF;AACH;AACK,MAAC,mBAAmB,OAAO,SAAS;AACvC,MAAI,CAAC,KAAK,MAAM;AACd,UAAM,IAAI,MAAM,sEAAsE;AAAA,EACvF;AACD,QAAM,aAAa,OAAO,OAAO,KAAK,KAAK,IAAI,CAAC;AAChD,QAAM,YAAY,cAAc,KAAK,YAAY,WAAW,aAAa;AACzE,QAAM,UAAU;AAAA,IACd,gBAAgB;AAAA,EACpB;AACE,MAAI,CAAC,WAAW;AACd,UAAM,OAAO,OAAO;AAAA,MAClB,OAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,2BAA2B,WAAW,cAAc,KAAK,GAAG;AAAA,MACtE;AAAA,IACP,CAAK;AACD,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,YAAY;AAAA,IAClB;AAAA,EACG;AACD,MAAI;AACJ,MAAI;AACF,UAAM,gBAAgB,MAAM,cAAc,WAAW,eAAe,OAAO,UAAU;AACnF,UAAI,iBAAiB,aAAa;AAChC,eAAO,OAAO,KAAK,KAAK;AAAA,MACzB;AACD,aAAO;AAAA,IACb,CAAK;AACD,UAAM,MAAM,UAAU,aAAa;AACnC,UAAM,MAAM,cAAc,KAAK,OAAO,UAAU;AAC9C,UAAI,YAAY,KAAK,GAAG;AACtB,eAAO;AAAA,UACL,MAAM,MAAM;AAAA,UACZ,SAAS,MAAM;AAAA,UACf,OAAO,QAAQ,IAAI,aAAa,gBAAgB,MAAM,QAAQ;AAAA,QACxE;AAAA,MACO;AACD,UAAI,OAAO,UAAU,YAAY;AAC/B,cAAM,IAAI,MAAM,8CAA8C;AAAA,MAC/D;AACD,aAAO;AAAA,IACb,CAAK;AAAA,EACF,SAAQ,OAAP;AACA,QAAI,YAAY,KAAK,GAAG;AACtB,YAAM,OAAO,OAAO;AAAA,QAClB,OAAO;AAAA,UACL,MAAM,MAAM;AAAA,UACZ,SAAS,MAAM;AAAA,UACf,OAAO,QAAQ,IAAI,aAAa,gBAAgB,MAAM,QAAQ;AAAA,QAC/D;AAAA,MACT,GAAS,EAAE,iBAAiB,KAAI,CAAE;AAC5B,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA,YAAY;AAAA,MACpB;AAAA,IACK;AACD,UAAM;AAAA,EACP;AACD,MAAI;AACF,UAAM,OAAO,OAAO;AAAA,MAClB,MAAM;AAAA,IACZ,GAAO,EAAE,iBAAiB,KAAI,CAAE;AAC5B,WAAO;AAAA,MACL;AAAA,MACA;AAAA,IACN;AAAA,EACG,SAAQ,OAAP;AACA,QAAI,iBAAiB,OAAO;AAC1B,cAAQ,MAAM,KAAK;AACnB,YAAM,OAAO,OAAO;AAAA,QAClB,OAAO;AAAA,UACL,MAAM;AAAA,UACN,SAAS;AAAA,QACV;AAAA,MACT,CAAO;AACD,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA,YAAY;AAAA,MACpB;AAAA,IACK;AACD,UAAM;AAAA,EACP;AACH;"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const isPlainObject = (value) => {
|
|
4
|
+
if (typeof value !== "object" || value === null) {
|
|
5
|
+
return false;
|
|
6
|
+
}
|
|
7
|
+
const prototype = Object.getPrototypeOf(value);
|
|
8
|
+
return (prototype === null || prototype === Object.prototype || Object.getPrototypeOf(prototype) === null) && !(Symbol.toStringTag in value) && !(Symbol.iterator in value);
|
|
9
|
+
};
|
|
10
|
+
const replaceLeaves = async (input, replacer) => {
|
|
11
|
+
if (Array.isArray(input)) {
|
|
12
|
+
const preparedProcedureArgs = [];
|
|
13
|
+
for (let i = 0; i < input.length; i++) {
|
|
14
|
+
preparedProcedureArgs[i] = await replaceLeaves(input[i], replacer);
|
|
15
|
+
}
|
|
16
|
+
return preparedProcedureArgs;
|
|
17
|
+
}
|
|
18
|
+
if (isPlainObject(input)) {
|
|
19
|
+
const preparedProcedureArgs = {};
|
|
20
|
+
for (const key in input) {
|
|
21
|
+
preparedProcedureArgs[key] = await replaceLeaves(input[key], replacer);
|
|
22
|
+
}
|
|
23
|
+
return preparedProcedureArgs;
|
|
24
|
+
}
|
|
25
|
+
return await replacer(input);
|
|
26
|
+
};
|
|
27
|
+
exports.replaceLeaves = replaceLeaves;
|
|
28
|
+
//# sourceMappingURL=replaceLeaves.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"replaceLeaves.cjs","sources":["../../../../../../../node_modules/r19/dist/lib/replaceLeaves.js"],"sourcesContent":["const isPlainObject = (value) => {\n if (typeof value !== \"object\" || value === null) {\n return false;\n }\n const prototype = Object.getPrototypeOf(value);\n return (prototype === null || prototype === Object.prototype || Object.getPrototypeOf(prototype) === null) && !(Symbol.toStringTag in value) && !(Symbol.iterator in value);\n};\nconst replaceLeaves = async (input, replacer) => {\n if (Array.isArray(input)) {\n const preparedProcedureArgs = [];\n for (let i = 0; i < input.length; i++) {\n preparedProcedureArgs[i] = await replaceLeaves(input[i], replacer);\n }\n return preparedProcedureArgs;\n }\n if (isPlainObject(input)) {\n const preparedProcedureArgs = {};\n for (const key in input) {\n preparedProcedureArgs[key] = await replaceLeaves(input[key], replacer);\n }\n return preparedProcedureArgs;\n }\n return await replacer(input);\n};\nexport {\n replaceLeaves\n};\n//# sourceMappingURL=replaceLeaves.js.map\n"],"names":[],"mappings":";;AAAA,MAAM,gBAAgB,CAAC,UAAU;AAC/B,MAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAC/C,WAAO;AAAA,EACR;AACD,QAAM,YAAY,OAAO,eAAe,KAAK;AAC7C,UAAQ,cAAc,QAAQ,cAAc,OAAO,aAAa,OAAO,eAAe,SAAS,MAAM,SAAS,EAAE,OAAO,eAAe,UAAU,EAAE,OAAO,YAAY;AACvK;AACK,MAAC,gBAAgB,OAAO,OAAO,aAAa;AAC/C,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,UAAM,wBAAwB,CAAA;AAC9B,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,4BAAsB,CAAC,IAAI,MAAM,cAAc,MAAM,CAAC,GAAG,QAAQ;AAAA,IAClE;AACD,WAAO;AAAA,EACR;AACD,MAAI,cAAc,KAAK,GAAG;AACxB,UAAM,wBAAwB,CAAA;AAC9B,eAAW,OAAO,OAAO;AACvB,4BAAsB,GAAG,IAAI,MAAM,cAAc,MAAM,GAAG,GAAG,QAAQ;AAAA,IACtE;AACD,WAAO;AAAA,EACR;AACD,SAAO,MAAM,SAAS,KAAK;AAC7B;;"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
const isPlainObject = (value) => {
|
|
2
|
+
if (typeof value !== "object" || value === null) {
|
|
3
|
+
return false;
|
|
4
|
+
}
|
|
5
|
+
const prototype = Object.getPrototypeOf(value);
|
|
6
|
+
return (prototype === null || prototype === Object.prototype || Object.getPrototypeOf(prototype) === null) && !(Symbol.toStringTag in value) && !(Symbol.iterator in value);
|
|
7
|
+
};
|
|
8
|
+
const replaceLeaves = async (input, replacer) => {
|
|
9
|
+
if (Array.isArray(input)) {
|
|
10
|
+
const preparedProcedureArgs = [];
|
|
11
|
+
for (let i = 0; i < input.length; i++) {
|
|
12
|
+
preparedProcedureArgs[i] = await replaceLeaves(input[i], replacer);
|
|
13
|
+
}
|
|
14
|
+
return preparedProcedureArgs;
|
|
15
|
+
}
|
|
16
|
+
if (isPlainObject(input)) {
|
|
17
|
+
const preparedProcedureArgs = {};
|
|
18
|
+
for (const key in input) {
|
|
19
|
+
preparedProcedureArgs[key] = await replaceLeaves(input[key], replacer);
|
|
20
|
+
}
|
|
21
|
+
return preparedProcedureArgs;
|
|
22
|
+
}
|
|
23
|
+
return await replacer(input);
|
|
24
|
+
};
|
|
25
|
+
export {
|
|
26
|
+
replaceLeaves
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=replaceLeaves.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"replaceLeaves.js","sources":["../../../../../../../node_modules/r19/dist/lib/replaceLeaves.js"],"sourcesContent":["const isPlainObject = (value) => {\n if (typeof value !== \"object\" || value === null) {\n return false;\n }\n const prototype = Object.getPrototypeOf(value);\n return (prototype === null || prototype === Object.prototype || Object.getPrototypeOf(prototype) === null) && !(Symbol.toStringTag in value) && !(Symbol.iterator in value);\n};\nconst replaceLeaves = async (input, replacer) => {\n if (Array.isArray(input)) {\n const preparedProcedureArgs = [];\n for (let i = 0; i < input.length; i++) {\n preparedProcedureArgs[i] = await replaceLeaves(input[i], replacer);\n }\n return preparedProcedureArgs;\n }\n if (isPlainObject(input)) {\n const preparedProcedureArgs = {};\n for (const key in input) {\n preparedProcedureArgs[key] = await replaceLeaves(input[key], replacer);\n }\n return preparedProcedureArgs;\n }\n return await replacer(input);\n};\nexport {\n replaceLeaves\n};\n//# sourceMappingURL=replaceLeaves.js.map\n"],"names":[],"mappings":"AAAA,MAAM,gBAAgB,CAAC,UAAU;AAC/B,MAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAC/C,WAAO;AAAA,EACR;AACD,QAAM,YAAY,OAAO,eAAe,KAAK;AAC7C,UAAQ,cAAc,QAAQ,cAAc,OAAO,aAAa,OAAO,eAAe,SAAS,MAAM,SAAS,EAAE,OAAO,eAAe,UAAU,EAAE,OAAO,YAAY;AACvK;AACK,MAAC,gBAAgB,OAAO,OAAO,aAAa;AAC/C,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,UAAM,wBAAwB,CAAA;AAC9B,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,4BAAsB,CAAC,IAAI,MAAM,cAAc,MAAM,CAAC,GAAG,QAAQ;AAAA,IAClE;AACD,WAAO;AAAA,EACR;AACD,MAAI,cAAc,KAAK,GAAG;AACxB,UAAM,wBAAwB,CAAA;AAC9B,eAAW,OAAO,OAAO;AACvB,4BAAsB,GAAG,IAAI,MAAM,cAAc,MAAM,GAAG,GAAG,QAAQ;AAAA,IACtE;AACD,WAAO;AAAA,EACR;AACD,SAAO,MAAM,SAAS,KAAK;AAC7B;"}
|
|
@@ -2,11 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const createRPCMiddleware = require('./../__node_modules/r19/dist/createRPCMiddleware.cjs');
|
|
4
4
|
const proceduresFromInstance = require('./../__node_modules/r19/dist/proceduresFromInstance.cjs');
|
|
5
|
-
require("node:stream");
|
|
6
5
|
require("node:buffer");
|
|
7
|
-
require('./../__node_modules/busboy/lib/index.cjs');
|
|
8
|
-
require('./../__node_modules/devalue/src/uneval.cjs');
|
|
9
|
-
require('./../__node_modules/devalue/src/utils.cjs');
|
|
10
6
|
const defineOmits = () => {
|
|
11
7
|
return (omit) => {
|
|
12
8
|
return omit;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createSliceMachineManagerMiddleware.cjs","sources":["../../../src/managers/createSliceMachineManagerMiddleware.ts"],"sourcesContent":["import {\n\tExtractProcedures,\n\tOmittableProcedures,\n\tProceduresFromInstance,\n\tRPCMiddleware,\n\tcreateRPCMiddleware,\n\tproceduresFromInstance,\n} from \"r19\";\n\nimport { SliceMachineManager } from \"./SliceMachineManager\";\n\nconst defineOmits = <TObj>() => {\n\t// TODO: Change this to a nicer API. Maybe return an object with a named method (e.g. `compute`)\n\n\treturn <TOmitPaths extends string>(\n\t\tomit: readonly TOmitPaths[] | readonly OmittableProcedures<TObj>[],\n\t): readonly Extract<TOmitPaths, OmittableProcedures<TObj>>[] => {\n\t\treturn omit as readonly Extract<TOmitPaths, OmittableProcedures<TObj>>[];\n\t};\n};\n\n// TODO: Support wildcard omits that support \"*._sliceMachineManager\"\nconst omitProcedures = defineOmits<SliceMachineManager>()([\n\t\"_sliceMachinePluginRunner\",\n\t\"_prismicAuthManager\",\n\n\t\"customTypes._sliceMachineManager\",\n\t\"plugins._sliceMachineManager\",\n\t\"prismicRepository._sliceMachineManager\",\n\t\"project._sliceMachineManager\",\n\t\"screenshots._sliceMachineManager\",\n\t\"simulator._sliceMachineManager\",\n\t\"slices._sliceMachineManager\",\n\t\"snippets._sliceMachineManager\",\n\t\"telemetry._sliceMachineManager\",\n\t\"user._sliceMachineManager\",\n\t\"versions._sliceMachineManager\",\n\n\t\"getSliceMachinePluginRunner\",\n\t\"getPrismicAuthManager\",\n\t\"screenshots.browserContext\",\n]);\n\nexport type SliceMachineManagerMiddleware = RPCMiddleware<\n\tProceduresFromInstance<SliceMachineManager, typeof omitProcedures[number]>\n>;\n\nexport type SliceMachineManagerProcedures =\n\tExtractProcedures<SliceMachineManagerMiddleware>;\n\ntype GetSliceMachineManagerProceduresArgs = {\n\tsliceMachineManager: SliceMachineManager;\n};\n\nexport const getSliceMachineManagerProcedures = (\n\targs: GetSliceMachineManagerProceduresArgs,\n): SliceMachineManagerProcedures => {\n\treturn proceduresFromInstance(args.sliceMachineManager, {\n\t\tomit: omitProcedures,\n\t});\n};\n\nexport type CreateSliceMachineManagerMiddlewareArgs = {\n\tsliceMachineManager: SliceMachineManager;\n};\n\nexport const createSliceMachineManagerMiddleware = (\n\targs: CreateSliceMachineManagerMiddlewareArgs,\n): SliceMachineManagerMiddleware => {\n\treturn createRPCMiddleware({\n\t\tprocedures: getSliceMachineManagerProcedures({\n\t\t\tsliceMachineManager: args.sliceMachineManager,\n\t\t}),\n\t});\n};\n"],"names":["proceduresFromInstance","createRPCMiddleware"],"mappings":"
|
|
1
|
+
{"version":3,"file":"createSliceMachineManagerMiddleware.cjs","sources":["../../../src/managers/createSliceMachineManagerMiddleware.ts"],"sourcesContent":["import {\n\tExtractProcedures,\n\tOmittableProcedures,\n\tProceduresFromInstance,\n\tRPCMiddleware,\n\tcreateRPCMiddleware,\n\tproceduresFromInstance,\n} from \"r19\";\n\nimport { SliceMachineManager } from \"./SliceMachineManager\";\n\nconst defineOmits = <TObj>() => {\n\t// TODO: Change this to a nicer API. Maybe return an object with a named method (e.g. `compute`)\n\n\treturn <TOmitPaths extends string>(\n\t\tomit: readonly TOmitPaths[] | readonly OmittableProcedures<TObj>[],\n\t): readonly Extract<TOmitPaths, OmittableProcedures<TObj>>[] => {\n\t\treturn omit as readonly Extract<TOmitPaths, OmittableProcedures<TObj>>[];\n\t};\n};\n\n// TODO: Support wildcard omits that support \"*._sliceMachineManager\"\nconst omitProcedures = defineOmits<SliceMachineManager>()([\n\t\"_sliceMachinePluginRunner\",\n\t\"_prismicAuthManager\",\n\n\t\"customTypes._sliceMachineManager\",\n\t\"plugins._sliceMachineManager\",\n\t\"prismicRepository._sliceMachineManager\",\n\t\"project._sliceMachineManager\",\n\t\"screenshots._sliceMachineManager\",\n\t\"simulator._sliceMachineManager\",\n\t\"slices._sliceMachineManager\",\n\t\"snippets._sliceMachineManager\",\n\t\"telemetry._sliceMachineManager\",\n\t\"user._sliceMachineManager\",\n\t\"versions._sliceMachineManager\",\n\n\t\"getSliceMachinePluginRunner\",\n\t\"getPrismicAuthManager\",\n\t\"screenshots.browserContext\",\n]);\n\nexport type SliceMachineManagerMiddleware = RPCMiddleware<\n\tProceduresFromInstance<SliceMachineManager, typeof omitProcedures[number]>\n>;\n\nexport type SliceMachineManagerProcedures =\n\tExtractProcedures<SliceMachineManagerMiddleware>;\n\ntype GetSliceMachineManagerProceduresArgs = {\n\tsliceMachineManager: SliceMachineManager;\n};\n\nexport const getSliceMachineManagerProcedures = (\n\targs: GetSliceMachineManagerProceduresArgs,\n): SliceMachineManagerProcedures => {\n\treturn proceduresFromInstance(args.sliceMachineManager, {\n\t\tomit: omitProcedures,\n\t});\n};\n\nexport type CreateSliceMachineManagerMiddlewareArgs = {\n\tsliceMachineManager: SliceMachineManager;\n};\n\nexport const createSliceMachineManagerMiddleware = (\n\targs: CreateSliceMachineManagerMiddlewareArgs,\n): SliceMachineManagerMiddleware => {\n\treturn createRPCMiddleware({\n\t\tprocedures: getSliceMachineManagerProcedures({\n\t\t\tsliceMachineManager: args.sliceMachineManager,\n\t\t}),\n\t});\n};\n"],"names":["proceduresFromInstance","createRPCMiddleware"],"mappings":";;;;;AAWA,MAAM,cAAc,MAAW;AAG9B,SAAO,CACN,SAC8D;AACvD,WAAA;AAAA,EAAA;AAET;AAGA,MAAM,iBAAiB,cAAmC;AAAA,EACzD;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AACA,CAAA;AAaY,MAAA,mCAAmC,CAC/C,SACkC;AAC3B,SAAAA,uBAAA,uBAAuB,KAAK,qBAAqB;AAAA,IACvD,MAAM;AAAA,EAAA,CACN;AACF;AAMa,MAAA,sCAAsC,CAClD,SACkC;AAClC,SAAOC,wCAAoB;AAAA,IAC1B,YAAY,iCAAiC;AAAA,MAC5C,qBAAqB,KAAK;AAAA,IAAA,CAC1B;AAAA,EAAA,CACD;AACF;;;"}
|
|
@@ -1,10 +1,6 @@
|
|
|
1
1
|
import { createRPCMiddleware } from './../__node_modules/r19/dist/createRPCMiddleware.js';
|
|
2
2
|
import { proceduresFromInstance } from './../__node_modules/r19/dist/proceduresFromInstance.js';
|
|
3
|
-
import "node:stream";
|
|
4
3
|
import "node:buffer";
|
|
5
|
-
import './../__node_modules/busboy/lib/index.js';
|
|
6
|
-
import './../__node_modules/devalue/src/uneval.js';
|
|
7
|
-
import './../__node_modules/devalue/src/utils.js';
|
|
8
4
|
const defineOmits = () => {
|
|
9
5
|
return (omit) => {
|
|
10
6
|
return omit;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createSliceMachineManagerMiddleware.js","sources":["../../../src/managers/createSliceMachineManagerMiddleware.ts"],"sourcesContent":["import {\n\tExtractProcedures,\n\tOmittableProcedures,\n\tProceduresFromInstance,\n\tRPCMiddleware,\n\tcreateRPCMiddleware,\n\tproceduresFromInstance,\n} from \"r19\";\n\nimport { SliceMachineManager } from \"./SliceMachineManager\";\n\nconst defineOmits = <TObj>() => {\n\t// TODO: Change this to a nicer API. Maybe return an object with a named method (e.g. `compute`)\n\n\treturn <TOmitPaths extends string>(\n\t\tomit: readonly TOmitPaths[] | readonly OmittableProcedures<TObj>[],\n\t): readonly Extract<TOmitPaths, OmittableProcedures<TObj>>[] => {\n\t\treturn omit as readonly Extract<TOmitPaths, OmittableProcedures<TObj>>[];\n\t};\n};\n\n// TODO: Support wildcard omits that support \"*._sliceMachineManager\"\nconst omitProcedures = defineOmits<SliceMachineManager>()([\n\t\"_sliceMachinePluginRunner\",\n\t\"_prismicAuthManager\",\n\n\t\"customTypes._sliceMachineManager\",\n\t\"plugins._sliceMachineManager\",\n\t\"prismicRepository._sliceMachineManager\",\n\t\"project._sliceMachineManager\",\n\t\"screenshots._sliceMachineManager\",\n\t\"simulator._sliceMachineManager\",\n\t\"slices._sliceMachineManager\",\n\t\"snippets._sliceMachineManager\",\n\t\"telemetry._sliceMachineManager\",\n\t\"user._sliceMachineManager\",\n\t\"versions._sliceMachineManager\",\n\n\t\"getSliceMachinePluginRunner\",\n\t\"getPrismicAuthManager\",\n\t\"screenshots.browserContext\",\n]);\n\nexport type SliceMachineManagerMiddleware = RPCMiddleware<\n\tProceduresFromInstance<SliceMachineManager, typeof omitProcedures[number]>\n>;\n\nexport type SliceMachineManagerProcedures =\n\tExtractProcedures<SliceMachineManagerMiddleware>;\n\ntype GetSliceMachineManagerProceduresArgs = {\n\tsliceMachineManager: SliceMachineManager;\n};\n\nexport const getSliceMachineManagerProcedures = (\n\targs: GetSliceMachineManagerProceduresArgs,\n): SliceMachineManagerProcedures => {\n\treturn proceduresFromInstance(args.sliceMachineManager, {\n\t\tomit: omitProcedures,\n\t});\n};\n\nexport type CreateSliceMachineManagerMiddlewareArgs = {\n\tsliceMachineManager: SliceMachineManager;\n};\n\nexport const createSliceMachineManagerMiddleware = (\n\targs: CreateSliceMachineManagerMiddlewareArgs,\n): SliceMachineManagerMiddleware => {\n\treturn createRPCMiddleware({\n\t\tprocedures: getSliceMachineManagerProcedures({\n\t\t\tsliceMachineManager: args.sliceMachineManager,\n\t\t}),\n\t});\n};\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"createSliceMachineManagerMiddleware.js","sources":["../../../src/managers/createSliceMachineManagerMiddleware.ts"],"sourcesContent":["import {\n\tExtractProcedures,\n\tOmittableProcedures,\n\tProceduresFromInstance,\n\tRPCMiddleware,\n\tcreateRPCMiddleware,\n\tproceduresFromInstance,\n} from \"r19\";\n\nimport { SliceMachineManager } from \"./SliceMachineManager\";\n\nconst defineOmits = <TObj>() => {\n\t// TODO: Change this to a nicer API. Maybe return an object with a named method (e.g. `compute`)\n\n\treturn <TOmitPaths extends string>(\n\t\tomit: readonly TOmitPaths[] | readonly OmittableProcedures<TObj>[],\n\t): readonly Extract<TOmitPaths, OmittableProcedures<TObj>>[] => {\n\t\treturn omit as readonly Extract<TOmitPaths, OmittableProcedures<TObj>>[];\n\t};\n};\n\n// TODO: Support wildcard omits that support \"*._sliceMachineManager\"\nconst omitProcedures = defineOmits<SliceMachineManager>()([\n\t\"_sliceMachinePluginRunner\",\n\t\"_prismicAuthManager\",\n\n\t\"customTypes._sliceMachineManager\",\n\t\"plugins._sliceMachineManager\",\n\t\"prismicRepository._sliceMachineManager\",\n\t\"project._sliceMachineManager\",\n\t\"screenshots._sliceMachineManager\",\n\t\"simulator._sliceMachineManager\",\n\t\"slices._sliceMachineManager\",\n\t\"snippets._sliceMachineManager\",\n\t\"telemetry._sliceMachineManager\",\n\t\"user._sliceMachineManager\",\n\t\"versions._sliceMachineManager\",\n\n\t\"getSliceMachinePluginRunner\",\n\t\"getPrismicAuthManager\",\n\t\"screenshots.browserContext\",\n]);\n\nexport type SliceMachineManagerMiddleware = RPCMiddleware<\n\tProceduresFromInstance<SliceMachineManager, typeof omitProcedures[number]>\n>;\n\nexport type SliceMachineManagerProcedures =\n\tExtractProcedures<SliceMachineManagerMiddleware>;\n\ntype GetSliceMachineManagerProceduresArgs = {\n\tsliceMachineManager: SliceMachineManager;\n};\n\nexport const getSliceMachineManagerProcedures = (\n\targs: GetSliceMachineManagerProceduresArgs,\n): SliceMachineManagerProcedures => {\n\treturn proceduresFromInstance(args.sliceMachineManager, {\n\t\tomit: omitProcedures,\n\t});\n};\n\nexport type CreateSliceMachineManagerMiddlewareArgs = {\n\tsliceMachineManager: SliceMachineManager;\n};\n\nexport const createSliceMachineManagerMiddleware = (\n\targs: CreateSliceMachineManagerMiddlewareArgs,\n): SliceMachineManagerMiddleware => {\n\treturn createRPCMiddleware({\n\t\tprocedures: getSliceMachineManagerProcedures({\n\t\t\tsliceMachineManager: args.sliceMachineManager,\n\t\t}),\n\t});\n};\n"],"names":[],"mappings":";;;AAWA,MAAM,cAAc,MAAW;AAG9B,SAAO,CACN,SAC8D;AACvD,WAAA;AAAA,EAAA;AAET;AAGA,MAAM,iBAAiB,cAAmC;AAAA,EACzD;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AACA,CAAA;AAaY,MAAA,mCAAmC,CAC/C,SACkC;AAC3B,SAAA,uBAAuB,KAAK,qBAAqB;AAAA,IACvD,MAAM;AAAA,EAAA,CACN;AACF;AAMa,MAAA,sCAAsC,CAClD,SACkC;AAClC,SAAO,oBAAoB;AAAA,IAC1B,YAAY,iCAAiC;AAAA,MAC5C,qBAAqB,KAAK;AAAA,IAAA,CAC1B;AAAA,EAAA,CACD;AACF;"}
|
|
@@ -61,8 +61,9 @@ function _interopNamespaceDefault(e) {
|
|
|
61
61
|
return Object.freeze(n);
|
|
62
62
|
}
|
|
63
63
|
const t__namespace = /* @__PURE__ */ _interopNamespaceDefault(t);
|
|
64
|
-
const
|
|
65
|
-
const
|
|
64
|
+
const SLICE_SIMULATOR_WAIT_FOR_TIMEOUT = 1e4;
|
|
65
|
+
const SLICE_SIMULATOR_WAIT_FOR_SELECTOR = "#__iframe-ready";
|
|
66
|
+
const SLICE_SIMULATOR_SCREENSHOT_SELECTOR = "#__iframe-renderer";
|
|
66
67
|
const DEFAULT_SCREENSHOT_VIEWPORT = {
|
|
67
68
|
width: 1200,
|
|
68
69
|
height: 800
|
|
@@ -77,6 +78,9 @@ function assertBrowserContextInitialized(browserContext) {
|
|
|
77
78
|
throw new Error("A browser context has not been initialized. Run `SliceMachineManager.screenshots.prototype.initBrowserContext()` before re-calling this method.");
|
|
78
79
|
}
|
|
79
80
|
}
|
|
81
|
+
const encodeSliceSimulatorURLPart = (urlPart) => {
|
|
82
|
+
return urlPart.replace(/\//g, "--");
|
|
83
|
+
};
|
|
80
84
|
class ScreenshotsManager extends BaseManager.BaseManager {
|
|
81
85
|
constructor() {
|
|
82
86
|
super(...arguments);
|
|
@@ -146,26 +150,41 @@ class ScreenshotsManager extends BaseManager.BaseManager {
|
|
|
146
150
|
if (!sliceMachineConfig.localSliceSimulatorURL) {
|
|
147
151
|
throw new Error("A local Slice Simulator URL must be configured in your Slice Machine configuration file.");
|
|
148
152
|
}
|
|
149
|
-
const
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
+
const { model } = await this.slices.readSlice({
|
|
154
|
+
libraryID: args.libraryID,
|
|
155
|
+
sliceID: args.sliceID
|
|
156
|
+
});
|
|
157
|
+
if (!model) {
|
|
158
|
+
throw new Error(`Did not find a Slice in library "${args.libraryID}" with ID "${args.sliceID}".`);
|
|
159
|
+
}
|
|
160
|
+
const viewport = args.viewport || DEFAULT_SCREENSHOT_VIEWPORT;
|
|
161
|
+
const url = new URL(`./${encodeSliceSimulatorURLPart(args.libraryID)}/${model.name}/${args.variationID}/screenshot`, args.sliceMachineUIOrigin);
|
|
162
|
+
url.searchParams.set("screenWidth", viewport.width.toString());
|
|
163
|
+
url.searchParams.set("screenHeight", viewport.height.toString());
|
|
153
164
|
const isURLAccessible = await checkIsURLAccessible.checkIsURLAccessible(url.toString());
|
|
154
165
|
if (!isURLAccessible) {
|
|
155
|
-
throw new Error(`Slice Simulator URL is not accessible: ${url}`);
|
|
166
|
+
throw new Error(`Slice Simulator screenshot URL is not accessible: ${url}`);
|
|
156
167
|
}
|
|
157
168
|
const page = await this._browserContext.newPage();
|
|
158
|
-
page.setViewport(
|
|
159
|
-
await page.goto(url.toString());
|
|
160
|
-
await page.waitForSelector(
|
|
161
|
-
timeout:
|
|
169
|
+
page.setViewport(viewport);
|
|
170
|
+
await page.goto(url.toString(), { waitUntil: "load" });
|
|
171
|
+
await page.waitForSelector(SLICE_SIMULATOR_WAIT_FOR_SELECTOR, {
|
|
172
|
+
timeout: SLICE_SIMULATOR_WAIT_FOR_TIMEOUT
|
|
162
173
|
});
|
|
163
|
-
const element = await page.$(
|
|
174
|
+
const element = await page.$(SLICE_SIMULATOR_SCREENSHOT_SELECTOR);
|
|
164
175
|
if (!element) {
|
|
165
176
|
const baseURL = new URL(url.pathname, url.origin);
|
|
166
|
-
throw new Error(`Slice Simulator
|
|
177
|
+
throw new Error(`Slice Simulator did not find ${SLICE_SIMULATOR_WAIT_FOR_SELECTOR} on the page. Verify the URL is correct: ${baseURL}`);
|
|
167
178
|
}
|
|
168
|
-
const data = await element.screenshot({
|
|
179
|
+
const data = await element.screenshot({
|
|
180
|
+
encoding: "binary",
|
|
181
|
+
clip: {
|
|
182
|
+
width: viewport.width,
|
|
183
|
+
height: viewport.height,
|
|
184
|
+
x: 0,
|
|
185
|
+
y: 0
|
|
186
|
+
}
|
|
187
|
+
});
|
|
169
188
|
return {
|
|
170
189
|
data
|
|
171
190
|
};
|
|
@@ -201,6 +220,4 @@ class ScreenshotsManager extends BaseManager.BaseManager {
|
|
|
201
220
|
}
|
|
202
221
|
}
|
|
203
222
|
exports.ScreenshotsManager = ScreenshotsManager;
|
|
204
|
-
exports.assertBrowserContextInitialized = assertBrowserContextInitialized;
|
|
205
|
-
exports.assertS3ACLInitialized = assertS3ACLInitialized;
|
|
206
223
|
//# sourceMappingURL=ScreenshotsManager.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ScreenshotsManager.cjs","sources":["../../../../src/managers/screenshots/ScreenshotsManager.ts"],"sourcesContent":["import * as t from \"io-ts\";\nimport { fileTypeFromBuffer } from \"file-type\";\nimport fetch, { FormData, Blob } from \"node-fetch\";\n// puppeteer is lazy-loaded in captureSliceSimulatorScreenshot\nimport type { BrowserContext, Viewport } from \"puppeteer\";\n\nimport { checkIsURLAccessible } from \"../../lib/checkIsURLAccessible\";\nimport { createContentDigest } from \"../../lib/createContentDigest\";\nimport { decode } from \"../../lib/decode\";\n\nimport { S3ACL } from \"../../types\";\nimport { SLICE_MACHINE_USER_AGENT } from \"../../constants/SLICE_MACHINE_USER_AGENT\";\nimport { API_ENDPOINTS } from \"../../constants/API_ENDPOINTS\";\nimport { InternalError } from \"../../errors\";\n\nimport { BaseManager } from \"../BaseManager\";\n\nconst SLICE_SIMULATOR_LOAD_TIMEOUT = 10_000; // ms\nconst SLICE_SIMULATOR_ROOT_SELECTOR = \"#root\";\n\nconst DEFAULT_SCREENSHOT_VIEWPORT: Viewport = {\n\twidth: 1200,\n\theight: 800,\n};\n\nexport function assertS3ACLInitialized(\n\ts3ACL: S3ACL | undefined,\n): asserts s3ACL is NonNullable<typeof s3ACL> {\n\tif (s3ACL == undefined) {\n\t\tthrow new Error(\n\t\t\t\"An S3 ACL has not been initialized. Run `SliceMachineManager.screenshots.prototype.initS3ACL()` before re-calling this method.\",\n\t\t);\n\t}\n}\n\nexport function assertBrowserContextInitialized(\n\tbrowserContext: BrowserContext | undefined,\n): asserts browserContext is NonNullable<typeof browserContext> {\n\tif (browserContext == undefined) {\n\t\tthrow new Error(\n\t\t\t\"A browser context has not been initialized. Run `SliceMachineManager.screenshots.prototype.initBrowserContext()` before re-calling this method.\",\n\t\t);\n\t}\n}\n\ntype ScreenshotsManagerCaptureSliceSimulatorScreenshotArgs = {\n\tlibraryID: string;\n\tsliceID: string;\n\tvariationID: string;\n\tviewport?: Viewport;\n};\n\ntype ScreenshotsManagerCaptureSliceSimulatorScreenshotReturnType = {\n\tdata: Buffer;\n};\n\ntype ScreenshotsManagerUploadScreenshotArgs = {\n\tdata: Buffer;\n\tkeyPrefix?: string;\n};\n\ntype ScreenshotsManagerUploadScreenshotReturnType = {\n\turl: string;\n};\n\nexport class ScreenshotsManager extends BaseManager {\n\tprivate _browserContext: BrowserContext | undefined;\n\tprivate _s3ACL: S3ACL | undefined;\n\n\tasync initBrowserContext(): Promise<void> {\n\t\tif (this._browserContext) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet puppeteer: typeof import(\"puppeteer\");\n\t\ttry {\n\t\t\t// Lazy-load Puppeteer only once it is needed.\n\t\t\tpuppeteer = await import(\"puppeteer\");\n\t\t} catch {\n\t\t\tthrow new InternalError(\n\t\t\t\t\"Screenshots require Puppeteer but Puppeteer was not found. Check that the `puppeteer` package is installed before trying again.\",\n\t\t\t);\n\t\t}\n\n\t\tconst browser = await puppeteer.launch();\n\n\t\tthis._browserContext = await browser.createIncognitoBrowserContext();\n\t}\n\n\tasync initS3ACL(): Promise<void> {\n\t\tif (this._s3ACL) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst sliceMachineConfig = await this.project.getSliceMachineConfig();\n\t\tconst authenticationToken = await this.user.getAuthenticationToken();\n\n\t\tconst awsACLURL = new URL(\"create\", API_ENDPOINTS.AwsAclProvider);\n\t\tconst awsACLRes = await fetch(awsACLURL.toString(), {\n\t\t\theaders: {\n\t\t\t\tAuthorization: `Bearer ${authenticationToken}`,\n\t\t\t\t\"User-Agent\": SLICE_MACHINE_USER_AGENT,\n\t\t\t\tRepository: sliceMachineConfig.repositoryName,\n\t\t\t},\n\t\t});\n\t\tconst awsACLJSON = await awsACLRes.json();\n\n\t\tconst { value: awsACL, error } = decode(\n\t\t\tt.intersection([\n\t\t\t\tt.type({\n\t\t\t\t\tvalues: t.type({\n\t\t\t\t\t\turl: t.string,\n\t\t\t\t\t\tfields: t.record(t.string, t.string),\n\t\t\t\t\t}),\n\t\t\t\t\timgixEndpoint: t.string,\n\t\t\t\t}),\n\t\t\t\tt.partial({\n\t\t\t\t\tmessage: t.string,\n\t\t\t\t\tMessage: t.string,\n\t\t\t\t\terror: t.string,\n\t\t\t\t}),\n\t\t\t]),\n\t\t\tawsACLJSON,\n\t\t);\n\n\t\tif (error) {\n\t\t\tthrow new Error(`Invalid AWS ACL response from ${awsACLURL}`);\n\t\t}\n\n\t\tconst errorMessage = awsACL.error || awsACL.message || awsACL.Message;\n\t\tif (errorMessage) {\n\t\t\tthrow new Error(`Failed to create an AWS ACL: ${errorMessage}`);\n\t\t}\n\n\t\tthis._s3ACL = {\n\t\t\tuploadEndpoint: awsACL.values.url,\n\t\t\trequiredFormDataFields: awsACL.values.fields,\n\t\t\timgixEndpoint: awsACL.imgixEndpoint,\n\t\t};\n\t}\n\n\t// TODO: Abstract to a generic `captureScreenshot()` method that is\n\t// used within a Slice-specific method in SliceManager.\n\tasync captureSliceSimulatorScreenshot(\n\t\targs: ScreenshotsManagerCaptureSliceSimulatorScreenshotArgs,\n\t): Promise<ScreenshotsManagerCaptureSliceSimulatorScreenshotReturnType> {\n\t\tassertBrowserContextInitialized(this._browserContext);\n\n\t\tconst sliceMachineConfig = await this.project.getSliceMachineConfig();\n\n\t\tif (!sliceMachineConfig.localSliceSimulatorURL) {\n\t\t\t// TODO: Provide a more helpful error message.\n\t\t\tthrow new Error(\n\t\t\t\t\"A local Slice Simulator URL must be configured in your Slice Machine configuration file.\",\n\t\t\t);\n\t\t}\n\n\t\tconst url = new URL(sliceMachineConfig.localSliceSimulatorURL);\n\t\turl.searchParams.set(\"lid\", args.libraryID);\n\t\turl.searchParams.set(\"sid\", args.sliceID);\n\t\turl.searchParams.set(\"vid\", args.variationID);\n\n\t\tconst isURLAccessible = await checkIsURLAccessible(url.toString());\n\n\t\tif (!isURLAccessible) {\n\t\t\tthrow new Error(`Slice Simulator URL is not accessible: ${url}`);\n\t\t}\n\n\t\tconst page = await this._browserContext.newPage();\n\t\tpage.setViewport(args.viewport || DEFAULT_SCREENSHOT_VIEWPORT);\n\n\t\t// TODO: I removed `goto`'s `{ waitUntil: \"networkidle2\" }` option.\n\t\t// Good idea? Bad idea?\n\t\tawait page.goto(url.toString());\n\t\tawait page.waitForSelector(SLICE_SIMULATOR_ROOT_SELECTOR, {\n\t\t\ttimeout: SLICE_SIMULATOR_LOAD_TIMEOUT,\n\t\t});\n\n\t\tconst element = await page.$(SLICE_SIMULATOR_ROOT_SELECTOR);\n\t\tif (!element) {\n\t\t\tconst baseURL = new URL(url.pathname, url.origin);\n\n\t\t\tthrow new Error(\n\t\t\t\t`Slice Simulator could not find the element to screenshot. Verify the URL is correct: ${baseURL}`,\n\t\t\t);\n\t\t}\n\n\t\tconst data = (await element.screenshot({ encoding: \"binary\" })) as Buffer;\n\n\t\treturn {\n\t\t\tdata,\n\t\t};\n\t}\n\n\tasync uploadScreenshot(\n\t\targs: ScreenshotsManagerUploadScreenshotArgs,\n\t): Promise<ScreenshotsManagerUploadScreenshotReturnType> {\n\t\tassertS3ACLInitialized(this._s3ACL);\n\n\t\tconst formData = new FormData();\n\n\t\tfor (const requiredFormDataFieldKey in this._s3ACL.requiredFormDataFields) {\n\t\t\tformData.append(\n\t\t\t\trequiredFormDataFieldKey,\n\t\t\t\tthis._s3ACL.requiredFormDataFields[requiredFormDataFieldKey],\n\t\t\t);\n\t\t}\n\n\t\tconst contentDigest = createContentDigest(args.data);\n\t\tconst fileType = await fileTypeFromBuffer(args.data);\n\t\tconst fileName = fileType\n\t\t\t? `${contentDigest}.${fileType.ext}`\n\t\t\t: contentDigest;\n\t\tconst key = args.keyPrefix ? `${args.keyPrefix}/${fileName}` : fileName;\n\n\t\tformData.set(\"key\", key);\n\n\t\tif (fileType) {\n\t\t\tformData.set(\"Content-Type\", fileType.mime);\n\t\t}\n\n\t\tformData.set(\"file\", new Blob([args.data], { type: fileType?.mime }));\n\n\t\tconst res = await fetch(this._s3ACL.uploadEndpoint, {\n\t\t\tmethod: \"POST\",\n\t\t\tbody: formData,\n\t\t});\n\n\t\tif (res.ok) {\n\t\t\tconst url = new URL(key, this._s3ACL.imgixEndpoint);\n\t\t\turl.searchParams.set(\"auto\", \"compress,format\");\n\n\t\t\treturn {\n\t\t\t\turl: url.toString(),\n\t\t\t};\n\t\t} else {\n\t\t\tthrow new Error(\n\t\t\t\t`Unable to upload screenshot with status code: ${res.status}`,\n\t\t\t);\n\t\t}\n\t}\n}\n"],"names":["BaseManager","InternalError","API_ENDPOINTS","fetch","SLICE_MACHINE_USER_AGENT","decode","t","checkIsURLAccessible","FormData","createContentDigest","fileTypeFromBuffer","Blob"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ScreenshotsManager.cjs","sources":["../../../../src/managers/screenshots/ScreenshotsManager.ts"],"sourcesContent":["import * as t from \"io-ts\";\nimport { fileTypeFromBuffer } from \"file-type\";\nimport fetch, { FormData, Blob } from \"node-fetch\";\n// puppeteer is lazy-loaded in captureSliceSimulatorScreenshot\nimport type { BrowserContext, Viewport } from \"puppeteer\";\n\nimport { checkIsURLAccessible } from \"../../lib/checkIsURLAccessible\";\nimport { createContentDigest } from \"../../lib/createContentDigest\";\nimport { decode } from \"../../lib/decode\";\n\nimport { S3ACL } from \"../../types\";\nimport { SLICE_MACHINE_USER_AGENT } from \"../../constants/SLICE_MACHINE_USER_AGENT\";\nimport { API_ENDPOINTS } from \"../../constants/API_ENDPOINTS\";\nimport { InternalError } from \"../../errors\";\n\nimport { BaseManager } from \"../BaseManager\";\n\nconst SLICE_SIMULATOR_WAIT_FOR_TIMEOUT = 10_000; // ms\nconst SLICE_SIMULATOR_WAIT_FOR_SELECTOR = \"#__iframe-ready\";\nconst SLICE_SIMULATOR_SCREENSHOT_SELECTOR = \"#__iframe-renderer\";\n\nconst DEFAULT_SCREENSHOT_VIEWPORT: Viewport = {\n\twidth: 1200,\n\theight: 800,\n};\n\nfunction assertS3ACLInitialized(\n\ts3ACL: S3ACL | undefined,\n): asserts s3ACL is NonNullable<typeof s3ACL> {\n\tif (s3ACL == undefined) {\n\t\tthrow new Error(\n\t\t\t\"An S3 ACL has not been initialized. Run `SliceMachineManager.screenshots.prototype.initS3ACL()` before re-calling this method.\",\n\t\t);\n\t}\n}\n\nfunction assertBrowserContextInitialized(\n\tbrowserContext: BrowserContext | undefined,\n): asserts browserContext is NonNullable<typeof browserContext> {\n\tif (browserContext == undefined) {\n\t\tthrow new Error(\n\t\t\t\"A browser context has not been initialized. Run `SliceMachineManager.screenshots.prototype.initBrowserContext()` before re-calling this method.\",\n\t\t);\n\t}\n}\n\n/**\n * Encodes a part of a Slice Simulator URL to ensure it can be added to a URL\n * safely.\n *\n * The encoding logic must match Slice Machine UI's URL encoding practices.\n * Today, that requires the following:\n *\n * - Replace \"/\" with \"--\" (e.g. a Slice Library ID of \"./slices\" should turn into\n * \".--slices\")\n *\n * @param urlPart - A part of the URL.\n *\n * @returns `urlPart` encoded for use in a URL.\n */\nconst encodeSliceSimulatorURLPart = (urlPart: string): string => {\n\treturn urlPart.replace(/\\//g, \"--\");\n};\n\ntype ScreenshotsManagerCaptureSliceSimulatorScreenshotArgs = {\n\tsliceMachineUIOrigin: string;\n\tlibraryID: string;\n\tsliceID: string;\n\tvariationID: string;\n\tviewport?: Viewport;\n};\n\ntype ScreenshotsManagerCaptureSliceSimulatorScreenshotReturnType = {\n\tdata: Buffer;\n};\n\ntype ScreenshotsManagerUploadScreenshotArgs = {\n\tdata: Buffer;\n\tkeyPrefix?: string;\n};\n\ntype ScreenshotsManagerUploadScreenshotReturnType = {\n\turl: string;\n};\n\nexport class ScreenshotsManager extends BaseManager {\n\tprivate _browserContext: BrowserContext | undefined;\n\tprivate _s3ACL: S3ACL | undefined;\n\n\tasync initBrowserContext(): Promise<void> {\n\t\tif (this._browserContext) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet puppeteer: typeof import(\"puppeteer\");\n\t\ttry {\n\t\t\t// Lazy-load Puppeteer only once it is needed.\n\t\t\tpuppeteer = await import(\"puppeteer\");\n\t\t} catch {\n\t\t\tthrow new InternalError(\n\t\t\t\t\"Screenshots require Puppeteer but Puppeteer was not found. Check that the `puppeteer` package is installed before trying again.\",\n\t\t\t);\n\t\t}\n\n\t\tconst browser = await puppeteer.launch();\n\n\t\tthis._browserContext = await browser.createIncognitoBrowserContext();\n\t}\n\n\tasync initS3ACL(): Promise<void> {\n\t\tif (this._s3ACL) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst sliceMachineConfig = await this.project.getSliceMachineConfig();\n\t\tconst authenticationToken = await this.user.getAuthenticationToken();\n\n\t\tconst awsACLURL = new URL(\"create\", API_ENDPOINTS.AwsAclProvider);\n\t\tconst awsACLRes = await fetch(awsACLURL.toString(), {\n\t\t\theaders: {\n\t\t\t\tAuthorization: `Bearer ${authenticationToken}`,\n\t\t\t\t\"User-Agent\": SLICE_MACHINE_USER_AGENT,\n\t\t\t\tRepository: sliceMachineConfig.repositoryName,\n\t\t\t},\n\t\t});\n\t\tconst awsACLJSON = await awsACLRes.json();\n\n\t\tconst { value: awsACL, error } = decode(\n\t\t\tt.intersection([\n\t\t\t\tt.type({\n\t\t\t\t\tvalues: t.type({\n\t\t\t\t\t\turl: t.string,\n\t\t\t\t\t\tfields: t.record(t.string, t.string),\n\t\t\t\t\t}),\n\t\t\t\t\timgixEndpoint: t.string,\n\t\t\t\t}),\n\t\t\t\tt.partial({\n\t\t\t\t\tmessage: t.string,\n\t\t\t\t\tMessage: t.string,\n\t\t\t\t\terror: t.string,\n\t\t\t\t}),\n\t\t\t]),\n\t\t\tawsACLJSON,\n\t\t);\n\n\t\tif (error) {\n\t\t\tthrow new Error(`Invalid AWS ACL response from ${awsACLURL}`);\n\t\t}\n\n\t\tconst errorMessage = awsACL.error || awsACL.message || awsACL.Message;\n\t\tif (errorMessage) {\n\t\t\tthrow new Error(`Failed to create an AWS ACL: ${errorMessage}`);\n\t\t}\n\n\t\tthis._s3ACL = {\n\t\t\tuploadEndpoint: awsACL.values.url,\n\t\t\trequiredFormDataFields: awsACL.values.fields,\n\t\t\timgixEndpoint: awsACL.imgixEndpoint,\n\t\t};\n\t}\n\n\t// TODO: Abstract to a generic `captureScreenshot()` method that is\n\t// used within a Slice-specific method in SliceManager.\n\tasync captureSliceSimulatorScreenshot(\n\t\targs: ScreenshotsManagerCaptureSliceSimulatorScreenshotArgs,\n\t): Promise<ScreenshotsManagerCaptureSliceSimulatorScreenshotReturnType> {\n\t\tassertBrowserContextInitialized(this._browserContext);\n\n\t\tconst sliceMachineConfig = await this.project.getSliceMachineConfig();\n\n\t\tif (!sliceMachineConfig.localSliceSimulatorURL) {\n\t\t\t// TODO: Provide a more helpful error message.\n\t\t\tthrow new Error(\n\t\t\t\t\"A local Slice Simulator URL must be configured in your Slice Machine configuration file.\",\n\t\t\t);\n\t\t}\n\n\t\tconst { model } = await this.slices.readSlice({\n\t\t\tlibraryID: args.libraryID,\n\t\t\tsliceID: args.sliceID,\n\t\t});\n\t\tif (!model) {\n\t\t\tthrow new Error(\n\t\t\t\t`Did not find a Slice in library \"${args.libraryID}\" with ID \"${args.sliceID}\".`,\n\t\t\t);\n\t\t}\n\n\t\tconst viewport = args.viewport || DEFAULT_SCREENSHOT_VIEWPORT;\n\n\t\t// TODO: Change `model.name` to `args.sliceID`?\n\t\t// Making that change would require changing the screenshot\n\t\t// page path in Slice Machine UI.\n\t\tconst url = new URL(\n\t\t\t`./${encodeSliceSimulatorURLPart(args.libraryID)}/${model.name}/${\n\t\t\t\targs.variationID\n\t\t\t}/screenshot`,\n\t\t\targs.sliceMachineUIOrigin,\n\t\t);\n\t\turl.searchParams.set(\"screenWidth\", viewport.width.toString());\n\t\turl.searchParams.set(\"screenHeight\", viewport.height.toString());\n\n\t\tconst isURLAccessible = await checkIsURLAccessible(url.toString());\n\n\t\tif (!isURLAccessible) {\n\t\t\tthrow new Error(\n\t\t\t\t`Slice Simulator screenshot URL is not accessible: ${url}`,\n\t\t\t);\n\t\t}\n\n\t\tconst page = await this._browserContext.newPage();\n\t\tpage.setViewport(viewport);\n\n\t\tawait page.goto(url.toString(), { waitUntil: \"load\" });\n\t\tawait page.waitForSelector(SLICE_SIMULATOR_WAIT_FOR_SELECTOR, {\n\t\t\ttimeout: SLICE_SIMULATOR_WAIT_FOR_TIMEOUT,\n\t\t});\n\n\t\tconst element = await page.$(SLICE_SIMULATOR_SCREENSHOT_SELECTOR);\n\t\tif (!element) {\n\t\t\tconst baseURL = new URL(url.pathname, url.origin);\n\n\t\t\tthrow new Error(\n\t\t\t\t`Slice Simulator did not find ${SLICE_SIMULATOR_WAIT_FOR_SELECTOR} on the page. Verify the URL is correct: ${baseURL}`,\n\t\t\t);\n\t\t}\n\n\t\tconst data = (await element.screenshot({\n\t\t\tencoding: \"binary\",\n\t\t\tclip: {\n\t\t\t\twidth: viewport.width,\n\t\t\t\theight: viewport.height,\n\t\t\t\tx: 0,\n\t\t\t\ty: 0,\n\t\t\t},\n\t\t})) as Buffer;\n\n\t\treturn {\n\t\t\tdata,\n\t\t};\n\t}\n\n\tasync uploadScreenshot(\n\t\targs: ScreenshotsManagerUploadScreenshotArgs,\n\t): Promise<ScreenshotsManagerUploadScreenshotReturnType> {\n\t\tassertS3ACLInitialized(this._s3ACL);\n\n\t\tconst formData = new FormData();\n\n\t\tfor (const requiredFormDataFieldKey in this._s3ACL.requiredFormDataFields) {\n\t\t\tformData.append(\n\t\t\t\trequiredFormDataFieldKey,\n\t\t\t\tthis._s3ACL.requiredFormDataFields[requiredFormDataFieldKey],\n\t\t\t);\n\t\t}\n\n\t\tconst contentDigest = createContentDigest(args.data);\n\t\tconst fileType = await fileTypeFromBuffer(args.data);\n\t\tconst fileName = fileType\n\t\t\t? `${contentDigest}.${fileType.ext}`\n\t\t\t: contentDigest;\n\t\tconst key = args.keyPrefix ? `${args.keyPrefix}/${fileName}` : fileName;\n\n\t\tformData.set(\"key\", key);\n\n\t\tif (fileType) {\n\t\t\tformData.set(\"Content-Type\", fileType.mime);\n\t\t}\n\n\t\tformData.set(\"file\", new Blob([args.data], { type: fileType?.mime }));\n\n\t\tconst res = await fetch(this._s3ACL.uploadEndpoint, {\n\t\t\tmethod: \"POST\",\n\t\t\tbody: formData,\n\t\t});\n\n\t\tif (res.ok) {\n\t\t\tconst url = new URL(key, this._s3ACL.imgixEndpoint);\n\t\t\turl.searchParams.set(\"auto\", \"compress,format\");\n\n\t\t\treturn {\n\t\t\t\turl: url.toString(),\n\t\t\t};\n\t\t} else {\n\t\t\tthrow new Error(\n\t\t\t\t`Unable to upload screenshot with status code: ${res.status}`,\n\t\t\t);\n\t\t}\n\t}\n}\n"],"names":["BaseManager","InternalError","API_ENDPOINTS","fetch","SLICE_MACHINE_USER_AGENT","decode","t","checkIsURLAccessible","FormData","createContentDigest","fileTypeFromBuffer","Blob"],"mappings":"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"}
|
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
|
-
import type {
|
|
3
|
-
import { S3ACL } from "../../types";
|
|
2
|
+
import type { Viewport } from "puppeteer";
|
|
4
3
|
import { BaseManager } from "../BaseManager";
|
|
5
|
-
export declare function assertS3ACLInitialized(s3ACL: S3ACL | undefined): asserts s3ACL is NonNullable<typeof s3ACL>;
|
|
6
|
-
export declare function assertBrowserContextInitialized(browserContext: BrowserContext | undefined): asserts browserContext is NonNullable<typeof browserContext>;
|
|
7
4
|
type ScreenshotsManagerCaptureSliceSimulatorScreenshotArgs = {
|
|
5
|
+
sliceMachineUIOrigin: string;
|
|
8
6
|
libraryID: string;
|
|
9
7
|
sliceID: string;
|
|
10
8
|
variationID: string;
|