@itwin/core-common 3.5.0-dev.8 → 3.6.0-dev.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 +75 -1
- package/lib/cjs/BackendTypes.d.ts +13 -0
- package/lib/cjs/BackendTypes.d.ts.map +1 -0
- package/lib/cjs/BackendTypes.js +10 -0
- package/lib/cjs/BackendTypes.js.map +1 -0
- package/lib/cjs/Base64EncodedString.d.ts +2 -0
- package/lib/cjs/Base64EncodedString.d.ts.map +1 -1
- package/lib/cjs/Base64EncodedString.js +10 -0
- package/lib/cjs/Base64EncodedString.js.map +1 -1
- package/lib/cjs/ChangedElements.d.ts +3 -1
- package/lib/cjs/ChangedElements.d.ts.map +1 -1
- package/lib/cjs/ChangedElements.js +2 -0
- package/lib/cjs/ChangedElements.js.map +1 -1
- package/lib/cjs/ConcurrentQuery.d.ts +181 -1
- package/lib/cjs/ConcurrentQuery.d.ts.map +1 -1
- package/lib/cjs/ConcurrentQuery.js +175 -3
- package/lib/cjs/ConcurrentQuery.js.map +1 -1
- package/lib/cjs/ElementMesh.d.ts +40 -0
- package/lib/cjs/ElementMesh.d.ts.map +1 -0
- package/lib/cjs/ElementMesh.js +57 -0
- package/lib/cjs/ElementMesh.js.map +1 -0
- package/lib/cjs/ElementProps.d.ts +4 -1
- package/lib/cjs/ElementProps.d.ts.map +1 -1
- package/lib/cjs/ElementProps.js.map +1 -1
- package/lib/cjs/EntityReference.d.ts +52 -0
- package/lib/cjs/EntityReference.d.ts.map +1 -0
- package/lib/cjs/EntityReference.js +57 -0
- package/lib/cjs/EntityReference.js.map +1 -0
- package/lib/cjs/IpcAppProps.d.ts +18 -1
- package/lib/cjs/IpcAppProps.d.ts.map +1 -1
- package/lib/cjs/IpcAppProps.js +6 -1
- package/lib/cjs/IpcAppProps.js.map +1 -1
- package/lib/cjs/Localization.d.ts +2 -0
- package/lib/cjs/Localization.d.ts.map +1 -1
- package/lib/cjs/Localization.js.map +1 -1
- package/lib/cjs/ModelProps.d.ts +1 -0
- package/lib/cjs/ModelProps.d.ts.map +1 -1
- package/lib/cjs/ModelProps.js.map +1 -1
- package/lib/cjs/RenderSchedule.d.ts +12 -9
- package/lib/cjs/RenderSchedule.d.ts.map +1 -1
- package/lib/cjs/RenderSchedule.js +11 -9
- package/lib/cjs/RenderSchedule.js.map +1 -1
- package/lib/cjs/TextureMapping.d.ts +17 -2
- package/lib/cjs/TextureMapping.d.ts.map +1 -1
- package/lib/cjs/TextureMapping.js.map +1 -1
- package/lib/cjs/ViewDetails.d.ts.map +1 -1
- package/lib/cjs/ViewDetails.js +10 -2
- package/lib/cjs/ViewDetails.js.map +1 -1
- package/lib/cjs/core-common.d.ts +4 -0
- package/lib/cjs/core-common.d.ts.map +1 -1
- package/lib/cjs/core-common.js +4 -0
- package/lib/cjs/core-common.js.map +1 -1
- package/lib/cjs/ipc/IpcWebSocketTransport.d.ts.map +1 -1
- package/lib/cjs/ipc/IpcWebSocketTransport.js +5 -3
- package/lib/cjs/ipc/IpcWebSocketTransport.js.map +1 -1
- package/lib/cjs/rpc/IModelReadRpcInterface.d.ts +25 -1
- package/lib/cjs/rpc/IModelReadRpcInterface.d.ts.map +1 -1
- package/lib/cjs/rpc/IModelReadRpcInterface.js +8 -1
- package/lib/cjs/rpc/IModelReadRpcInterface.js.map +1 -1
- package/lib/cjs/rpc/core/RpcConfiguration.d.ts.map +1 -1
- package/lib/cjs/rpc/core/RpcConfiguration.js +0 -1
- package/lib/cjs/rpc/core/RpcConfiguration.js.map +1 -1
- package/lib/cjs/rpc/core/RpcControl.d.ts +2 -0
- package/lib/cjs/rpc/core/RpcControl.d.ts.map +1 -1
- package/lib/cjs/rpc/core/RpcControl.js +13 -18
- package/lib/cjs/rpc/core/RpcControl.js.map +1 -1
- package/lib/cjs/rpc/core/RpcInvocation.d.ts.map +1 -1
- package/lib/cjs/rpc/core/RpcInvocation.js +1 -0
- package/lib/cjs/rpc/core/RpcInvocation.js.map +1 -1
- package/lib/cjs/rpc/core/RpcMarshaling.d.ts +2 -3
- package/lib/cjs/rpc/core/RpcMarshaling.d.ts.map +1 -1
- package/lib/cjs/rpc/core/RpcMarshaling.js +5 -2
- package/lib/cjs/rpc/core/RpcMarshaling.js.map +1 -1
- package/lib/cjs/rpc/web/RpcMultipart.d.ts +11 -7
- package/lib/cjs/rpc/web/RpcMultipart.d.ts.map +1 -1
- package/lib/cjs/rpc/web/RpcMultipart.js +17 -12
- package/lib/cjs/rpc/web/RpcMultipart.js.map +1 -1
- package/lib/cjs/rpc/web/WebAppRpcLogging.d.ts +19 -8
- package/lib/cjs/rpc/web/WebAppRpcLogging.d.ts.map +1 -1
- package/lib/cjs/rpc/web/WebAppRpcLogging.js +62 -63
- package/lib/cjs/rpc/web/WebAppRpcLogging.js.map +1 -1
- package/lib/cjs/rpc/web/WebAppRpcProtocol.d.ts +4 -3
- package/lib/cjs/rpc/web/WebAppRpcProtocol.d.ts.map +1 -1
- package/lib/cjs/rpc/web/WebAppRpcProtocol.js.map +1 -1
- package/lib/cjs/rpc/web/WebAppRpcRequest.d.ts +6 -10
- package/lib/cjs/rpc/web/WebAppRpcRequest.d.ts.map +1 -1
- package/lib/cjs/rpc/web/WebAppRpcRequest.js +14 -149
- package/lib/cjs/rpc/web/WebAppRpcRequest.js.map +1 -1
- package/lib/cjs/rpc/web/multipart/RpcMultipartParser.d.ts +2 -3
- package/lib/cjs/rpc/web/multipart/RpcMultipartParser.d.ts.map +1 -1
- package/lib/cjs/rpc/web/multipart/RpcMultipartParser.js +34 -21
- package/lib/cjs/rpc/web/multipart/RpcMultipartParser.js.map +1 -1
- package/lib/cjs/tile/ElementGraphics.d.ts +13 -2
- package/lib/cjs/tile/ElementGraphics.d.ts.map +1 -1
- package/lib/cjs/tile/ElementGraphics.js.map +1 -1
- package/lib/esm/BackendTypes.d.ts +13 -0
- package/lib/esm/BackendTypes.d.ts.map +1 -0
- package/lib/esm/BackendTypes.js +9 -0
- package/lib/esm/BackendTypes.js.map +1 -0
- package/lib/esm/Base64EncodedString.d.ts +2 -0
- package/lib/esm/Base64EncodedString.d.ts.map +1 -1
- package/lib/esm/Base64EncodedString.js +10 -0
- package/lib/esm/Base64EncodedString.js.map +1 -1
- package/lib/esm/ChangedElements.d.ts +3 -1
- package/lib/esm/ChangedElements.d.ts.map +1 -1
- package/lib/esm/ChangedElements.js +2 -0
- package/lib/esm/ChangedElements.js.map +1 -1
- package/lib/esm/ConcurrentQuery.d.ts +181 -1
- package/lib/esm/ConcurrentQuery.d.ts.map +1 -1
- package/lib/esm/ConcurrentQuery.js +175 -3
- package/lib/esm/ConcurrentQuery.js.map +1 -1
- package/lib/esm/ElementMesh.d.ts +40 -0
- package/lib/esm/ElementMesh.d.ts.map +1 -0
- package/lib/esm/ElementMesh.js +53 -0
- package/lib/esm/ElementMesh.js.map +1 -0
- package/lib/esm/ElementProps.d.ts +4 -1
- package/lib/esm/ElementProps.d.ts.map +1 -1
- package/lib/esm/ElementProps.js.map +1 -1
- package/lib/esm/EntityReference.d.ts +52 -0
- package/lib/esm/EntityReference.d.ts.map +1 -0
- package/lib/esm/EntityReference.js +53 -0
- package/lib/esm/EntityReference.js.map +1 -0
- package/lib/esm/IpcAppProps.d.ts +18 -1
- package/lib/esm/IpcAppProps.d.ts.map +1 -1
- package/lib/esm/IpcAppProps.js +4 -0
- package/lib/esm/IpcAppProps.js.map +1 -1
- package/lib/esm/Localization.d.ts +2 -0
- package/lib/esm/Localization.d.ts.map +1 -1
- package/lib/esm/Localization.js.map +1 -1
- package/lib/esm/ModelProps.d.ts +1 -0
- package/lib/esm/ModelProps.d.ts.map +1 -1
- package/lib/esm/ModelProps.js.map +1 -1
- package/lib/esm/RenderSchedule.d.ts +12 -9
- package/lib/esm/RenderSchedule.d.ts.map +1 -1
- package/lib/esm/RenderSchedule.js +11 -9
- package/lib/esm/RenderSchedule.js.map +1 -1
- package/lib/esm/TextureMapping.d.ts +17 -2
- package/lib/esm/TextureMapping.d.ts.map +1 -1
- package/lib/esm/TextureMapping.js.map +1 -1
- package/lib/esm/ViewDetails.d.ts.map +1 -1
- package/lib/esm/ViewDetails.js +11 -3
- package/lib/esm/ViewDetails.js.map +1 -1
- package/lib/esm/core-common.d.ts +4 -0
- package/lib/esm/core-common.d.ts.map +1 -1
- package/lib/esm/core-common.js +4 -0
- package/lib/esm/core-common.js.map +1 -1
- package/lib/esm/ipc/IpcWebSocketTransport.d.ts.map +1 -1
- package/lib/esm/ipc/IpcWebSocketTransport.js +5 -3
- package/lib/esm/ipc/IpcWebSocketTransport.js.map +1 -1
- package/lib/esm/rpc/IModelReadRpcInterface.d.ts +25 -1
- package/lib/esm/rpc/IModelReadRpcInterface.d.ts.map +1 -1
- package/lib/esm/rpc/IModelReadRpcInterface.js +8 -1
- package/lib/esm/rpc/IModelReadRpcInterface.js.map +1 -1
- package/lib/esm/rpc/core/RpcConfiguration.d.ts.map +1 -1
- package/lib/esm/rpc/core/RpcConfiguration.js +0 -1
- package/lib/esm/rpc/core/RpcConfiguration.js.map +1 -1
- package/lib/esm/rpc/core/RpcControl.d.ts +2 -0
- package/lib/esm/rpc/core/RpcControl.d.ts.map +1 -1
- package/lib/esm/rpc/core/RpcControl.js +13 -18
- package/lib/esm/rpc/core/RpcControl.js.map +1 -1
- package/lib/esm/rpc/core/RpcInvocation.d.ts.map +1 -1
- package/lib/esm/rpc/core/RpcInvocation.js +2 -1
- package/lib/esm/rpc/core/RpcInvocation.js.map +1 -1
- package/lib/esm/rpc/core/RpcMarshaling.d.ts +2 -3
- package/lib/esm/rpc/core/RpcMarshaling.d.ts.map +1 -1
- package/lib/esm/rpc/core/RpcMarshaling.js +5 -2
- package/lib/esm/rpc/core/RpcMarshaling.js.map +1 -1
- package/lib/esm/rpc/web/RpcMultipart.d.ts +11 -7
- package/lib/esm/rpc/web/RpcMultipart.d.ts.map +1 -1
- package/lib/esm/rpc/web/RpcMultipart.js +17 -12
- package/lib/esm/rpc/web/RpcMultipart.js.map +1 -1
- package/lib/esm/rpc/web/WebAppRpcLogging.d.ts +19 -8
- package/lib/esm/rpc/web/WebAppRpcLogging.d.ts.map +1 -1
- package/lib/esm/rpc/web/WebAppRpcLogging.js +62 -63
- package/lib/esm/rpc/web/WebAppRpcLogging.js.map +1 -1
- package/lib/esm/rpc/web/WebAppRpcProtocol.d.ts +4 -3
- package/lib/esm/rpc/web/WebAppRpcProtocol.d.ts.map +1 -1
- package/lib/esm/rpc/web/WebAppRpcProtocol.js.map +1 -1
- package/lib/esm/rpc/web/WebAppRpcRequest.d.ts +6 -10
- package/lib/esm/rpc/web/WebAppRpcRequest.d.ts.map +1 -1
- package/lib/esm/rpc/web/WebAppRpcRequest.js +15 -150
- package/lib/esm/rpc/web/WebAppRpcRequest.js.map +1 -1
- package/lib/esm/rpc/web/multipart/RpcMultipartParser.d.ts +2 -3
- package/lib/esm/rpc/web/multipart/RpcMultipartParser.d.ts.map +1 -1
- package/lib/esm/rpc/web/multipart/RpcMultipartParser.js +34 -21
- package/lib/esm/rpc/web/multipart/RpcMultipartParser.js.map +1 -1
- package/lib/esm/tile/ElementGraphics.d.ts +13 -2
- package/lib/esm/tile/ElementGraphics.d.ts.map +1 -1
- package/lib/esm/tile/ElementGraphics.js.map +1 -1
- package/package.json +8 -10
|
@@ -6,14 +6,13 @@
|
|
|
6
6
|
/** @packageDocumentation
|
|
7
7
|
* @module RpcInterface
|
|
8
8
|
*/
|
|
9
|
+
var _a;
|
|
9
10
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
11
|
exports.WebAppRpcRequest = void 0;
|
|
11
12
|
const core_bentley_1 = require("@itwin/core-bentley");
|
|
12
|
-
const buffer_1 = require("buffer");
|
|
13
13
|
const IModelError_1 = require("../../IModelError");
|
|
14
14
|
const RpcConstants_1 = require("../core/RpcConstants");
|
|
15
15
|
const RpcMarshaling_1 = require("../core/RpcMarshaling");
|
|
16
|
-
const RpcProtocol_1 = require("../core/RpcProtocol");
|
|
17
16
|
const RpcRequest_1 = require("../core/RpcRequest");
|
|
18
17
|
const RpcMultipartParser_1 = require("./multipart/RpcMultipartParser");
|
|
19
18
|
const RpcMultipart_1 = require("./RpcMultipart");
|
|
@@ -37,87 +36,13 @@ class WebAppRpcRequest extends RpcRequest_1.RpcRequest {
|
|
|
37
36
|
this._request.headers = {};
|
|
38
37
|
}
|
|
39
38
|
get _headers() { return this._request.headers; }
|
|
40
|
-
/** Parse headers */
|
|
41
|
-
static parseHeaders(protocol, req) {
|
|
42
|
-
var _a;
|
|
43
|
-
const headerNames = protocol.serializedClientRequestContextHeaderNames;
|
|
44
|
-
const parsedHeaders = {
|
|
45
|
-
id: req.header(headerNames.id) || "",
|
|
46
|
-
applicationId: req.header(headerNames.applicationId) || "",
|
|
47
|
-
applicationVersion: req.header(headerNames.applicationVersion) || "",
|
|
48
|
-
sessionId: req.header(headerNames.sessionId) || "",
|
|
49
|
-
authorization: (_a = (headerNames.authorization ? req.header(headerNames.authorization) : "")) !== null && _a !== void 0 ? _a : "",
|
|
50
|
-
};
|
|
51
|
-
return parsedHeaders;
|
|
52
|
-
}
|
|
53
39
|
/** Parses a request. */
|
|
54
40
|
static async parseRequest(protocol, req) {
|
|
55
|
-
|
|
56
|
-
const parsedHeaders = this.parseHeaders(protocol, req);
|
|
57
|
-
const request = {
|
|
58
|
-
...parsedHeaders,
|
|
59
|
-
operation: {
|
|
60
|
-
interfaceDefinition: operation.interfaceDefinition,
|
|
61
|
-
operationName: operation.operationName,
|
|
62
|
-
interfaceVersion: operation.interfaceVersion,
|
|
63
|
-
},
|
|
64
|
-
method: req.method,
|
|
65
|
-
path: req.url,
|
|
66
|
-
parameters: operation.encodedRequest ? WebAppRpcRequest.parseFromPath(operation) : await WebAppRpcRequest.parseFromBody(req),
|
|
67
|
-
caching: operation.encodedRequest ? RpcConstants_1.RpcResponseCacheControl.Immutable : RpcConstants_1.RpcResponseCacheControl.None,
|
|
68
|
-
};
|
|
69
|
-
request.ip = req.ip;
|
|
70
|
-
request.protocolVersion = 0;
|
|
71
|
-
if (protocol.protocolVersionHeaderName) {
|
|
72
|
-
const version = req.header(protocol.protocolVersionHeaderName);
|
|
73
|
-
if (version) {
|
|
74
|
-
request.protocolVersion = parseInt(version, 10);
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
if (!request.id) {
|
|
78
|
-
throw new IModelError_1.IModelError(core_bentley_1.BentleyStatus.ERROR, `Invalid request: Missing required activity ID.`);
|
|
79
|
-
}
|
|
80
|
-
return request;
|
|
41
|
+
return this.backend.parseRequest(protocol, req);
|
|
81
42
|
}
|
|
82
43
|
/** Sends the response for a web request. */
|
|
83
44
|
static async sendResponse(protocol, request, fulfillment, req, res) {
|
|
84
|
-
|
|
85
|
-
const versionHeader = protocol.protocolVersionHeaderName;
|
|
86
|
-
if (versionHeader && RpcProtocol_1.RpcProtocol.protocolVersion) {
|
|
87
|
-
res.set(versionHeader, RpcProtocol_1.RpcProtocol.protocolVersion.toString());
|
|
88
|
-
}
|
|
89
|
-
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
90
|
-
const { Readable, Stream } = await Promise.resolve().then(() => require(/* webpackIgnore: true */ "stream"));
|
|
91
|
-
const { createGzip } = await Promise.resolve().then(() => require(/* webpackIgnore: true */ "zlib"));
|
|
92
|
-
const transportType = WebAppRpcRequest.computeTransportType(fulfillment.result, fulfillment.rawResult);
|
|
93
|
-
let responseBody;
|
|
94
|
-
if (transportType === RpcConstants_1.RpcContentType.Binary) {
|
|
95
|
-
responseBody = WebAppRpcRequest.configureBinary(fulfillment, res);
|
|
96
|
-
}
|
|
97
|
-
else if (transportType === RpcConstants_1.RpcContentType.Multipart) {
|
|
98
|
-
responseBody = WebAppRpcRequest.configureMultipart(fulfillment, res);
|
|
99
|
-
}
|
|
100
|
-
else if (transportType === RpcConstants_1.RpcContentType.Stream) {
|
|
101
|
-
responseBody = WebAppRpcRequest.configureStream(fulfillment);
|
|
102
|
-
}
|
|
103
|
-
else {
|
|
104
|
-
responseBody = WebAppRpcRequest.configureText(fulfillment, res);
|
|
105
|
-
}
|
|
106
|
-
WebAppRpcRequest.configureResponse(protocol, request, fulfillment, res);
|
|
107
|
-
res.status(fulfillment.status);
|
|
108
|
-
if (fulfillment.allowCompression && ((_a = req.header("Accept-Encoding")) === null || _a === void 0 ? void 0 : _a.includes("gzip"))) {
|
|
109
|
-
res.set("Content-Encoding", "gzip");
|
|
110
|
-
const readableResponseBody = (responseBody instanceof Stream) ? responseBody : Readable.from(responseBody);
|
|
111
|
-
responseBody = readableResponseBody.pipe(createGzip());
|
|
112
|
-
}
|
|
113
|
-
// This check should in theory look for instances of Readable, but that would break backend implementation at
|
|
114
|
-
// core/backend/src/RpcBackend.ts
|
|
115
|
-
if (responseBody instanceof Stream) {
|
|
116
|
-
responseBody.pipe(res);
|
|
117
|
-
}
|
|
118
|
-
else {
|
|
119
|
-
res.send(responseBody);
|
|
120
|
-
}
|
|
45
|
+
return this.backend.sendResponse(protocol, request, fulfillment, req, res);
|
|
121
46
|
}
|
|
122
47
|
/** Determines the most efficient transport type for an RPC value. */
|
|
123
48
|
static computeTransportType(value, source) {
|
|
@@ -224,76 +149,6 @@ class WebAppRpcRequest extends RpcRequest_1.RpcRequest {
|
|
|
224
149
|
supplyRequest() {
|
|
225
150
|
return Request;
|
|
226
151
|
}
|
|
227
|
-
static configureResponse(protocol, request, fulfillment, res) {
|
|
228
|
-
const success = protocol.getStatus(fulfillment.status) === RpcConstants_1.RpcRequestStatus.Resolved;
|
|
229
|
-
// TODO: Use stale-while-revalidate in cache headers. This needs to be tested, and does not currently have support in the router/caching-service.
|
|
230
|
-
// This will allow browsers to use stale cached responses while also revalidating with the router, allowing us to start up a backend if necessary.
|
|
231
|
-
// RPC Caching Service uses the s-maxage header to determine the TTL for the redis cache.
|
|
232
|
-
const oneHourInSeconds = 3600;
|
|
233
|
-
if (success && request.caching === RpcConstants_1.RpcResponseCacheControl.Immutable) {
|
|
234
|
-
// If response size is > 50 MB, do not cache it.
|
|
235
|
-
if (fulfillment.result.objects.length > (50 * 10 ** 7)) {
|
|
236
|
-
res.set("Cache-Control", "no-store");
|
|
237
|
-
}
|
|
238
|
-
else if (request.operation.operationName === "generateTileContent") {
|
|
239
|
-
res.set("Cache-Control", "no-store");
|
|
240
|
-
}
|
|
241
|
-
else if (request.operation.operationName === "getConnectionProps") {
|
|
242
|
-
// GetConnectionprops can't be cached on the browser longer than the lifespan of the backend. The lifespan of backend may shrink too. Keep it at 1 second to be safe.
|
|
243
|
-
res.set("Cache-Control", `s-maxage=${oneHourInSeconds * 24}, max-age=1, immutable`);
|
|
244
|
-
}
|
|
245
|
-
else if (request.operation.operationName === "getTileCacheContainerUrl") {
|
|
246
|
-
// getTileCacheContainerUrl returns a SAS with an expiry of 23:59:59. We can't exceed that time when setting the max-age.
|
|
247
|
-
res.set("Cache-Control", `s-maxage=${oneHourInSeconds * 23}, max-age=${oneHourInSeconds * 23}, immutable`);
|
|
248
|
-
}
|
|
249
|
-
else {
|
|
250
|
-
res.set("Cache-Control", `s-maxage=${oneHourInSeconds * 24}, max-age=${oneHourInSeconds * 48}, immutable`);
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
if (fulfillment.retry) {
|
|
254
|
-
res.set("Retry-After", fulfillment.retry);
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
static configureText(fulfillment, res) {
|
|
258
|
-
res.set(RpcConstants_1.WEB_RPC_CONSTANTS.CONTENT, RpcConstants_1.WEB_RPC_CONSTANTS.TEXT);
|
|
259
|
-
return (fulfillment.status === 204) ? "" : fulfillment.result.objects;
|
|
260
|
-
}
|
|
261
|
-
static configureBinary(fulfillment, res) {
|
|
262
|
-
res.set(RpcConstants_1.WEB_RPC_CONSTANTS.CONTENT, RpcConstants_1.WEB_RPC_CONSTANTS.BINARY);
|
|
263
|
-
const data = fulfillment.result.data[0];
|
|
264
|
-
return buffer_1.Buffer.isBuffer(data) ? data : buffer_1.Buffer.from(data);
|
|
265
|
-
}
|
|
266
|
-
static configureMultipart(fulfillment, res) {
|
|
267
|
-
const response = RpcMultipart_1.RpcMultipart.createStream(fulfillment.result);
|
|
268
|
-
const headers = response.getHeaders();
|
|
269
|
-
for (const header in headers) {
|
|
270
|
-
if (headers.hasOwnProperty(header)) {
|
|
271
|
-
res.set(header, headers[header]);
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
|
-
return response;
|
|
275
|
-
}
|
|
276
|
-
static configureStream(fulfillment) {
|
|
277
|
-
return fulfillment.result.stream;
|
|
278
|
-
}
|
|
279
|
-
static parseFromPath(operation) {
|
|
280
|
-
const decoded = operation.encodedRequest ? buffer_1.Buffer.from(operation.encodedRequest, "base64").toString("binary") : "";
|
|
281
|
-
return RpcMarshaling_1.RpcSerializedValue.create(decoded);
|
|
282
|
-
}
|
|
283
|
-
static async parseFromBody(req) {
|
|
284
|
-
const contentType = WebAppRpcProtocol_1.WebAppRpcProtocol.computeContentType(req.header(RpcConstants_1.WEB_RPC_CONSTANTS.CONTENT));
|
|
285
|
-
if (contentType === RpcConstants_1.RpcContentType.Binary) {
|
|
286
|
-
const objects = JSON.stringify([RpcMarshaling_1.MarshalingBinaryMarker.createDefault()]);
|
|
287
|
-
const data = [req.body];
|
|
288
|
-
return RpcMarshaling_1.RpcSerializedValue.create(objects, data);
|
|
289
|
-
}
|
|
290
|
-
else if (contentType === RpcConstants_1.RpcContentType.Multipart) {
|
|
291
|
-
return RpcMultipart_1.RpcMultipart.parseRequest(req);
|
|
292
|
-
}
|
|
293
|
-
else {
|
|
294
|
-
return RpcMarshaling_1.RpcSerializedValue.create(req.body);
|
|
295
|
-
}
|
|
296
|
-
}
|
|
297
152
|
async performFetch() {
|
|
298
153
|
const requestClass = this.supplyRequest();
|
|
299
154
|
const fetchFunction = this.supplyFetch();
|
|
@@ -321,7 +176,7 @@ class WebAppRpcRequest extends RpcRequest_1.RpcRequest {
|
|
|
321
176
|
}
|
|
322
177
|
async loadMultipart(response, contentType) {
|
|
323
178
|
const data = await response.arrayBuffer();
|
|
324
|
-
const value = new RpcMultipartParser_1.RpcMultipartParser(contentType,
|
|
179
|
+
const value = new RpcMultipartParser_1.RpcMultipartParser(contentType, new Uint8Array(data)).parse();
|
|
325
180
|
return value;
|
|
326
181
|
}
|
|
327
182
|
async setupTransport() {
|
|
@@ -366,10 +221,20 @@ class WebAppRpcRequest extends RpcRequest_1.RpcRequest {
|
|
|
366
221
|
}
|
|
367
222
|
}
|
|
368
223
|
exports.WebAppRpcRequest = WebAppRpcRequest;
|
|
224
|
+
_a = WebAppRpcRequest;
|
|
369
225
|
/** The maximum size permitted for an encoded component in a URL.
|
|
370
226
|
* Note that some backends limit the total cumulative request size. Our current node backends accept requests with a max size of 16 kb.
|
|
371
227
|
* In addition to the url size, an authorization header may also add considerably to the request size.
|
|
372
228
|
* @note This is used for features like encoding the payload of a cacheable request in the URL.
|
|
373
229
|
*/
|
|
374
230
|
WebAppRpcRequest.maxUrlComponentSize = 1024 * 8;
|
|
231
|
+
/** @internal */
|
|
232
|
+
WebAppRpcRequest.backend = {
|
|
233
|
+
sendResponse: async (_protocol, _request, _fulfillment, _req, _res) => {
|
|
234
|
+
throw new IModelError_1.IModelError(core_bentley_1.BentleyStatus.ERROR, "Not bound.");
|
|
235
|
+
},
|
|
236
|
+
parseRequest: async (_protocol, _req) => {
|
|
237
|
+
throw new IModelError_1.IModelError(core_bentley_1.BentleyStatus.ERROR, "Not bound.");
|
|
238
|
+
},
|
|
239
|
+
};
|
|
375
240
|
//# sourceMappingURL=WebAppRpcRequest.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebAppRpcRequest.js","sourceRoot":"","sources":["../../../../src/rpc/web/WebAppRpcRequest.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module RpcInterface\r\n */\r\n\r\nimport { BentleyStatus } from \"@itwin/core-bentley\";\r\nimport { Buffer } from \"buffer\";\r\nimport { IModelError, ServerError, ServerTimeoutError } from \"../../IModelError\";\r\nimport { RpcInterface } from \"../../RpcInterface\";\r\nimport { RpcContentType, RpcProtocolEvent, RpcRequestStatus, RpcResponseCacheControl, WEB_RPC_CONSTANTS } from \"../core/RpcConstants\";\r\nimport { SerializedRpcActivity } from \"../core/RpcInvocation\";\r\nimport { MarshalingBinaryMarker, RpcSerializedValue } from \"../core/RpcMarshaling\";\r\nimport { RpcProtocol, RpcRequestFulfillment, SerializedRpcOperation, SerializedRpcRequest } from \"../core/RpcProtocol\";\r\nimport { RpcRequest } from \"../core/RpcRequest\";\r\nimport { RpcMultipartParser } from \"./multipart/RpcMultipartParser\";\r\nimport { ReadableFormData, RpcMultipart } from \"./RpcMultipart\";\r\nimport { HttpServerRequest, HttpServerResponse, WebAppRpcProtocol } from \"./WebAppRpcProtocol\";\r\n\r\n/** @internal */\r\nexport type HttpMethod_T = \"get\" | \"put\" | \"post\" | \"delete\" | \"options\" | \"head\" | \"patch\" | \"trace\"; // eslint-disable-line @typescript-eslint/naming-convention\r\n\r\n/** A web application RPC request.\r\n * @internal\r\n */\r\nexport class WebAppRpcRequest extends RpcRequest {\r\n private _loading: boolean = false;\r\n private _request: RequestInit = {};\r\n private _pathSuffix: string = \"\";\r\n private get _headers() { return this._request.headers as { [key: string]: string }; }\r\n\r\n /** The maximum size permitted for an encoded component in a URL.\r\n * Note that some backends limit the total cumulative request size. Our current node backends accept requests with a max size of 16 kb.\r\n * In addition to the url size, an authorization header may also add considerably to the request size.\r\n * @note This is used for features like encoding the payload of a cacheable request in the URL.\r\n */\r\n public static maxUrlComponentSize = 1024 * 8;\r\n\r\n /** The HTTP method for this request. */\r\n public override method: HttpMethod_T;\r\n\r\n /** Convenience access to the protocol of this request. */\r\n public override readonly protocol: WebAppRpcProtocol = this.client.configuration.protocol as any;\r\n\r\n /** Standardized access to metadata about the request (useful for purposes such as logging). */\r\n public metadata = { status: 0, message: \"\" };\r\n\r\n /** Parse headers */\r\n private static parseHeaders(protocol: WebAppRpcProtocol, req: HttpServerRequest): SerializedRpcActivity {\r\n const headerNames: SerializedRpcActivity = protocol.serializedClientRequestContextHeaderNames;\r\n const parsedHeaders: SerializedRpcActivity = {\r\n id: req.header(headerNames.id) || \"\",\r\n applicationId: req.header(headerNames.applicationId) || \"\",\r\n applicationVersion: req.header(headerNames.applicationVersion) || \"\",\r\n sessionId: req.header(headerNames.sessionId) || \"\",\r\n authorization: (headerNames.authorization ? req.header(headerNames.authorization) : \"\") ?? \"\",\r\n };\r\n return parsedHeaders;\r\n }\r\n\r\n /** Parses a request. */\r\n public static async parseRequest(protocol: WebAppRpcProtocol, req: HttpServerRequest): Promise<SerializedRpcRequest> {\r\n const operation = protocol.getOperationFromPath(req.url!);\r\n\r\n const parsedHeaders = this.parseHeaders(protocol, req);\r\n\r\n const request: SerializedRpcRequest = {\r\n ...parsedHeaders,\r\n operation: {\r\n interfaceDefinition: operation.interfaceDefinition,\r\n operationName: operation.operationName,\r\n interfaceVersion: operation.interfaceVersion,\r\n },\r\n method: req.method,\r\n path: req.url!,\r\n parameters: operation.encodedRequest ? WebAppRpcRequest.parseFromPath(operation) : await WebAppRpcRequest.parseFromBody(req),\r\n caching: operation.encodedRequest ? RpcResponseCacheControl.Immutable : RpcResponseCacheControl.None,\r\n };\r\n\r\n request.ip = req.ip;\r\n\r\n request.protocolVersion = 0;\r\n\r\n if (protocol.protocolVersionHeaderName) {\r\n const version = req.header(protocol.protocolVersionHeaderName);\r\n if (version) {\r\n request.protocolVersion = parseInt(version, 10);\r\n }\r\n }\r\n\r\n if (!request.id) {\r\n throw new IModelError(BentleyStatus.ERROR, `Invalid request: Missing required activity ID.`);\r\n }\r\n\r\n return request;\r\n }\r\n\r\n /** Sends the response for a web request. */\r\n public static async sendResponse(\r\n protocol: WebAppRpcProtocol,\r\n request: SerializedRpcRequest,\r\n fulfillment: RpcRequestFulfillment,\r\n req: HttpServerRequest,\r\n res: HttpServerResponse,\r\n ): Promise<void> {\r\n const versionHeader = protocol.protocolVersionHeaderName;\r\n if (versionHeader && RpcProtocol.protocolVersion) {\r\n res.set(versionHeader, RpcProtocol.protocolVersion.toString());\r\n }\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n const { Readable, Stream } = await import(/* webpackIgnore: true */ \"stream\");\r\n const { createGzip } = await import(/* webpackIgnore: true */ \"zlib\");\r\n\r\n const transportType = WebAppRpcRequest.computeTransportType(fulfillment.result, fulfillment.rawResult);\r\n let responseBody;\r\n if (transportType === RpcContentType.Binary) {\r\n responseBody = WebAppRpcRequest.configureBinary(fulfillment, res);\r\n } else if (transportType === RpcContentType.Multipart) {\r\n responseBody = WebAppRpcRequest.configureMultipart(fulfillment, res);\r\n } else if (transportType === RpcContentType.Stream) {\r\n responseBody = WebAppRpcRequest.configureStream(fulfillment);\r\n } else {\r\n responseBody = WebAppRpcRequest.configureText(fulfillment, res);\r\n }\r\n\r\n WebAppRpcRequest.configureResponse(protocol, request, fulfillment, res);\r\n res.status(fulfillment.status);\r\n\r\n if (fulfillment.allowCompression && req.header(\"Accept-Encoding\")?.includes(\"gzip\")) {\r\n res.set(\"Content-Encoding\", \"gzip\");\r\n const readableResponseBody = (responseBody instanceof Stream) ? responseBody : Readable.from(responseBody);\r\n responseBody = readableResponseBody.pipe(createGzip());\r\n }\r\n\r\n // This check should in theory look for instances of Readable, but that would break backend implementation at\r\n // core/backend/src/RpcBackend.ts\r\n if (responseBody instanceof Stream) {\r\n responseBody.pipe(res);\r\n } else {\r\n res.send(responseBody);\r\n }\r\n }\r\n\r\n /** Determines the most efficient transport type for an RPC value. */\r\n protected static computeTransportType(value: RpcSerializedValue, source: any): RpcContentType {\r\n if (source instanceof Uint8Array || (Array.isArray(source) && source[0] instanceof Uint8Array)) {\r\n return RpcContentType.Binary;\r\n } else if (value.data.length > 0) {\r\n return RpcContentType.Multipart;\r\n } else if (value.stream) {\r\n return RpcContentType.Stream;\r\n } else {\r\n return RpcContentType.Text;\r\n }\r\n }\r\n\r\n /** Constructs a web application request. */\r\n public constructor(client: RpcInterface, operation: string, parameters: any[]) {\r\n super(client, operation, parameters);\r\n this.path = this.protocol.supplyPathForOperation(this.operation, this);\r\n this.method = \"head\";\r\n this._request.headers = {};\r\n }\r\n\r\n /** Sets request header values. */\r\n protected setHeader(name: string, value: string): void {\r\n this._headers[name] = value;\r\n }\r\n\r\n /** Sends the request. */\r\n protected async send(): Promise<number> {\r\n this._loading = true;\r\n await this.setupTransport();\r\n\r\n return new Promise<number>(async (resolve, reject) => {\r\n try {\r\n resolve(await this.performFetch());\r\n } catch (reason) {\r\n reject(new ServerError(-1, typeof (reason) === \"string\" ? reason : \"Server connection error.\"));\r\n }\r\n });\r\n }\r\n\r\n protected override computeRetryAfter(attempts: number): number {\r\n const retryAfter = this._response && this._response.headers.get(\"Retry-After\");\r\n if (retryAfter) {\r\n this.resetTransientFaultCount();\r\n\r\n const r = Number(retryAfter);\r\n if (Number.isFinite(r)) {\r\n return r * 1000;\r\n }\r\n\r\n const d = Date.parse(retryAfter);\r\n if (!Number.isNaN(d)) {\r\n return d - Date.now();\r\n }\r\n } else {\r\n this.recordTransientFault();\r\n }\r\n\r\n return super.computeRetryAfter(attempts);\r\n }\r\n\r\n protected override handleUnknownResponse(code: number) {\r\n if (this.protocol.isTimeout(code)) {\r\n this.reject(new ServerTimeoutError(\"Request timeout.\"));\r\n } else {\r\n this.reject(new ServerError(code, \"Unknown server response code.\"));\r\n }\r\n }\r\n\r\n protected async load(): Promise<RpcSerializedValue> {\r\n return new Promise<RpcSerializedValue>(async (resolve, reject) => {\r\n try {\r\n if (!this._loading)\r\n return;\r\n\r\n const response = this._response;\r\n if (!response) {\r\n reject(new IModelError(BentleyStatus.ERROR, \"Invalid state.\"));\r\n return;\r\n }\r\n\r\n if (this.protocol.protocolVersionHeaderName) {\r\n const version = response.headers.get(this.protocol.protocolVersionHeaderName);\r\n if (version) {\r\n this.responseProtocolVersion = parseInt(version, 10);\r\n }\r\n }\r\n\r\n const contentType = response.headers.get(WEB_RPC_CONSTANTS.CONTENT);\r\n const responseType = WebAppRpcProtocol.computeContentType(contentType);\r\n\r\n if (responseType === RpcContentType.Binary) {\r\n resolve(await this.loadBinary(response));\r\n } else if (responseType === RpcContentType.Multipart) {\r\n resolve(await this.loadMultipart(response, contentType!));\r\n } else {\r\n resolve(await this.loadText(response));\r\n }\r\n\r\n this._loading = false;\r\n this.setLastUpdatedTime();\r\n this.protocol.events.raiseEvent(RpcProtocolEvent.ResponseLoaded, this);\r\n } catch (reason) {\r\n if (!this._loading)\r\n return;\r\n\r\n this._loading = false;\r\n reject(new ServerError(this.metadata.status, typeof (reason) === \"string\" ? reason : \"Unknown server response error.\"));\r\n }\r\n });\r\n }\r\n\r\n /** Override to supply an alternate fetch function. */\r\n protected supplyFetch(): typeof fetch {\r\n return fetch;\r\n }\r\n\r\n /** Override to supply an alternate Request function. */\r\n protected supplyRequest(): typeof Request {\r\n return Request;\r\n }\r\n\r\n private static configureResponse(protocol: WebAppRpcProtocol, request: SerializedRpcRequest, fulfillment: RpcRequestFulfillment, res: HttpServerResponse) {\r\n const success = protocol.getStatus(fulfillment.status) === RpcRequestStatus.Resolved;\r\n // TODO: Use stale-while-revalidate in cache headers. This needs to be tested, and does not currently have support in the router/caching-service.\r\n // This will allow browsers to use stale cached responses while also revalidating with the router, allowing us to start up a backend if necessary.\r\n\r\n // RPC Caching Service uses the s-maxage header to determine the TTL for the redis cache.\r\n const oneHourInSeconds = 3600;\r\n if (success && request.caching === RpcResponseCacheControl.Immutable) {\r\n // If response size is > 50 MB, do not cache it.\r\n if (fulfillment.result.objects.length > (50 * 10**7)) {\r\n res.set(\"Cache-Control\", \"no-store\");\r\n } else if (request.operation.operationName === \"generateTileContent\") {\r\n res.set(\"Cache-Control\", \"no-store\");\r\n } else if (request.operation.operationName === \"getConnectionProps\") {\r\n // GetConnectionprops can't be cached on the browser longer than the lifespan of the backend. The lifespan of backend may shrink too. Keep it at 1 second to be safe.\r\n res.set(\"Cache-Control\", `s-maxage=${oneHourInSeconds * 24}, max-age=1, immutable`);\r\n } else if (request.operation.operationName === \"getTileCacheContainerUrl\") {\r\n // getTileCacheContainerUrl returns a SAS with an expiry of 23:59:59. We can't exceed that time when setting the max-age.\r\n res.set(\"Cache-Control\", `s-maxage=${oneHourInSeconds * 23}, max-age=${oneHourInSeconds * 23}, immutable`);\r\n } else {\r\n res.set(\"Cache-Control\", `s-maxage=${oneHourInSeconds * 24}, max-age=${oneHourInSeconds * 48}, immutable`);\r\n }\r\n }\r\n\r\n if (fulfillment.retry) {\r\n res.set(\"Retry-After\", fulfillment.retry);\r\n }\r\n }\r\n\r\n private static configureText(fulfillment: RpcRequestFulfillment, res: HttpServerResponse): string {\r\n res.set(WEB_RPC_CONSTANTS.CONTENT, WEB_RPC_CONSTANTS.TEXT);\r\n return (fulfillment.status === 204) ? \"\" : fulfillment.result.objects;\r\n }\r\n\r\n private static configureBinary(fulfillment: RpcRequestFulfillment, res: HttpServerResponse): Buffer {\r\n res.set(WEB_RPC_CONSTANTS.CONTENT, WEB_RPC_CONSTANTS.BINARY);\r\n const data = fulfillment.result.data[0];\r\n return Buffer.isBuffer(data) ? data : Buffer.from(data);\r\n }\r\n\r\n private static configureMultipart(fulfillment: RpcRequestFulfillment, res: HttpServerResponse): ReadableFormData {\r\n const response = RpcMultipart.createStream(fulfillment.result);\r\n const headers = response.getHeaders();\r\n for (const header in headers) {\r\n if (headers.hasOwnProperty(header)) {\r\n res.set(header, headers[header]);\r\n }\r\n }\r\n\r\n return response;\r\n }\r\n\r\n private static configureStream(fulfillment: RpcRequestFulfillment) {\r\n return fulfillment.result.stream!;\r\n }\r\n\r\n private static parseFromPath(operation: SerializedRpcOperation): RpcSerializedValue {\r\n const decoded = operation.encodedRequest ? Buffer.from(operation.encodedRequest, \"base64\").toString(\"binary\") : \"\";\r\n return RpcSerializedValue.create(decoded);\r\n }\r\n\r\n private static async parseFromBody(req: HttpServerRequest): Promise<RpcSerializedValue> {\r\n const contentType = WebAppRpcProtocol.computeContentType(req.header(WEB_RPC_CONSTANTS.CONTENT));\r\n if (contentType === RpcContentType.Binary) {\r\n const objects = JSON.stringify([MarshalingBinaryMarker.createDefault()]);\r\n const data = [req.body as Buffer];\r\n return RpcSerializedValue.create(objects, data);\r\n } else if (contentType === RpcContentType.Multipart) {\r\n return RpcMultipart.parseRequest(req);\r\n } else {\r\n return RpcSerializedValue.create(req.body as string);\r\n }\r\n }\r\n\r\n private async performFetch(): Promise<number> {\r\n const requestClass = this.supplyRequest();\r\n const fetchFunction = this.supplyFetch();\r\n\r\n const path = new URL(this.path, typeof (location) !== \"undefined\" ? location.origin : undefined);\r\n if (this._pathSuffix) {\r\n const params = new URLSearchParams();\r\n params.set(\"parameters\", this._pathSuffix);\r\n path.search = `?${params.toString()}`;\r\n }\r\n\r\n const request = new requestClass(path.toString(), this._request);\r\n const response = await fetchFunction(request);\r\n this._response = response;\r\n this.metadata.status = response.status;\r\n return response.status;\r\n }\r\n\r\n private async loadText(response: Response) {\r\n const value = await response.text();\r\n this.metadata.message = value;\r\n return RpcSerializedValue.create(value);\r\n }\r\n\r\n private async loadBinary(response: Response) {\r\n const value = new Uint8Array(await response.arrayBuffer());\r\n const objects = JSON.stringify(MarshalingBinaryMarker.createDefault());\r\n return RpcSerializedValue.create(objects, [value]);\r\n }\r\n\r\n private async loadMultipart(response: Response, contentType: string) {\r\n const data = await response.arrayBuffer();\r\n const value = new RpcMultipartParser(contentType, Buffer.from(data)).parse();\r\n return value;\r\n }\r\n\r\n private async setupTransport(): Promise<void> {\r\n const parameters = (await this.protocol.serialize(this)).parameters;\r\n const transportType = WebAppRpcRequest.computeTransportType(parameters, this.parameters);\r\n\r\n if (transportType === RpcContentType.Binary) {\r\n this.setupBinaryTransport(parameters);\r\n } else if (transportType === RpcContentType.Multipart) {\r\n this.setupMultipartTransport(parameters);\r\n } else {\r\n this.setupTextTransport(parameters);\r\n }\r\n }\r\n\r\n private setupBinaryTransport(parameters: RpcSerializedValue) {\r\n this._headers[WEB_RPC_CONSTANTS.CONTENT] = WEB_RPC_CONSTANTS.BINARY;\r\n this._request.method = \"post\";\r\n this._request.body = parameters.data[0];\r\n }\r\n\r\n private setupMultipartTransport(parameters: RpcSerializedValue) {\r\n // IMPORTANT: do not set a multipart Content-Type header value. The browser does this automatically!\r\n delete this._headers[WEB_RPC_CONSTANTS.CONTENT];\r\n this._request.method = \"post\";\r\n this._request.body = RpcMultipart.createForm(parameters);\r\n }\r\n\r\n private setupTextTransport(parameters: RpcSerializedValue) {\r\n if (this.operation.policy.allowResponseCaching(this)) {\r\n const encodedBody = btoa(parameters.objects); // eslint-disable-line deprecation/deprecation\r\n if (encodedBody.length <= WebAppRpcRequest.maxUrlComponentSize) {\r\n this._request.method = \"get\";\r\n this._request.body = undefined;\r\n delete this._headers[WEB_RPC_CONSTANTS.CONTENT];\r\n this._pathSuffix = encodedBody;\r\n return;\r\n }\r\n }\r\n\r\n this._pathSuffix = \"\";\r\n this._headers[WEB_RPC_CONSTANTS.CONTENT] = WEB_RPC_CONSTANTS.TEXT;\r\n this._request.method = \"post\";\r\n this._request.body = parameters.objects;\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"WebAppRpcRequest.js","sourceRoot":"","sources":["../../../../src/rpc/web/WebAppRpcRequest.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module RpcInterface\r\n */\r\n\r\nimport { BentleyStatus } from \"@itwin/core-bentley\";\r\nimport { IModelError, ServerError, ServerTimeoutError } from \"../../IModelError\";\r\nimport { RpcInterface } from \"../../RpcInterface\";\r\nimport { RpcContentType, RpcProtocolEvent, WEB_RPC_CONSTANTS } from \"../core/RpcConstants\";\r\nimport { MarshalingBinaryMarker, RpcSerializedValue } from \"../core/RpcMarshaling\";\r\nimport { RpcRequestFulfillment, SerializedRpcRequest } from \"../core/RpcProtocol\";\r\nimport { RpcRequest } from \"../core/RpcRequest\";\r\nimport { RpcMultipartParser } from \"./multipart/RpcMultipartParser\";\r\nimport { RpcMultipart } from \"./RpcMultipart\";\r\nimport { HttpServerRequest, HttpServerResponse, WebAppRpcProtocol } from \"./WebAppRpcProtocol\";\r\n\r\n/** @internal */\r\nexport type HttpMethod_T = \"get\" | \"put\" | \"post\" | \"delete\" | \"options\" | \"head\" | \"patch\" | \"trace\"; // eslint-disable-line @typescript-eslint/naming-convention\r\n\r\n/** A web application RPC request.\r\n * @internal\r\n */\r\nexport class WebAppRpcRequest extends RpcRequest {\r\n private _loading: boolean = false;\r\n private _request: RequestInit = {};\r\n private _pathSuffix: string = \"\";\r\n private get _headers() { return this._request.headers as { [key: string]: string }; }\r\n\r\n /** The maximum size permitted for an encoded component in a URL.\r\n * Note that some backends limit the total cumulative request size. Our current node backends accept requests with a max size of 16 kb.\r\n * In addition to the url size, an authorization header may also add considerably to the request size.\r\n * @note This is used for features like encoding the payload of a cacheable request in the URL.\r\n */\r\n public static maxUrlComponentSize = 1024 * 8;\r\n\r\n /** The HTTP method for this request. */\r\n public override method: HttpMethod_T;\r\n\r\n /** Convenience access to the protocol of this request. */\r\n public override readonly protocol: WebAppRpcProtocol = this.client.configuration.protocol as any;\r\n\r\n /** Standardized access to metadata about the request (useful for purposes such as logging). */\r\n public metadata = { status: 0, message: \"\" };\r\n\r\n /** Parses a request. */\r\n public static async parseRequest(protocol: WebAppRpcProtocol, req: HttpServerRequest): Promise<SerializedRpcRequest> {\r\n return this.backend.parseRequest(protocol, req);\r\n }\r\n\r\n /** Sends the response for a web request. */\r\n public static async sendResponse(\r\n protocol: WebAppRpcProtocol,\r\n request: SerializedRpcRequest,\r\n fulfillment: RpcRequestFulfillment,\r\n req: HttpServerRequest,\r\n res: HttpServerResponse,\r\n ): Promise<void> {\r\n return this.backend.sendResponse(protocol, request, fulfillment, req, res);\r\n }\r\n\r\n /** Determines the most efficient transport type for an RPC value. */\r\n public static computeTransportType(value: RpcSerializedValue, source: any): RpcContentType {\r\n if (source instanceof Uint8Array || (Array.isArray(source) && source[0] instanceof Uint8Array)) {\r\n return RpcContentType.Binary;\r\n } else if (value.data.length > 0) {\r\n return RpcContentType.Multipart;\r\n } else if (value.stream) {\r\n return RpcContentType.Stream;\r\n } else {\r\n return RpcContentType.Text;\r\n }\r\n }\r\n\r\n /** Constructs a web application request. */\r\n public constructor(client: RpcInterface, operation: string, parameters: any[]) {\r\n super(client, operation, parameters);\r\n this.path = this.protocol.supplyPathForOperation(this.operation, this);\r\n this.method = \"head\";\r\n this._request.headers = {};\r\n }\r\n\r\n /** Sets request header values. */\r\n protected setHeader(name: string, value: string): void {\r\n this._headers[name] = value;\r\n }\r\n\r\n /** Sends the request. */\r\n protected async send(): Promise<number> {\r\n this._loading = true;\r\n await this.setupTransport();\r\n\r\n return new Promise<number>(async (resolve, reject) => {\r\n try {\r\n resolve(await this.performFetch());\r\n } catch (reason) {\r\n reject(new ServerError(-1, typeof (reason) === \"string\" ? reason : \"Server connection error.\"));\r\n }\r\n });\r\n }\r\n\r\n protected override computeRetryAfter(attempts: number): number {\r\n const retryAfter = this._response && this._response.headers.get(\"Retry-After\");\r\n if (retryAfter) {\r\n this.resetTransientFaultCount();\r\n\r\n const r = Number(retryAfter);\r\n if (Number.isFinite(r)) {\r\n return r * 1000;\r\n }\r\n\r\n const d = Date.parse(retryAfter);\r\n if (!Number.isNaN(d)) {\r\n return d - Date.now();\r\n }\r\n } else {\r\n this.recordTransientFault();\r\n }\r\n\r\n return super.computeRetryAfter(attempts);\r\n }\r\n\r\n protected override handleUnknownResponse(code: number) {\r\n if (this.protocol.isTimeout(code)) {\r\n this.reject(new ServerTimeoutError(\"Request timeout.\"));\r\n } else {\r\n this.reject(new ServerError(code, \"Unknown server response code.\"));\r\n }\r\n }\r\n\r\n protected async load(): Promise<RpcSerializedValue> {\r\n return new Promise<RpcSerializedValue>(async (resolve, reject) => {\r\n try {\r\n if (!this._loading)\r\n return;\r\n\r\n const response = this._response;\r\n if (!response) {\r\n reject(new IModelError(BentleyStatus.ERROR, \"Invalid state.\"));\r\n return;\r\n }\r\n\r\n if (this.protocol.protocolVersionHeaderName) {\r\n const version = response.headers.get(this.protocol.protocolVersionHeaderName);\r\n if (version) {\r\n this.responseProtocolVersion = parseInt(version, 10);\r\n }\r\n }\r\n\r\n const contentType = response.headers.get(WEB_RPC_CONSTANTS.CONTENT);\r\n const responseType = WebAppRpcProtocol.computeContentType(contentType);\r\n\r\n if (responseType === RpcContentType.Binary) {\r\n resolve(await this.loadBinary(response));\r\n } else if (responseType === RpcContentType.Multipart) {\r\n resolve(await this.loadMultipart(response, contentType!));\r\n } else {\r\n resolve(await this.loadText(response));\r\n }\r\n\r\n this._loading = false;\r\n this.setLastUpdatedTime();\r\n this.protocol.events.raiseEvent(RpcProtocolEvent.ResponseLoaded, this);\r\n } catch (reason) {\r\n if (!this._loading)\r\n return;\r\n\r\n this._loading = false;\r\n reject(new ServerError(this.metadata.status, typeof (reason) === \"string\" ? reason : \"Unknown server response error.\"));\r\n }\r\n });\r\n }\r\n\r\n /** Override to supply an alternate fetch function. */\r\n protected supplyFetch(): typeof fetch {\r\n return fetch;\r\n }\r\n\r\n /** Override to supply an alternate Request function. */\r\n protected supplyRequest(): typeof Request {\r\n return Request;\r\n }\r\n\r\n private async performFetch(): Promise<number> {\r\n const requestClass = this.supplyRequest();\r\n const fetchFunction = this.supplyFetch();\r\n\r\n const path = new URL(this.path, typeof (location) !== \"undefined\" ? location.origin : undefined);\r\n if (this._pathSuffix) {\r\n const params = new URLSearchParams();\r\n params.set(\"parameters\", this._pathSuffix);\r\n path.search = `?${params.toString()}`;\r\n }\r\n\r\n const request = new requestClass(path.toString(), this._request);\r\n const response = await fetchFunction(request);\r\n this._response = response;\r\n this.metadata.status = response.status;\r\n return response.status;\r\n }\r\n\r\n private async loadText(response: Response) {\r\n const value = await response.text();\r\n this.metadata.message = value;\r\n return RpcSerializedValue.create(value);\r\n }\r\n\r\n private async loadBinary(response: Response) {\r\n const value = new Uint8Array(await response.arrayBuffer());\r\n const objects = JSON.stringify(MarshalingBinaryMarker.createDefault());\r\n return RpcSerializedValue.create(objects, [value]);\r\n }\r\n\r\n private async loadMultipart(response: Response, contentType: string) {\r\n const data = await response.arrayBuffer();\r\n const value = new RpcMultipartParser(contentType, new Uint8Array(data)).parse();\r\n return value;\r\n }\r\n\r\n private async setupTransport(): Promise<void> {\r\n const parameters = (await this.protocol.serialize(this)).parameters;\r\n const transportType = WebAppRpcRequest.computeTransportType(parameters, this.parameters);\r\n\r\n if (transportType === RpcContentType.Binary) {\r\n this.setupBinaryTransport(parameters);\r\n } else if (transportType === RpcContentType.Multipart) {\r\n this.setupMultipartTransport(parameters);\r\n } else {\r\n this.setupTextTransport(parameters);\r\n }\r\n }\r\n\r\n private setupBinaryTransport(parameters: RpcSerializedValue) {\r\n this._headers[WEB_RPC_CONSTANTS.CONTENT] = WEB_RPC_CONSTANTS.BINARY;\r\n this._request.method = \"post\";\r\n this._request.body = parameters.data[0];\r\n }\r\n\r\n private setupMultipartTransport(parameters: RpcSerializedValue) {\r\n // IMPORTANT: do not set a multipart Content-Type header value. The browser does this automatically!\r\n delete this._headers[WEB_RPC_CONSTANTS.CONTENT];\r\n this._request.method = \"post\";\r\n this._request.body = RpcMultipart.createForm(parameters);\r\n }\r\n\r\n private setupTextTransport(parameters: RpcSerializedValue) {\r\n if (this.operation.policy.allowResponseCaching(this)) {\r\n const encodedBody = btoa(parameters.objects); // eslint-disable-line deprecation/deprecation\r\n if (encodedBody.length <= WebAppRpcRequest.maxUrlComponentSize) {\r\n this._request.method = \"get\";\r\n this._request.body = undefined;\r\n delete this._headers[WEB_RPC_CONSTANTS.CONTENT];\r\n this._pathSuffix = encodedBody;\r\n return;\r\n }\r\n }\r\n\r\n this._pathSuffix = \"\";\r\n this._headers[WEB_RPC_CONSTANTS.CONTENT] = WEB_RPC_CONSTANTS.TEXT;\r\n this._request.method = \"post\";\r\n this._request.body = parameters.objects;\r\n }\r\n\r\n /** @internal */\r\n public static backend = {\r\n sendResponse: async (_protocol: WebAppRpcProtocol, _request: SerializedRpcRequest, _fulfillment: RpcRequestFulfillment, _req: HttpServerRequest, _res: HttpServerResponse): Promise<void> => {\r\n throw new IModelError(BentleyStatus.ERROR, \"Not bound.\");\r\n },\r\n parseRequest: async (_protocol: WebAppRpcProtocol, _req: HttpServerRequest): Promise<SerializedRpcRequest> => {\r\n throw new IModelError(BentleyStatus.ERROR, \"Not bound.\");\r\n },\r\n };\r\n}\r\n"]}
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
/** @packageDocumentation
|
|
2
2
|
* @module RpcInterface
|
|
3
3
|
*/
|
|
4
|
-
/// <reference types="node" />
|
|
5
|
-
import { Buffer } from "buffer";
|
|
6
4
|
import { RpcSerializedValue } from "../../core/RpcMarshaling";
|
|
7
5
|
/** @internal */
|
|
8
6
|
export declare class RpcMultipartParser {
|
|
@@ -20,7 +18,7 @@ export declare class RpcMultipartParser {
|
|
|
20
18
|
private _boundary;
|
|
21
19
|
private _buffer;
|
|
22
20
|
private _value;
|
|
23
|
-
constructor(contentType: string, buffer:
|
|
21
|
+
constructor(contentType: string, buffer: Uint8Array);
|
|
24
22
|
parse(): RpcSerializedValue;
|
|
25
23
|
private _onParsePartBegin;
|
|
26
24
|
private _clearPartVars;
|
|
@@ -28,6 +26,7 @@ export declare class RpcMultipartParser {
|
|
|
28
26
|
private _onParseHeaderValue;
|
|
29
27
|
private _onParseHeaderEnd;
|
|
30
28
|
private _onParsePartData;
|
|
29
|
+
private _concatParts;
|
|
31
30
|
private _onParsePartEnd;
|
|
32
31
|
private _onParseHeadersEnd;
|
|
33
32
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RpcMultipartParser.d.ts","sourceRoot":"","sources":["../../../../../src/rpc/web/multipart/RpcMultipartParser.ts"],"names":[],"mappings":"AAIA;;GAEG
|
|
1
|
+
{"version":3,"file":"RpcMultipartParser.d.ts","sourceRoot":"","sources":["../../../../../src/rpc/web/multipart/RpcMultipartParser.ts"],"names":[],"mappings":"AAIA;;GAEG;AA6BH,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AA0B9D,gBAAgB;AAChB,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,gBAAgB,CAAgB;IACxC,OAAO,CAAC,gBAAgB,CAAgB;IACxC,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,iBAAiB,CAAU;IACnC,OAAO,CAAC,mBAAmB,CAAqB;IAChD,OAAO,CAAC,mBAAmB,CAAqB;IAChD,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,YAAY,CAA8B;IAClD,OAAO,CAAC,SAAS,CAAgB;IACjC,OAAO,CAAC,WAAW,CAAe;IAClC,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,OAAO,CAAa;IAC5B,OAAO,CAAC,MAAM,CAAqB;gBAEhB,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU;IAsCnD,KAAK,IAAI,kBAAkB;IAqOlC,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,cAAc;IAWtB,OAAO,CAAC,mBAAmB;IAI3B,OAAO,CAAC,mBAAmB;IAI3B,OAAO,CAAC,iBAAiB;IAoBzB,OAAO,CAAC,gBAAgB;IAIxB,OAAO,CAAC,YAAY;IAiBpB,OAAO,CAAC,eAAe;IAavB,OAAO,CAAC,kBAAkB;CAE3B"}
|
|
@@ -35,8 +35,6 @@ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
|
|
35
35
|
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
|
36
36
|
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
37
37
|
*/
|
|
38
|
-
const buffer_1 = require("buffer");
|
|
39
|
-
const string_decoder_1 = require("string_decoder");
|
|
40
38
|
const RpcMarshaling_1 = require("../../core/RpcMarshaling");
|
|
41
39
|
const START = 0;
|
|
42
40
|
const START_BOUNDARY = 1;
|
|
@@ -98,9 +96,10 @@ class RpcMultipartParser {
|
|
|
98
96
|
let prevIndex = 0;
|
|
99
97
|
let index = 0;
|
|
100
98
|
let state = START;
|
|
101
|
-
const boundary =
|
|
102
|
-
|
|
103
|
-
|
|
99
|
+
const boundary = new Uint8Array(this._boundary.length + 4);
|
|
100
|
+
const boundaryEncoder = new TextEncoder(); // encodes utf8 only
|
|
101
|
+
boundaryEncoder.encodeInto("\r\n--", boundary.subarray(0));
|
|
102
|
+
boundaryEncoder.encodeInto(this._boundary, boundary.subarray(4));
|
|
104
103
|
const boundaryChars = {};
|
|
105
104
|
for (const char of boundary) {
|
|
106
105
|
boundaryChars[char] = true;
|
|
@@ -108,7 +107,7 @@ class RpcMultipartParser {
|
|
|
108
107
|
const boundaryLength = boundary.length;
|
|
109
108
|
const boundaryEnd = boundaryLength - 1;
|
|
110
109
|
const bufferLength = this._buffer.length;
|
|
111
|
-
const lookbehind =
|
|
110
|
+
const lookbehind = new Uint8Array(boundaryLength + 8);
|
|
112
111
|
let c;
|
|
113
112
|
let cl;
|
|
114
113
|
for (i = 0; i < len; i++) {
|
|
@@ -162,7 +161,7 @@ class RpcMultipartParser {
|
|
|
162
161
|
// empty header field
|
|
163
162
|
throw new Error("Empty header field");
|
|
164
163
|
}
|
|
165
|
-
this._onParseHeaderField(this._buffer.
|
|
164
|
+
this._onParseHeaderField(this._buffer.subarray(this._headerFieldMark, i));
|
|
166
165
|
this._headerFieldMark = null;
|
|
167
166
|
state = HEADER_VALUE_START;
|
|
168
167
|
break;
|
|
@@ -180,7 +179,7 @@ class RpcMultipartParser {
|
|
|
180
179
|
/* falls through */
|
|
181
180
|
case HEADER_VALUE:
|
|
182
181
|
if (c === CR) {
|
|
183
|
-
this._onParseHeaderValue(this._buffer.
|
|
182
|
+
this._onParseHeaderValue(this._buffer.subarray(this._headerValueMark, i));
|
|
184
183
|
this._headerValueMark = null;
|
|
185
184
|
this._onParseHeaderEnd();
|
|
186
185
|
state = HEADER_VALUE_ALMOST_DONE;
|
|
@@ -217,7 +216,7 @@ class RpcMultipartParser {
|
|
|
217
216
|
if (index < boundaryLength) {
|
|
218
217
|
if (boundary[index] === c) {
|
|
219
218
|
if (index === 0) {
|
|
220
|
-
this._onParsePartData(this._buffer.
|
|
219
|
+
this._onParsePartData(this._buffer.subarray(this._partDataMark, i));
|
|
221
220
|
this._partDataMark = null;
|
|
222
221
|
}
|
|
223
222
|
index++;
|
|
@@ -264,7 +263,7 @@ class RpcMultipartParser {
|
|
|
264
263
|
else if (prevIndex > 0) {
|
|
265
264
|
// if our boundary turned out to be rubbish, the captured lookbehind
|
|
266
265
|
// belongs to partData
|
|
267
|
-
this._onParsePartData(lookbehind.
|
|
266
|
+
this._onParsePartData(lookbehind.subarray(0, prevIndex));
|
|
268
267
|
prevIndex = 0;
|
|
269
268
|
this._partDataMark = i;
|
|
270
269
|
// reconsider the current character even so it interrupted the sequence
|
|
@@ -291,15 +290,15 @@ class RpcMultipartParser {
|
|
|
291
290
|
}
|
|
292
291
|
}
|
|
293
292
|
if (this._headerFieldMark != null) {
|
|
294
|
-
this._onParseHeaderField(this._buffer.
|
|
293
|
+
this._onParseHeaderField(this._buffer.subarray(this._headerFieldMark));
|
|
295
294
|
this._headerFieldMark = 0;
|
|
296
295
|
}
|
|
297
296
|
if (this._headerValueMark != null) {
|
|
298
|
-
this._onParseHeaderValue(this._buffer.
|
|
297
|
+
this._onParseHeaderValue(this._buffer.subarray(this._headerValueMark));
|
|
299
298
|
this._headerValueMark = 0;
|
|
300
299
|
}
|
|
301
300
|
if (this._partDataMark != null) {
|
|
302
|
-
this._onParsePartData(this._buffer.
|
|
301
|
+
this._onParsePartData(this._buffer.subarray(this._partDataMark));
|
|
303
302
|
this._partDataMark = 0;
|
|
304
303
|
}
|
|
305
304
|
return this._value;
|
|
@@ -311,16 +310,16 @@ class RpcMultipartParser {
|
|
|
311
310
|
this._partHeaders = {};
|
|
312
311
|
this._partName = null;
|
|
313
312
|
this._partChunks.length = 0;
|
|
314
|
-
this._headerFieldDecoder = new
|
|
313
|
+
this._headerFieldDecoder = new TextDecoder("utf8");
|
|
315
314
|
this._headerField = "";
|
|
316
|
-
this._headerValueDecoder = new
|
|
315
|
+
this._headerValueDecoder = new TextDecoder("utf8");
|
|
317
316
|
this._headerValue = "";
|
|
318
317
|
}
|
|
319
318
|
_onParseHeaderField(b) {
|
|
320
|
-
this._headerField += this._headerFieldDecoder.
|
|
319
|
+
this._headerField += this._headerFieldDecoder.decode(b);
|
|
321
320
|
}
|
|
322
321
|
_onParseHeaderValue(b) {
|
|
323
|
-
this._headerValue += this._headerValueDecoder.
|
|
322
|
+
this._headerValue += this._headerValueDecoder.decode(b);
|
|
324
323
|
}
|
|
325
324
|
_onParseHeaderEnd() {
|
|
326
325
|
this._headerField = this._headerField.toLowerCase();
|
|
@@ -335,18 +334,32 @@ class RpcMultipartParser {
|
|
|
335
334
|
else if (this._headerField === "content-transfer-encoding") {
|
|
336
335
|
// this._partTransferEncoding = this._headerValue.toLowerCase();
|
|
337
336
|
}
|
|
338
|
-
this._headerFieldDecoder = new
|
|
337
|
+
this._headerFieldDecoder = new TextDecoder("utf8");
|
|
339
338
|
this._headerField = "";
|
|
340
|
-
this._headerValueDecoder = new
|
|
339
|
+
this._headerValueDecoder = new TextDecoder("utf8");
|
|
341
340
|
this._headerValue = "";
|
|
342
341
|
}
|
|
343
342
|
_onParsePartData(b) {
|
|
344
343
|
this._partChunks.push(b);
|
|
345
344
|
}
|
|
345
|
+
_concatParts() {
|
|
346
|
+
let totalSize = 0;
|
|
347
|
+
for (const chunk of this._partChunks) {
|
|
348
|
+
totalSize += chunk.length;
|
|
349
|
+
}
|
|
350
|
+
const combined = new Uint8Array(totalSize);
|
|
351
|
+
let offset = 0;
|
|
352
|
+
for (const chunk of this._partChunks) {
|
|
353
|
+
combined.set(chunk, offset);
|
|
354
|
+
offset += chunk.length;
|
|
355
|
+
}
|
|
356
|
+
return combined;
|
|
357
|
+
}
|
|
346
358
|
_onParsePartEnd() {
|
|
347
|
-
const partValue = this._partChunks.length === 1 ? this._partChunks[0] :
|
|
359
|
+
const partValue = this._partChunks.length === 1 ? this._partChunks[0] : this._concatParts();
|
|
348
360
|
if (this._partName === "objects") {
|
|
349
|
-
|
|
361
|
+
const partDecoder = new TextDecoder();
|
|
362
|
+
this._value.objects = partDecoder.decode(partValue);
|
|
350
363
|
}
|
|
351
364
|
else {
|
|
352
365
|
this._value.data.push(partValue);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RpcMultipartParser.js","sourceRoot":"","sources":["../../../../../src/rpc/web/multipart/RpcMultipartParser.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module RpcInterface\r\n */\r\n\r\n/*\r\nAdapted from https://github.com/pillarjs/multiparty. Multiparty license as follows:\r\n(The MIT License)\r\n\r\nCopyright (c) 2013 Felix Geisendörfer\r\nCopyright (c) 2014 Andrew Kelley\r\nCopyright (c) 2014 Douglas Christopher Wilson\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining\r\na copy of this software and associated documentation files (the\r\n'Software'), to deal in the Software without restriction, including\r\nwithout limitation the rights to use, copy, modify, merge, publish,\r\ndistribute, sublicense, and/or sell copies of the Software, and to\r\npermit persons to whom the Software is furnished to do so, subject to\r\nthe following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be\r\nincluded in all copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\r\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\r\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\r\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\r\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\r\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n*/\r\nimport { Buffer } from \"buffer\";\r\nimport { StringDecoder } from \"string_decoder\";\r\nimport { RpcSerializedValue } from \"../../core/RpcMarshaling\";\r\n\r\nconst START = 0;\r\nconst START_BOUNDARY = 1;\r\nconst HEADER_FIELD_START = 2;\r\nconst HEADER_FIELD = 3;\r\nconst HEADER_VALUE_START = 4;\r\nconst HEADER_VALUE = 5;\r\nconst HEADER_VALUE_ALMOST_DONE = 6;\r\nconst HEADERS_ALMOST_DONE = 7;\r\nconst PART_DATA_START = 8;\r\nconst PART_DATA = 9;\r\nconst CLOSE_BOUNDARY = 10;\r\nconst END = 11;\r\n\r\nconst LF = 10;\r\nconst CR = 13;\r\nconst SPACE = 32;\r\nconst HYPHEN = 45;\r\nconst COLON = 58;\r\nconst A = 97;\r\nconst Z = 122;\r\n\r\nconst CONTENT_TYPE_RE = /^multipart\\/(?:form-data|related)(?:;|$)/i;\r\nconst CONTENT_TYPE_PARAM_RE = /;\\s*([^=]+)=(?:\"([^\"]+)\"|([^;]+))/gi;\r\n\r\n/** @internal */\r\nexport class RpcMultipartParser {\r\n private _headerFieldMark: number | null;\r\n private _headerValueMark: number | null;\r\n private _partDataMark: number | null;\r\n private _partBoundaryFlag: boolean;\r\n private _headerFieldDecoder: StringDecoder | null;\r\n private _headerValueDecoder: StringDecoder | null;\r\n private _headerField: string;\r\n private _partHeaders: { [index: string]: string };\r\n private _partName: string | null;\r\n private _partChunks: Buffer[];\r\n private _headerValue: string;\r\n private _boundary: string;\r\n private _buffer: Buffer;\r\n private _value: RpcSerializedValue;\r\n\r\n public constructor(contentType: string, buffer: Buffer) {\r\n let m = CONTENT_TYPE_RE.exec(contentType);\r\n if (!m) {\r\n throw new Error(\"unsupported content-type\");\r\n }\r\n\r\n let boundary = \"\";\r\n CONTENT_TYPE_PARAM_RE.lastIndex = m.index + m[0].length - 1;\r\n while ((m = CONTENT_TYPE_PARAM_RE.exec(contentType))) {\r\n if (m[1].toLowerCase() !== \"boundary\")\r\n continue;\r\n\r\n boundary = m[2] || m[3];\r\n break;\r\n }\r\n\r\n if (!boundary) {\r\n throw new Error(\"content-type missing boundary\");\r\n }\r\n\r\n this._headerFieldDecoder = null;\r\n this._headerValueDecoder = null;\r\n this._headerField = \"\";\r\n this._partHeaders = {};\r\n this._partName = null;\r\n this._partChunks = [];\r\n this._headerValue = \"\";\r\n\r\n this._headerFieldMark = null;\r\n this._headerValueMark = null;\r\n this._partDataMark = null;\r\n this._partBoundaryFlag = false;\r\n\r\n this._boundary = boundary;\r\n this._buffer = buffer;\r\n this._value = RpcSerializedValue.create();\r\n }\r\n\r\n public parse(): RpcSerializedValue {\r\n let i = 0;\r\n const len = this._buffer.length;\r\n let prevIndex = 0;\r\n let index = 0;\r\n let state = START;\r\n\r\n const boundary = Buffer.alloc(this._boundary.length + 4);\r\n boundary.write(\"\\r\\n--\", 0, this._boundary.length + 4, \"ascii\");\r\n boundary.write(this._boundary, 4, this._boundary.length, \"ascii\");\r\n\r\n const boundaryChars: { [index: number]: boolean } = {};\r\n for (const char of boundary) {\r\n boundaryChars[char] = true;\r\n }\r\n\r\n const boundaryLength = boundary.length;\r\n const boundaryEnd = boundaryLength - 1;\r\n const bufferLength = this._buffer.length;\r\n const lookbehind = Buffer.alloc(boundaryLength + 8);\r\n\r\n let c;\r\n let cl;\r\n\r\n for (i = 0; i < len; i++) {\r\n c = this._buffer[i];\r\n switch (state) {\r\n case START:\r\n index = 0;\r\n state = START_BOUNDARY;\r\n /* falls through */\r\n case START_BOUNDARY:\r\n if (index === boundaryLength - 2 && c === HYPHEN) {\r\n index = 1;\r\n state = CLOSE_BOUNDARY;\r\n break;\r\n } else if (index === boundaryLength - 2) {\r\n if (c !== CR)\r\n throw new Error(`Expected CR Received ${c}`);\r\n\r\n index++;\r\n break;\r\n } else if (index === boundaryLength - 1) {\r\n if (c !== LF)\r\n throw new Error(`Expected LF Received ${c}`);\r\n\r\n index = 0;\r\n this._onParsePartBegin();\r\n state = HEADER_FIELD_START;\r\n break;\r\n }\r\n\r\n if (c !== boundary[index + 2])\r\n index = -2;\r\n\r\n if (c === boundary[index + 2])\r\n index++;\r\n\r\n break;\r\n case HEADER_FIELD_START:\r\n state = HEADER_FIELD;\r\n this._headerFieldMark = i;\r\n index = 0;\r\n /* falls through */\r\n case HEADER_FIELD:\r\n if (c === CR) {\r\n this._headerFieldMark = null;\r\n state = HEADERS_ALMOST_DONE;\r\n break;\r\n }\r\n\r\n index++;\r\n if (c === HYPHEN)\r\n break;\r\n\r\n if (c === COLON) {\r\n if (index === 1) {\r\n // empty header field\r\n throw new Error(\"Empty header field\");\r\n }\r\n this._onParseHeaderField(this._buffer.slice(this._headerFieldMark as number, i));\r\n this._headerFieldMark = null;\r\n state = HEADER_VALUE_START;\r\n break;\r\n }\r\n\r\n cl = c | 0x20;\r\n if (cl < A || cl > Z) {\r\n throw new Error(`Expected alphabetic character, received ${c}`);\r\n }\r\n break;\r\n case HEADER_VALUE_START:\r\n if (c === SPACE)\r\n break;\r\n\r\n this._headerValueMark = i;\r\n state = HEADER_VALUE;\r\n /* falls through */\r\n case HEADER_VALUE:\r\n if (c === CR) {\r\n this._onParseHeaderValue(this._buffer.slice(this._headerValueMark as number, i));\r\n this._headerValueMark = null;\r\n this._onParseHeaderEnd();\r\n state = HEADER_VALUE_ALMOST_DONE;\r\n }\r\n break;\r\n case HEADER_VALUE_ALMOST_DONE:\r\n if (c !== LF)\r\n throw new Error(`Expected LF Received ${c}`);\r\n\r\n state = HEADER_FIELD_START;\r\n break;\r\n case HEADERS_ALMOST_DONE:\r\n if (c !== LF)\r\n throw new Error(`Expected LF Received ${c}`);\r\n\r\n const err: any = this._onParseHeadersEnd(i + 1);\r\n if (err)\r\n throw err;\r\n\r\n state = PART_DATA_START;\r\n break;\r\n case PART_DATA_START:\r\n state = PART_DATA;\r\n this._partDataMark = i;\r\n /* falls through */\r\n case PART_DATA:\r\n prevIndex = index;\r\n\r\n if (index === 0) {\r\n // boyer-moore derived algorithm to safely skip non-boundary data\r\n i += boundaryEnd;\r\n while (i < bufferLength && !(this._buffer[i] in boundaryChars)) {\r\n i += boundaryLength;\r\n }\r\n i -= boundaryEnd;\r\n c = this._buffer[i];\r\n }\r\n\r\n if (index < boundaryLength) {\r\n if (boundary[index] === c) {\r\n if (index === 0) {\r\n this._onParsePartData(this._buffer.slice(this._partDataMark as number, i));\r\n this._partDataMark = null;\r\n }\r\n index++;\r\n } else {\r\n index = 0;\r\n }\r\n } else if (index === boundaryLength) {\r\n index++;\r\n if (c === CR) {\r\n // CR = part boundary\r\n this._partBoundaryFlag = true;\r\n } else if (c === HYPHEN) {\r\n index = 1;\r\n state = CLOSE_BOUNDARY;\r\n break;\r\n } else {\r\n index = 0;\r\n }\r\n } else if (index - 1 === boundaryLength) {\r\n if (this._partBoundaryFlag) {\r\n index = 0;\r\n if (c === LF) {\r\n this._partBoundaryFlag = false;\r\n this._onParsePartEnd();\r\n this._onParsePartBegin();\r\n state = HEADER_FIELD_START;\r\n break;\r\n }\r\n } else {\r\n index = 0;\r\n }\r\n }\r\n\r\n if (index > 0) {\r\n // when matching a possible boundary, keep a lookbehind reference\r\n // in case it turns out to be a false lead\r\n lookbehind[index - 1] = c;\r\n } else if (prevIndex > 0) {\r\n // if our boundary turned out to be rubbish, the captured lookbehind\r\n // belongs to partData\r\n this._onParsePartData(lookbehind.slice(0, prevIndex));\r\n prevIndex = 0;\r\n this._partDataMark = i;\r\n\r\n // reconsider the current character even so it interrupted the sequence\r\n // it could be the beginning of a new sequence\r\n i--;\r\n }\r\n\r\n break;\r\n case CLOSE_BOUNDARY:\r\n if (c !== HYPHEN)\r\n throw new Error(`Expected HYPHEN Received ${c}`);\r\n\r\n if (index === 1) {\r\n this._onParsePartEnd();\r\n state = END;\r\n } else if (index > 1) {\r\n throw new Error(\"Parser has invalid state.\");\r\n }\r\n index++;\r\n break;\r\n case END:\r\n break;\r\n default:\r\n throw new Error(\"Parser has invalid state.\");\r\n }\r\n }\r\n\r\n if (this._headerFieldMark != null) {\r\n this._onParseHeaderField(this._buffer.slice(this._headerFieldMark));\r\n this._headerFieldMark = 0;\r\n }\r\n if (this._headerValueMark != null) {\r\n this._onParseHeaderValue(this._buffer.slice(this._headerValueMark));\r\n this._headerValueMark = 0;\r\n }\r\n if (this._partDataMark != null) {\r\n this._onParsePartData(this._buffer.slice(this._partDataMark));\r\n this._partDataMark = 0;\r\n }\r\n\r\n return this._value;\r\n }\r\n\r\n private _onParsePartBegin() {\r\n this._clearPartVars();\r\n }\r\n\r\n private _clearPartVars() {\r\n this._partHeaders = {};\r\n this._partName = null;\r\n this._partChunks.length = 0;\r\n\r\n this._headerFieldDecoder = new StringDecoder(\"utf8\");\r\n this._headerField = \"\";\r\n this._headerValueDecoder = new StringDecoder(\"utf8\");\r\n this._headerValue = \"\";\r\n }\r\n\r\n private _onParseHeaderField(b: Buffer) {\r\n this._headerField += this._headerFieldDecoder!.write(b);\r\n }\r\n\r\n private _onParseHeaderValue(b: Buffer) {\r\n this._headerValue += this._headerValueDecoder!.write(b);\r\n }\r\n\r\n private _onParseHeaderEnd() {\r\n this._headerField = this._headerField.toLowerCase();\r\n this._partHeaders[this._headerField] = this._headerValue;\r\n\r\n let m: RegExpMatchArray | null;\r\n if (this._headerField === \"content-disposition\") {\r\n if (m = this._headerValue.match(/\\bname=\"([^\"]+)\"/i)) {\r\n this._partName = m[1];\r\n }\r\n // this._partFilename = parseFilename(this._headerValue);\r\n } else if (this._headerField === \"content-transfer-encoding\") {\r\n // this._partTransferEncoding = this._headerValue.toLowerCase();\r\n }\r\n\r\n this._headerFieldDecoder = new StringDecoder(\"utf8\");\r\n this._headerField = \"\";\r\n this._headerValueDecoder = new StringDecoder(\"utf8\");\r\n this._headerValue = \"\";\r\n }\r\n\r\n private _onParsePartData(b: Buffer) {\r\n this._partChunks.push(b);\r\n }\r\n\r\n private _onParsePartEnd() {\r\n const partValue = this._partChunks.length === 1 ? this._partChunks[0] : Buffer.concat(this._partChunks);\r\n\r\n if (this._partName === \"objects\") {\r\n this._value.objects = partValue.toString();\r\n } else {\r\n this._value.data.push(partValue);\r\n }\r\n\r\n this._clearPartVars();\r\n }\r\n\r\n private _onParseHeadersEnd(_offset: number) {\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"RpcMultipartParser.js","sourceRoot":"","sources":["../../../../../src/rpc/web/multipart/RpcMultipartParser.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module RpcInterface\r\n */\r\n\r\n/*\r\nAdapted from https://github.com/pillarjs/multiparty. Multiparty license as follows:\r\n(The MIT License)\r\n\r\nCopyright (c) 2013 Felix Geisendörfer\r\nCopyright (c) 2014 Andrew Kelley\r\nCopyright (c) 2014 Douglas Christopher Wilson\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining\r\na copy of this software and associated documentation files (the\r\n'Software'), to deal in the Software without restriction, including\r\nwithout limitation the rights to use, copy, modify, merge, publish,\r\ndistribute, sublicense, and/or sell copies of the Software, and to\r\npermit persons to whom the Software is furnished to do so, subject to\r\nthe following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be\r\nincluded in all copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\r\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\r\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\r\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\r\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\r\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n*/\r\nimport { RpcSerializedValue } from \"../../core/RpcMarshaling\";\r\n\r\nconst START = 0;\r\nconst START_BOUNDARY = 1;\r\nconst HEADER_FIELD_START = 2;\r\nconst HEADER_FIELD = 3;\r\nconst HEADER_VALUE_START = 4;\r\nconst HEADER_VALUE = 5;\r\nconst HEADER_VALUE_ALMOST_DONE = 6;\r\nconst HEADERS_ALMOST_DONE = 7;\r\nconst PART_DATA_START = 8;\r\nconst PART_DATA = 9;\r\nconst CLOSE_BOUNDARY = 10;\r\nconst END = 11;\r\n\r\nconst LF = 10;\r\nconst CR = 13;\r\nconst SPACE = 32;\r\nconst HYPHEN = 45;\r\nconst COLON = 58;\r\nconst A = 97;\r\nconst Z = 122;\r\n\r\nconst CONTENT_TYPE_RE = /^multipart\\/(?:form-data|related)(?:;|$)/i;\r\nconst CONTENT_TYPE_PARAM_RE = /;\\s*([^=]+)=(?:\"([^\"]+)\"|([^;]+))/gi;\r\n\r\n/** @internal */\r\nexport class RpcMultipartParser {\r\n private _headerFieldMark: number | null;\r\n private _headerValueMark: number | null;\r\n private _partDataMark: number | null;\r\n private _partBoundaryFlag: boolean;\r\n private _headerFieldDecoder: TextDecoder | null;\r\n private _headerValueDecoder: TextDecoder | null;\r\n private _headerField: string;\r\n private _partHeaders: { [index: string]: string };\r\n private _partName: string | null;\r\n private _partChunks: Uint8Array[];\r\n private _headerValue: string;\r\n private _boundary: string;\r\n private _buffer: Uint8Array;\r\n private _value: RpcSerializedValue;\r\n\r\n public constructor(contentType: string, buffer: Uint8Array) {\r\n let m = CONTENT_TYPE_RE.exec(contentType);\r\n if (!m) {\r\n throw new Error(\"unsupported content-type\");\r\n }\r\n\r\n let boundary = \"\";\r\n CONTENT_TYPE_PARAM_RE.lastIndex = m.index + m[0].length - 1;\r\n while ((m = CONTENT_TYPE_PARAM_RE.exec(contentType))) {\r\n if (m[1].toLowerCase() !== \"boundary\")\r\n continue;\r\n\r\n boundary = m[2] || m[3];\r\n break;\r\n }\r\n\r\n if (!boundary) {\r\n throw new Error(\"content-type missing boundary\");\r\n }\r\n\r\n this._headerFieldDecoder = null;\r\n this._headerValueDecoder = null;\r\n this._headerField = \"\";\r\n this._partHeaders = {};\r\n this._partName = null;\r\n this._partChunks = [];\r\n this._headerValue = \"\";\r\n\r\n this._headerFieldMark = null;\r\n this._headerValueMark = null;\r\n this._partDataMark = null;\r\n this._partBoundaryFlag = false;\r\n\r\n this._boundary = boundary;\r\n this._buffer = buffer;\r\n this._value = RpcSerializedValue.create();\r\n }\r\n\r\n public parse(): RpcSerializedValue {\r\n let i = 0;\r\n const len = this._buffer.length;\r\n let prevIndex = 0;\r\n let index = 0;\r\n let state = START;\r\n\r\n const boundary = new Uint8Array(this._boundary.length + 4);\r\n const boundaryEncoder = new TextEncoder(); // encodes utf8 only\r\n boundaryEncoder.encodeInto(\"\\r\\n--\", boundary.subarray(0));\r\n boundaryEncoder.encodeInto(this._boundary, boundary.subarray(4));\r\n\r\n const boundaryChars: { [index: number]: boolean } = {};\r\n for (const char of boundary) {\r\n boundaryChars[char] = true;\r\n }\r\n\r\n const boundaryLength = boundary.length;\r\n const boundaryEnd = boundaryLength - 1;\r\n const bufferLength = this._buffer.length;\r\n const lookbehind = new Uint8Array(boundaryLength + 8);\r\n\r\n let c;\r\n let cl;\r\n\r\n for (i = 0; i < len; i++) {\r\n c = this._buffer[i];\r\n switch (state) {\r\n case START:\r\n index = 0;\r\n state = START_BOUNDARY;\r\n /* falls through */\r\n case START_BOUNDARY:\r\n if (index === boundaryLength - 2 && c === HYPHEN) {\r\n index = 1;\r\n state = CLOSE_BOUNDARY;\r\n break;\r\n } else if (index === boundaryLength - 2) {\r\n if (c !== CR)\r\n throw new Error(`Expected CR Received ${c}`);\r\n\r\n index++;\r\n break;\r\n } else if (index === boundaryLength - 1) {\r\n if (c !== LF)\r\n throw new Error(`Expected LF Received ${c}`);\r\n\r\n index = 0;\r\n this._onParsePartBegin();\r\n state = HEADER_FIELD_START;\r\n break;\r\n }\r\n\r\n if (c !== boundary[index + 2])\r\n index = -2;\r\n\r\n if (c === boundary[index + 2])\r\n index++;\r\n\r\n break;\r\n case HEADER_FIELD_START:\r\n state = HEADER_FIELD;\r\n this._headerFieldMark = i;\r\n index = 0;\r\n /* falls through */\r\n case HEADER_FIELD:\r\n if (c === CR) {\r\n this._headerFieldMark = null;\r\n state = HEADERS_ALMOST_DONE;\r\n break;\r\n }\r\n\r\n index++;\r\n if (c === HYPHEN)\r\n break;\r\n\r\n if (c === COLON) {\r\n if (index === 1) {\r\n // empty header field\r\n throw new Error(\"Empty header field\");\r\n }\r\n this._onParseHeaderField(this._buffer.subarray(this._headerFieldMark as number, i));\r\n this._headerFieldMark = null;\r\n state = HEADER_VALUE_START;\r\n break;\r\n }\r\n\r\n cl = c | 0x20;\r\n if (cl < A || cl > Z) {\r\n throw new Error(`Expected alphabetic character, received ${c}`);\r\n }\r\n break;\r\n case HEADER_VALUE_START:\r\n if (c === SPACE)\r\n break;\r\n\r\n this._headerValueMark = i;\r\n state = HEADER_VALUE;\r\n /* falls through */\r\n case HEADER_VALUE:\r\n if (c === CR) {\r\n this._onParseHeaderValue(this._buffer.subarray(this._headerValueMark as number, i));\r\n this._headerValueMark = null;\r\n this._onParseHeaderEnd();\r\n state = HEADER_VALUE_ALMOST_DONE;\r\n }\r\n break;\r\n case HEADER_VALUE_ALMOST_DONE:\r\n if (c !== LF)\r\n throw new Error(`Expected LF Received ${c}`);\r\n\r\n state = HEADER_FIELD_START;\r\n break;\r\n case HEADERS_ALMOST_DONE:\r\n if (c !== LF)\r\n throw new Error(`Expected LF Received ${c}`);\r\n\r\n const err: any = this._onParseHeadersEnd(i + 1);\r\n if (err)\r\n throw err;\r\n\r\n state = PART_DATA_START;\r\n break;\r\n case PART_DATA_START:\r\n state = PART_DATA;\r\n this._partDataMark = i;\r\n /* falls through */\r\n case PART_DATA:\r\n prevIndex = index;\r\n\r\n if (index === 0) {\r\n // boyer-moore derived algorithm to safely skip non-boundary data\r\n i += boundaryEnd;\r\n while (i < bufferLength && !(this._buffer[i] in boundaryChars)) {\r\n i += boundaryLength;\r\n }\r\n i -= boundaryEnd;\r\n c = this._buffer[i];\r\n }\r\n\r\n if (index < boundaryLength) {\r\n if (boundary[index] === c) {\r\n if (index === 0) {\r\n this._onParsePartData(this._buffer.subarray(this._partDataMark as number, i));\r\n this._partDataMark = null;\r\n }\r\n index++;\r\n } else {\r\n index = 0;\r\n }\r\n } else if (index === boundaryLength) {\r\n index++;\r\n if (c === CR) {\r\n // CR = part boundary\r\n this._partBoundaryFlag = true;\r\n } else if (c === HYPHEN) {\r\n index = 1;\r\n state = CLOSE_BOUNDARY;\r\n break;\r\n } else {\r\n index = 0;\r\n }\r\n } else if (index - 1 === boundaryLength) {\r\n if (this._partBoundaryFlag) {\r\n index = 0;\r\n if (c === LF) {\r\n this._partBoundaryFlag = false;\r\n this._onParsePartEnd();\r\n this._onParsePartBegin();\r\n state = HEADER_FIELD_START;\r\n break;\r\n }\r\n } else {\r\n index = 0;\r\n }\r\n }\r\n\r\n if (index > 0) {\r\n // when matching a possible boundary, keep a lookbehind reference\r\n // in case it turns out to be a false lead\r\n lookbehind[index - 1] = c;\r\n } else if (prevIndex > 0) {\r\n // if our boundary turned out to be rubbish, the captured lookbehind\r\n // belongs to partData\r\n this._onParsePartData(lookbehind.subarray(0, prevIndex));\r\n prevIndex = 0;\r\n this._partDataMark = i;\r\n\r\n // reconsider the current character even so it interrupted the sequence\r\n // it could be the beginning of a new sequence\r\n i--;\r\n }\r\n\r\n break;\r\n case CLOSE_BOUNDARY:\r\n if (c !== HYPHEN)\r\n throw new Error(`Expected HYPHEN Received ${c}`);\r\n\r\n if (index === 1) {\r\n this._onParsePartEnd();\r\n state = END;\r\n } else if (index > 1) {\r\n throw new Error(\"Parser has invalid state.\");\r\n }\r\n index++;\r\n break;\r\n case END:\r\n break;\r\n default:\r\n throw new Error(\"Parser has invalid state.\");\r\n }\r\n }\r\n\r\n if (this._headerFieldMark != null) {\r\n this._onParseHeaderField(this._buffer.subarray(this._headerFieldMark));\r\n this._headerFieldMark = 0;\r\n }\r\n if (this._headerValueMark != null) {\r\n this._onParseHeaderValue(this._buffer.subarray(this._headerValueMark));\r\n this._headerValueMark = 0;\r\n }\r\n if (this._partDataMark != null) {\r\n this._onParsePartData(this._buffer.subarray(this._partDataMark));\r\n this._partDataMark = 0;\r\n }\r\n\r\n return this._value;\r\n }\r\n\r\n private _onParsePartBegin() {\r\n this._clearPartVars();\r\n }\r\n\r\n private _clearPartVars() {\r\n this._partHeaders = {};\r\n this._partName = null;\r\n this._partChunks.length = 0;\r\n\r\n this._headerFieldDecoder = new TextDecoder(\"utf8\");\r\n this._headerField = \"\";\r\n this._headerValueDecoder = new TextDecoder(\"utf8\");\r\n this._headerValue = \"\";\r\n }\r\n\r\n private _onParseHeaderField(b: Uint8Array) {\r\n this._headerField += this._headerFieldDecoder!.decode(b);\r\n }\r\n\r\n private _onParseHeaderValue(b: Uint8Array) {\r\n this._headerValue += this._headerValueDecoder!.decode(b);\r\n }\r\n\r\n private _onParseHeaderEnd() {\r\n this._headerField = this._headerField.toLowerCase();\r\n this._partHeaders[this._headerField] = this._headerValue;\r\n\r\n let m: RegExpMatchArray | null;\r\n if (this._headerField === \"content-disposition\") {\r\n if (m = this._headerValue.match(/\\bname=\"([^\"]+)\"/i)) {\r\n this._partName = m[1];\r\n }\r\n // this._partFilename = parseFilename(this._headerValue);\r\n } else if (this._headerField === \"content-transfer-encoding\") {\r\n // this._partTransferEncoding = this._headerValue.toLowerCase();\r\n }\r\n\r\n this._headerFieldDecoder = new TextDecoder(\"utf8\");\r\n this._headerField = \"\";\r\n this._headerValueDecoder = new TextDecoder(\"utf8\");\r\n this._headerValue = \"\";\r\n }\r\n\r\n private _onParsePartData(b: Uint8Array) {\r\n this._partChunks.push(b);\r\n }\r\n\r\n private _concatParts() {\r\n let totalSize = 0;\r\n for (const chunk of this._partChunks) {\r\n totalSize += chunk.length;\r\n }\r\n\r\n const combined = new Uint8Array(totalSize);\r\n\r\n let offset = 0;\r\n for (const chunk of this._partChunks) {\r\n combined.set(chunk, offset);\r\n offset += chunk.length;\r\n }\r\n\r\n return combined;\r\n }\r\n\r\n private _onParsePartEnd() {\r\n const partValue = this._partChunks.length === 1 ? this._partChunks[0] : this._concatParts();\r\n\r\n if (this._partName === \"objects\") {\r\n const partDecoder = new TextDecoder();\r\n this._value.objects = partDecoder.decode(partValue);\r\n } else {\r\n this._value.data.push(partValue);\r\n }\r\n\r\n this._clearPartVars();\r\n }\r\n\r\n private _onParseHeadersEnd(_offset: number) {\r\n }\r\n}\r\n"]}
|