UNPKG

@itwin/core-common

Version:

iTwin.js components common to frontend and backend

117 lines 5.8 kB
"use strict"; /*--------------------------------------------------------------------------------------------- * Copyright (c) Bentley Systems, Incorporated. All rights reserved. * See LICENSE.md in the project root for license terms and full copyright notice. *--------------------------------------------------------------------------------------------*/ /** @packageDocumentation * @module RpcInterface */ Object.defineProperty(exports, "__esModule", { value: true }); exports.WebAppRpcProtocol = void 0; const core_bentley_1 = require("@itwin/core-bentley"); const CommonLoggerCategory_1 = require("../../CommonLoggerCategory"); const RpcConstants_1 = require("../core/RpcConstants"); const RpcProtocol_1 = require("../core/RpcProtocol"); const OpenAPI_1 = require("./OpenAPI"); const WebAppRpcLogging_1 = require("./WebAppRpcLogging"); const WebAppRpcRequest_1 = require("./WebAppRpcRequest"); /** The HTTP application protocol. * @internal */ class WebAppRpcProtocol extends RpcProtocol_1.RpcProtocol { preserveStreams = true; /** Convenience handler for an RPC operation get request for an HTTP server. */ async handleOperationGetRequest(req, res) { return this.handleOperationPostRequest(req, res); } /** Convenience handler for an RPC operation post request for an HTTP server. */ async handleOperationPostRequest(req, res) { let request; try { request = await WebAppRpcRequest_1.WebAppRpcRequest.parseRequest(this, req); } catch (error) { const message = core_bentley_1.BentleyError.getErrorMessage(error); core_bentley_1.Logger.logError(CommonLoggerCategory_1.CommonLoggerCategory.RpcInterfaceBackend, `Failed to parse request: ${message}`, core_bentley_1.BentleyError.getErrorMetadata(error)); res.status(400); res.send(JSON.stringify({ message, isError: true })); return; } const fulfillment = await this.fulfill(request); await WebAppRpcRequest_1.WebAppRpcRequest.sendResponse(this, request, fulfillment, req, res); } /** Convenience handler for an OpenAPI description request for an HTTP server. */ handleOpenApiDescriptionRequest(_req, res) { const description = JSON.stringify(this.openAPIDescription); res.send(description); } /** Converts an HTTP content type value to an RPC content type value. */ static computeContentType(httpType) { if (!httpType) return RpcConstants_1.RpcContentType.Unknown; if (httpType.indexOf(RpcConstants_1.WEB_RPC_CONSTANTS.ANY_TEXT) === 0) { return RpcConstants_1.RpcContentType.Text; } else if (httpType.indexOf(RpcConstants_1.WEB_RPC_CONSTANTS.BINARY) === 0) { return RpcConstants_1.RpcContentType.Binary; } else if (httpType.indexOf(RpcConstants_1.WEB_RPC_CONSTANTS.MULTIPART) === 0) { return RpcConstants_1.RpcContentType.Multipart; } else { return RpcConstants_1.RpcContentType.Unknown; } } /** An optional prefix for RPC operation URI paths. */ pathPrefix = ""; /** The RPC request class for this protocol. */ requestType = WebAppRpcRequest_1.WebAppRpcRequest; /** Supplies the status corresponding to a protocol-specific code value. */ getStatus(code) { switch (code) { case 404: return RpcConstants_1.RpcRequestStatus.NotFound; case 202: return RpcConstants_1.RpcRequestStatus.Pending; case 200: return RpcConstants_1.RpcRequestStatus.Resolved; case 500: return RpcConstants_1.RpcRequestStatus.Rejected; case 204: return RpcConstants_1.RpcRequestStatus.NoContent; case 502: return RpcConstants_1.RpcRequestStatus.BadGateway; case 503: return RpcConstants_1.RpcRequestStatus.ServiceUnavailable; case 504: return RpcConstants_1.RpcRequestStatus.GatewayTimeout; case 408: return RpcConstants_1.RpcRequestStatus.RequestTimeout; case 429: return RpcConstants_1.RpcRequestStatus.TooManyRequests; default: return RpcConstants_1.RpcRequestStatus.Unknown; } } /** Supplies the protocol-specific code corresponding to a status value. */ getCode(status) { switch (status) { case RpcConstants_1.RpcRequestStatus.NotFound: return 404; case RpcConstants_1.RpcRequestStatus.Pending: return 202; case RpcConstants_1.RpcRequestStatus.Resolved: return 200; case RpcConstants_1.RpcRequestStatus.Rejected: return 500; case RpcConstants_1.RpcRequestStatus.NoContent: return 204; case RpcConstants_1.RpcRequestStatus.BadGateway: return 502; case RpcConstants_1.RpcRequestStatus.ServiceUnavailable: return 503; case RpcConstants_1.RpcRequestStatus.GatewayTimeout: return 504; case RpcConstants_1.RpcRequestStatus.RequestTimeout: return 408; case RpcConstants_1.RpcRequestStatus.TooManyRequests: return 429; default: return 501; } } supportsStatusCategory = true; /** Whether an HTTP status code indicates a request timeout. */ isTimeout(code) { return code === 504; } /** An OpenAPI-compatible description of this protocol. * @internal */ get openAPIDescription() { return new OpenAPI_1.RpcOpenAPIDescription(this); } /** Constructs an HTTP protocol. */ constructor(configuration) { super(configuration); this.events.addListener(async (event, object) => WebAppRpcLogging_1.WebAppRpcLogging.logProtocolEvent(event, object)); } } exports.WebAppRpcProtocol = WebAppRpcProtocol; //# sourceMappingURL=WebAppRpcProtocol.js.map