@dronedeploy/rocos-js-sdk 3.0.1-alpha.9 → 3.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +59 -29
- package/cjs/IRocosSDK.d.ts +4 -3
- package/cjs/RocosSDK.d.ts +19 -7
- package/cjs/RocosSDK.js +31 -10
- package/cjs/api/streams/caller/CallerStream.js +5 -2
- package/cjs/api/streams/caller/CallerStreamNode.js +2 -1
- package/cjs/api/streams/command/CommandStream.js +5 -2
- package/cjs/api/streams/command/CommandStreamNode.js +2 -1
- package/cjs/api/streams/control/ControlStream.js +5 -2
- package/cjs/api/streams/control/ControlStreamAbstract.d.ts +1 -1
- package/cjs/api/streams/control/ControlStreamNode.js +2 -1
- package/cjs/api/streams/fileAccessor/FileAccessorStream.js +4 -1
- package/cjs/api/streams/fileAccessor/FileAccessorStreamNode.js +3 -1
- package/cjs/api/streams/search/SearchStream.js +5 -2
- package/cjs/api/streams/search/SearchStreamNode.js +2 -1
- package/cjs/api/streams/telemetry/TelemetryStream.js +4 -1
- package/cjs/api/streams/telemetry/TelemetryStreamAbstract.d.ts +1 -1
- package/cjs/api/streams/telemetry/TelemetryStreamNode.js +2 -1
- package/cjs/api/streams/webRTCSignalling/WebRTCSignallingStream.js +5 -2
- package/cjs/constants/api.d.ts +31 -15
- package/cjs/constants/api.js +35 -18
- package/cjs/helpers/cleanObject.js +4 -1
- package/cjs/helpers/getUniqueConfigKey.d.ts +6 -2
- package/cjs/helpers/getUniqueConfigKey.js +7 -2
- package/cjs/helpers/index.d.ts +1 -0
- package/cjs/helpers/index.js +1 -0
- package/cjs/helpers/kscript/Context.d.ts +34 -0
- package/cjs/helpers/kscript/Context.js +52 -0
- package/cjs/helpers/kscript/index.d.ts +1 -0
- package/cjs/helpers/kscript/index.js +27 -0
- package/cjs/helpers/kscript/kscript.d.ts +6 -0
- package/cjs/helpers/kscript/kscript.js +115 -0
- package/cjs/helpers/kscript/nodes/Identifier.d.ts +12 -0
- package/cjs/helpers/kscript/nodes/Identifier.js +20 -0
- package/cjs/helpers/kscript/nodes/Literal.d.ts +11 -0
- package/cjs/helpers/kscript/nodes/Literal.js +22 -0
- package/cjs/helpers/kscript/nodes/Node.d.ts +9 -0
- package/cjs/helpers/kscript/nodes/Node.js +15 -0
- package/cjs/helpers/kscript/nodes/Program.d.ts +11 -0
- package/cjs/helpers/kscript/nodes/Program.js +24 -0
- package/cjs/helpers/kscript/nodes/TemplateLiteral.d.ts +23 -0
- package/cjs/helpers/kscript/nodes/TemplateLiteral.js +35 -0
- package/cjs/helpers/kscript/nodes/expressions/ArrayExpression.d.ts +7 -0
- package/cjs/helpers/kscript/nodes/expressions/ArrayExpression.js +31 -0
- package/cjs/helpers/kscript/nodes/expressions/ArrowFunctionExpression.d.ts +14 -0
- package/cjs/helpers/kscript/nodes/expressions/ArrowFunctionExpression.js +40 -0
- package/cjs/helpers/kscript/nodes/expressions/BinaryExpression.d.ts +16 -0
- package/cjs/helpers/kscript/nodes/expressions/BinaryExpression.js +104 -0
- package/cjs/helpers/kscript/nodes/expressions/CallExpression.d.ts +8 -0
- package/cjs/helpers/kscript/nodes/expressions/CallExpression.js +38 -0
- package/cjs/helpers/kscript/nodes/expressions/ChainExpression.d.ts +16 -0
- package/cjs/helpers/kscript/nodes/expressions/ChainExpression.js +25 -0
- package/cjs/helpers/kscript/nodes/expressions/ConditionalExpression.d.ts +14 -0
- package/cjs/helpers/kscript/nodes/expressions/ConditionalExpression.js +30 -0
- package/cjs/helpers/kscript/nodes/expressions/ExpressionStatement.d.ts +7 -0
- package/cjs/helpers/kscript/nodes/expressions/ExpressionStatement.js +18 -0
- package/cjs/helpers/kscript/nodes/expressions/LogicalExpression.d.ts +10 -0
- package/cjs/helpers/kscript/nodes/expressions/LogicalExpression.js +47 -0
- package/cjs/helpers/kscript/nodes/expressions/MemberExpression.d.ts +44 -0
- package/cjs/helpers/kscript/nodes/expressions/MemberExpression.js +98 -0
- package/cjs/helpers/kscript/nodes/expressions/ObjectExpression.d.ts +11 -0
- package/cjs/helpers/kscript/nodes/expressions/ObjectExpression.js +59 -0
- package/cjs/helpers/kscript/nodes/expressions/UnaryExpression.d.ts +12 -0
- package/cjs/helpers/kscript/nodes/expressions/UnaryExpression.js +44 -0
- package/cjs/helpers/kscript/nodes/expressions/index.d.ts +11 -0
- package/cjs/helpers/kscript/nodes/expressions/index.js +28 -0
- package/cjs/helpers/kscript/nodes/index.d.ts +4 -0
- package/cjs/helpers/kscript/nodes/index.js +10 -0
- package/cjs/helpers/kscript/nodes/nodeTypes.d.ts +33 -0
- package/cjs/helpers/kscript/nodes/nodeTypes.js +29 -0
- package/cjs/helpers/kscript/utils.d.ts +4 -0
- package/cjs/helpers/kscript/utils.js +15 -0
- package/cjs/helpers/websandbox/connection.d.ts +2 -1
- package/cjs/helpers/websandbox/connection.js +6 -5
- package/cjs/helpers/websandbox/frame/frame.js +4 -1
- package/cjs/helpers/websandbox/frame/frame.source.js +1 -1
- package/cjs/helpers/websandbox/frame/worker/manager.d.ts +8 -4
- package/cjs/helpers/websandbox/frame/worker/manager.js +32 -14
- package/cjs/helpers/websandbox/frame/worker/worker.source.js +1 -1
- package/cjs/helpers/websandbox/sandbox.d.ts +1 -1
- package/cjs/helpers/websandbox/sandbox.js +7 -7
- package/cjs/models/IConnectedCallsign.d.ts +10 -0
- package/cjs/models/IConnectedCallsign.js +8 -0
- package/cjs/models/RocosError.d.ts +3 -0
- package/cjs/models/RocosError.js +3 -0
- package/cjs/models/ServiceEnum.d.ts +20 -17
- package/cjs/models/ServiceEnum.js +20 -17
- package/cjs/models/TelemetryStatus.d.ts +12 -0
- package/cjs/models/TelemetryStatus.js +17 -0
- package/cjs/models/Token.d.ts +2 -2
- package/cjs/models/Token.js +5 -5
- package/cjs/models/asset-storage/{AssetModelItem.d.ts → AssetItem.d.ts} +2 -0
- package/cjs/models/device-credentials/DeviceCredentials.d.ts +61 -0
- package/cjs/models/device-credentials/DeviceCredentials.js +2 -0
- package/cjs/models/graph/Position.d.ts +6 -0
- package/cjs/models/graph/Position.js +2 -0
- package/cjs/models/graph/Quaternion.d.ts +6 -0
- package/cjs/models/graph/Quaternion.js +2 -0
- package/cjs/models/graph/Vector3.d.ts +5 -0
- package/cjs/models/graph/Vector3.js +2 -0
- package/cjs/models/graph/index.d.ts +3 -0
- package/cjs/models/graph/index.js +19 -0
- package/cjs/models/index.d.ts +9 -2
- package/cjs/models/index.js +9 -2
- package/cjs/models/integrations/Location.d.ts +24 -0
- package/cjs/models/integrations/Location.js +2 -0
- package/cjs/models/integrations/PaginatedResults.d.ts +4 -0
- package/cjs/models/integrations/PaginatedResults.js +2 -0
- package/cjs/models/maps/Panorama.d.ts +12 -21
- package/cjs/models/projects/ExternalProject.d.ts +10 -0
- package/cjs/models/projects/ExternalProject.js +2 -0
- package/cjs/models/projects/NewProjectRequest.d.ts +8 -0
- package/cjs/models/projects/NewProjectRequest.js +2 -0
- package/cjs/models/target/Target.d.ts +30 -0
- package/cjs/models/target/Target.js +15 -0
- package/cjs/node/RocosSDKNode.d.ts +1 -5
- package/cjs/node/RocosSDKNode.js +9 -9
- package/cjs/services/AssetStorageService.d.ts +9 -1
- package/cjs/services/AssetStorageService.js +12 -1
- package/cjs/services/AuthService.d.ts +12 -1
- package/cjs/services/AuthService.js +25 -1
- package/cjs/services/DeviceCredentialsService.d.ts +15 -0
- package/cjs/services/DeviceCredentialsService.js +56 -0
- package/cjs/services/EnvironmentService.d.ts +34 -0
- package/cjs/services/EnvironmentService.js +56 -0
- package/cjs/services/EvaluatorService.js +1 -1
- package/cjs/services/IntegrationService.d.ts +7 -1
- package/cjs/services/IntegrationService.js +8 -0
- package/cjs/services/MapService.d.ts +18 -8
- package/cjs/services/MapService.js +37 -19
- package/cjs/services/ProfileService.d.ts +24 -0
- package/cjs/services/ProfileService.js +34 -0
- package/cjs/services/ProjectService.d.ts +7 -2
- package/cjs/services/ProjectService.js +7 -3
- package/cjs/services/RTPWebRTCService.d.ts +6 -1
- package/cjs/services/RTPWebRTCService.js +10 -2
- package/cjs/services/RobotService.d.ts +3 -1
- package/cjs/services/RobotService.js +6 -0
- package/cjs/services/SpotProvisioningService.d.ts +1 -1
- package/cjs/services/SpotProvisioningServiceNode.d.ts +1 -1
- package/cjs/services/TargetService.d.ts +17 -0
- package/cjs/services/TargetService.js +66 -0
- package/cjs/services/TelemetryService.d.ts +10 -1
- package/cjs/services/TelemetryService.js +27 -5
- package/cjs/services/WorkflowService.d.ts +18 -8
- package/cjs/services/WorkflowService.js +37 -11
- package/cjs/services/index.d.ts +11 -9
- package/cjs/services/index.js +11 -9
- package/cjs/store/RocosStore.d.ts +1 -2
- package/esm/IRocosSDK.d.ts +4 -3
- package/esm/RocosSDK.d.ts +19 -7
- package/esm/RocosSDK.js +32 -11
- package/esm/api/streams/caller/CallerStream.js +5 -2
- package/esm/api/streams/caller/CallerStreamNode.js +2 -1
- package/esm/api/streams/command/CommandStream.js +5 -2
- package/esm/api/streams/command/CommandStreamNode.js +2 -1
- package/esm/api/streams/control/ControlStream.js +5 -2
- package/esm/api/streams/control/ControlStreamAbstract.d.ts +1 -1
- package/esm/api/streams/control/ControlStreamNode.js +2 -1
- package/esm/api/streams/fileAccessor/FileAccessorStream.js +4 -1
- package/esm/api/streams/fileAccessor/FileAccessorStreamNode.js +3 -1
- package/esm/api/streams/search/SearchStream.js +5 -2
- package/esm/api/streams/search/SearchStreamNode.js +2 -1
- package/esm/api/streams/telemetry/TelemetryStream.js +4 -1
- package/esm/api/streams/telemetry/TelemetryStreamAbstract.d.ts +1 -1
- package/esm/api/streams/telemetry/TelemetryStreamNode.js +2 -1
- package/esm/api/streams/webRTCSignalling/WebRTCSignallingStream.js +5 -2
- package/esm/constants/api.d.ts +31 -15
- package/esm/constants/api.js +31 -15
- package/esm/helpers/cleanObject.js +4 -1
- package/esm/helpers/getUniqueConfigKey.d.ts +6 -2
- package/esm/helpers/getUniqueConfigKey.js +7 -2
- package/esm/helpers/index.d.ts +1 -0
- package/esm/helpers/index.js +1 -0
- package/esm/helpers/kscript/Context.d.ts +34 -0
- package/esm/helpers/kscript/Context.js +49 -0
- package/esm/helpers/kscript/index.d.ts +1 -0
- package/esm/helpers/kscript/index.js +1 -0
- package/esm/helpers/kscript/kscript.d.ts +6 -0
- package/esm/helpers/kscript/kscript.js +107 -0
- package/esm/helpers/kscript/nodes/Identifier.d.ts +12 -0
- package/esm/helpers/kscript/nodes/Identifier.js +14 -0
- package/esm/helpers/kscript/nodes/Literal.d.ts +11 -0
- package/esm/helpers/kscript/nodes/Literal.js +16 -0
- package/esm/helpers/kscript/nodes/Node.d.ts +9 -0
- package/esm/helpers/kscript/nodes/Node.js +12 -0
- package/esm/helpers/kscript/nodes/Program.d.ts +11 -0
- package/esm/helpers/kscript/nodes/Program.js +18 -0
- package/esm/helpers/kscript/nodes/TemplateLiteral.d.ts +23 -0
- package/esm/helpers/kscript/nodes/TemplateLiteral.js +29 -0
- package/esm/helpers/kscript/nodes/expressions/ArrayExpression.d.ts +7 -0
- package/esm/helpers/kscript/nodes/expressions/ArrayExpression.js +25 -0
- package/esm/helpers/kscript/nodes/expressions/ArrowFunctionExpression.d.ts +14 -0
- package/esm/helpers/kscript/nodes/expressions/ArrowFunctionExpression.js +34 -0
- package/esm/helpers/kscript/nodes/expressions/BinaryExpression.d.ts +16 -0
- package/esm/helpers/kscript/nodes/expressions/BinaryExpression.js +98 -0
- package/esm/helpers/kscript/nodes/expressions/CallExpression.d.ts +8 -0
- package/esm/helpers/kscript/nodes/expressions/CallExpression.js +32 -0
- package/esm/helpers/kscript/nodes/expressions/ChainExpression.d.ts +16 -0
- package/esm/helpers/kscript/nodes/expressions/ChainExpression.js +19 -0
- package/esm/helpers/kscript/nodes/expressions/ConditionalExpression.d.ts +14 -0
- package/esm/helpers/kscript/nodes/expressions/ConditionalExpression.js +24 -0
- package/esm/helpers/kscript/nodes/expressions/ExpressionStatement.d.ts +7 -0
- package/esm/helpers/kscript/nodes/expressions/ExpressionStatement.js +12 -0
- package/esm/helpers/kscript/nodes/expressions/LogicalExpression.d.ts +10 -0
- package/esm/helpers/kscript/nodes/expressions/LogicalExpression.js +41 -0
- package/esm/helpers/kscript/nodes/expressions/MemberExpression.d.ts +44 -0
- package/esm/helpers/kscript/nodes/expressions/MemberExpression.js +92 -0
- package/esm/helpers/kscript/nodes/expressions/ObjectExpression.d.ts +11 -0
- package/esm/helpers/kscript/nodes/expressions/ObjectExpression.js +53 -0
- package/esm/helpers/kscript/nodes/expressions/UnaryExpression.d.ts +12 -0
- package/esm/helpers/kscript/nodes/expressions/UnaryExpression.js +38 -0
- package/esm/helpers/kscript/nodes/expressions/index.d.ts +11 -0
- package/esm/helpers/kscript/nodes/expressions/index.js +11 -0
- package/esm/helpers/kscript/nodes/index.d.ts +4 -0
- package/esm/helpers/kscript/nodes/index.js +3 -0
- package/esm/helpers/kscript/nodes/nodeTypes.d.ts +33 -0
- package/esm/helpers/kscript/nodes/nodeTypes.js +24 -0
- package/esm/helpers/kscript/utils.d.ts +4 -0
- package/esm/helpers/kscript/utils.js +11 -0
- package/esm/helpers/websandbox/connection.d.ts +2 -1
- package/esm/helpers/websandbox/connection.js +6 -5
- package/esm/helpers/websandbox/frame/frame.js +4 -1
- package/esm/helpers/websandbox/frame/frame.source.js +1 -1
- package/esm/helpers/websandbox/frame/worker/manager.d.ts +8 -4
- package/esm/helpers/websandbox/frame/worker/manager.js +32 -14
- package/esm/helpers/websandbox/frame/worker/worker.source.js +1 -1
- package/esm/helpers/websandbox/sandbox.d.ts +1 -1
- package/esm/helpers/websandbox/sandbox.js +7 -7
- package/esm/models/IConnectedCallsign.d.ts +10 -0
- package/esm/models/IConnectedCallsign.js +5 -0
- package/esm/models/RocosError.d.ts +3 -0
- package/esm/models/RocosError.js +3 -0
- package/esm/models/ServiceEnum.d.ts +20 -17
- package/esm/models/ServiceEnum.js +20 -17
- package/esm/models/TelemetryStatus.d.ts +12 -0
- package/esm/models/TelemetryStatus.js +14 -0
- package/esm/models/Token.d.ts +2 -2
- package/esm/models/Token.js +5 -5
- package/esm/models/asset-storage/{AssetModelItem.d.ts → AssetItem.d.ts} +2 -0
- package/esm/models/device-credentials/DeviceCredentials.d.ts +61 -0
- package/esm/models/graph/Position.d.ts +6 -0
- package/esm/models/graph/Quaternion.d.ts +6 -0
- package/esm/models/graph/Vector3.d.ts +5 -0
- package/esm/models/graph/index.d.ts +3 -0
- package/esm/models/graph/index.js +3 -0
- package/esm/models/index.d.ts +9 -2
- package/esm/models/index.js +9 -2
- package/esm/models/integrations/Location.d.ts +24 -0
- package/esm/models/integrations/PaginatedResults.d.ts +4 -0
- package/esm/models/maps/Panorama.d.ts +12 -21
- package/esm/models/projects/ExternalProject.d.ts +10 -0
- package/esm/models/projects/NewProjectRequest.d.ts +8 -0
- package/esm/models/target/Target.d.ts +30 -0
- package/esm/models/target/Target.js +9 -0
- package/esm/node/RocosSDKNode.d.ts +1 -5
- package/esm/node/RocosSDKNode.js +10 -10
- package/esm/services/AssetStorageService.d.ts +9 -1
- package/esm/services/AssetStorageService.js +13 -2
- package/esm/services/AuthService.d.ts +12 -1
- package/esm/services/AuthService.js +25 -1
- package/esm/services/BaseServiceAbstract.js +1 -1
- package/esm/services/DeviceCredentialsService.d.ts +15 -0
- package/esm/services/DeviceCredentialsService.js +52 -0
- package/esm/services/EnvironmentService.d.ts +34 -0
- package/esm/services/EnvironmentService.js +52 -0
- package/esm/services/EvaluatorService.js +1 -1
- package/esm/services/IntegrationService.d.ts +7 -1
- package/esm/services/IntegrationService.js +10 -2
- package/esm/services/MapService.d.ts +18 -8
- package/esm/services/MapService.js +38 -20
- package/esm/services/ProfileService.d.ts +24 -0
- package/esm/services/ProfileService.js +35 -1
- package/esm/services/ProjectService.d.ts +7 -2
- package/esm/services/ProjectService.js +9 -5
- package/esm/services/RTPWebRTCService.d.ts +6 -1
- package/esm/services/RTPWebRTCService.js +10 -2
- package/esm/services/RobotService.d.ts +3 -1
- package/esm/services/RobotService.js +8 -2
- package/esm/services/SpotProvisioningService.d.ts +1 -1
- package/esm/services/SpotProvisioningServiceNode.d.ts +1 -1
- package/esm/services/TargetService.d.ts +17 -0
- package/esm/services/TargetService.js +62 -0
- package/esm/services/TelemetryService.d.ts +10 -1
- package/esm/services/TelemetryService.js +28 -6
- package/esm/services/WorkflowService.d.ts +18 -8
- package/esm/services/WorkflowService.js +38 -12
- package/esm/services/index.d.ts +11 -9
- package/esm/services/index.js +11 -9
- package/esm/store/RocosStore.d.ts +1 -2
- package/package.json +2 -2
- package/cjs/helpers/cleanObject.spec.js +0 -55
- package/cjs/helpers/flattenObject.spec.js +0 -31
- package/cjs/helpers/flattenOneOf.spec.js +0 -159
- package/cjs/helpers/formatServiceUrl.spec.js +0 -18
- package/cjs/helpers/getSha256Hex.spec.js +0 -19
- package/cjs/helpers/getSha256HexNode.spec.js +0 -10
- package/cjs/helpers/getURLSearchParams.spec.js +0 -21
- package/cjs/helpers/nanosecondToMillisecond.spec.js +0 -22
- package/cjs/helpers/splitRobotTopic.spec.js +0 -53
- package/cjs/helpers/standardDeviation.spec.d.ts +0 -1
- package/cjs/helpers/standardDeviation.spec.js +0 -13
- package/cjs/helpers/websandbox/frame/worker/manager.spec.d.ts +0 -4
- package/cjs/helpers/websandbox/frame/worker/manager.spec.js +0 -132
- package/cjs/models/CallsignStatus.d.ts +0 -6
- package/cjs/models/CallsignStatus.js +0 -10
- package/cjs/models/ExternalProject.d.ts +0 -6
- package/cjs/models/ExternalProject.js +0 -6
- package/cjs/models/Token.spec.d.ts +0 -1
- package/cjs/models/Token.spec.js +0 -110
- package/cjs/services/AuthService.spec.d.ts +0 -1
- package/cjs/services/AuthService.spec.js +0 -165
- package/cjs/services/CallerService.spec.d.ts +0 -1
- package/cjs/services/CallerService.spec.js +0 -229
- package/cjs/services/FunctionService.d.ts +0 -68
- package/cjs/services/FunctionService.js +0 -103
- package/cjs/services/PlatformTimeService.spec.d.ts +0 -1
- package/cjs/services/PlatformTimeService.spec.js +0 -182
- package/cjs/services/RTPWebRTCService.spec.d.ts +0 -4
- package/cjs/services/RTPWebRTCService.spec.js +0 -171
- package/cjs/services/TelemetryService.spec.d.ts +0 -1
- package/cjs/services/TelemetryService.spec.js +0 -39
- package/esm/helpers/cleanObject.spec.d.ts +0 -1
- package/esm/helpers/cleanObject.spec.js +0 -53
- package/esm/helpers/flattenObject.spec.d.ts +0 -1
- package/esm/helpers/flattenObject.spec.js +0 -29
- package/esm/helpers/flattenOneOf.spec.d.ts +0 -1
- package/esm/helpers/flattenOneOf.spec.js +0 -157
- package/esm/helpers/formatServiceUrl.spec.d.ts +0 -1
- package/esm/helpers/formatServiceUrl.spec.js +0 -16
- package/esm/helpers/getSha256Hex.spec.d.ts +0 -1
- package/esm/helpers/getSha256Hex.spec.js +0 -14
- package/esm/helpers/getSha256HexNode.spec.d.ts +0 -1
- package/esm/helpers/getSha256HexNode.spec.js +0 -8
- package/esm/helpers/getURLSearchParams.spec.d.ts +0 -1
- package/esm/helpers/getURLSearchParams.spec.js +0 -19
- package/esm/helpers/nanosecondToMillisecond.spec.d.ts +0 -1
- package/esm/helpers/nanosecondToMillisecond.spec.js +0 -20
- package/esm/helpers/splitRobotTopic.spec.d.ts +0 -1
- package/esm/helpers/splitRobotTopic.spec.js +0 -51
- package/esm/helpers/standardDeviation.spec.d.ts +0 -1
- package/esm/helpers/standardDeviation.spec.js +0 -11
- package/esm/helpers/websandbox/frame/worker/manager.spec.d.ts +0 -4
- package/esm/helpers/websandbox/frame/worker/manager.spec.js +0 -127
- package/esm/models/CallsignStatus.d.ts +0 -6
- package/esm/models/CallsignStatus.js +0 -7
- package/esm/models/ExternalProject.d.ts +0 -6
- package/esm/models/ExternalProject.js +0 -2
- package/esm/models/Token.spec.d.ts +0 -1
- package/esm/models/Token.spec.js +0 -108
- package/esm/models/asset-storage/AssetModelItem.js +0 -1
- package/esm/services/AuthService.spec.d.ts +0 -1
- package/esm/services/AuthService.spec.js +0 -163
- package/esm/services/CallerService.spec.d.ts +0 -1
- package/esm/services/CallerService.spec.js +0 -227
- package/esm/services/FunctionService.d.ts +0 -68
- package/esm/services/FunctionService.js +0 -99
- package/esm/services/PlatformTimeService.spec.d.ts +0 -1
- package/esm/services/PlatformTimeService.spec.js +0 -180
- package/esm/services/RTPWebRTCService.spec.d.ts +0 -4
- package/esm/services/RTPWebRTCService.spec.js +0 -169
- package/esm/services/TelemetryService.spec.d.ts +0 -1
- package/esm/services/TelemetryService.spec.js +0 -37
- /package/cjs/models/asset-storage/{AssetModelItem.js → AssetItem.js} +0 -0
- /package/{cjs/helpers/cleanObject.spec.d.ts → esm/models/asset-storage/AssetItem.js} +0 -0
- /package/{cjs/helpers/flattenObject.spec.d.ts → esm/models/device-credentials/DeviceCredentials.js} +0 -0
- /package/{cjs/helpers/flattenOneOf.spec.d.ts → esm/models/graph/Position.js} +0 -0
- /package/{cjs/helpers/formatServiceUrl.spec.d.ts → esm/models/graph/Quaternion.js} +0 -0
- /package/{cjs/helpers/getSha256Hex.spec.d.ts → esm/models/graph/Vector3.js} +0 -0
- /package/{cjs/helpers/getSha256HexNode.spec.d.ts → esm/models/integrations/Location.js} +0 -0
- /package/{cjs/helpers/getURLSearchParams.spec.d.ts → esm/models/integrations/PaginatedResults.js} +0 -0
- /package/{cjs/helpers/nanosecondToMillisecond.spec.d.ts → esm/models/projects/ExternalProject.js} +0 -0
- /package/{cjs/helpers/splitRobotTopic.spec.d.ts → esm/models/projects/NewProjectRequest.js} +0 -0
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { AnyNode } from 'acorn';
|
|
2
|
+
import type Context from '../Context';
|
|
3
|
+
export default abstract class Node<T extends AnyNode = AnyNode> {
|
|
4
|
+
protected context: Context;
|
|
5
|
+
protected node: T;
|
|
6
|
+
protected scope: Context['scope'];
|
|
7
|
+
protected constructor(node: AnyNode, context: Context, expectedType: T['type'] | T['type'][]);
|
|
8
|
+
abstract run(): unknown;
|
|
9
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export default class Node {
|
|
2
|
+
constructor(node, context, expectedType) {
|
|
3
|
+
this.context = context;
|
|
4
|
+
const expectedTypes = Array.isArray(expectedType) ? expectedType : [expectedType];
|
|
5
|
+
if (!expectedTypes.includes(node.type)) {
|
|
6
|
+
console.error(node);
|
|
7
|
+
throw new Error(`Expected node type to be ${expectedTypes.join(' or ')}, but got ${node.type}`);
|
|
8
|
+
}
|
|
9
|
+
this.node = node;
|
|
10
|
+
this.scope = context.scope;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { AnyNode, Program } from 'acorn';
|
|
2
|
+
import Context from '../Context';
|
|
3
|
+
import Node from './Node';
|
|
4
|
+
/** Represents the root node of the program
|
|
5
|
+
*
|
|
6
|
+
* Since the sandbox only supports a single statement, this node will only ever run the first child.
|
|
7
|
+
*/
|
|
8
|
+
export default class ProgramNode extends Node<Program> {
|
|
9
|
+
constructor(node: AnyNode, scope: Context);
|
|
10
|
+
run(): unknown;
|
|
11
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import Node from './Node';
|
|
2
|
+
import { construct } from '../utils';
|
|
3
|
+
/** Represents the root node of the program
|
|
4
|
+
*
|
|
5
|
+
* Since the sandbox only supports a single statement, this node will only ever run the first child.
|
|
6
|
+
*/
|
|
7
|
+
export default class ProgramNode extends Node {
|
|
8
|
+
constructor(node, scope) {
|
|
9
|
+
super(node, scope, 'Program');
|
|
10
|
+
}
|
|
11
|
+
run() {
|
|
12
|
+
const children = this.node.body;
|
|
13
|
+
if (children.length !== 1) {
|
|
14
|
+
throw new Error('Only a single statement is supported in the sandbox');
|
|
15
|
+
}
|
|
16
|
+
return construct(children[0], this.context).run();
|
|
17
|
+
}
|
|
18
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { AnyNode, TemplateLiteral } from 'acorn';
|
|
2
|
+
import Context from '../Context';
|
|
3
|
+
import Node from './Node';
|
|
4
|
+
/**
|
|
5
|
+
* A template literal is a string literal that allows embedded expressions.
|
|
6
|
+
*
|
|
7
|
+
* e.g. `Hello ${name}`
|
|
8
|
+
*
|
|
9
|
+
* The `quasis` property is an array of strings that are the static parts of the template literal.
|
|
10
|
+
* The `expressions` property is an array of expressions that are the dynamic parts of the template literal.
|
|
11
|
+
*
|
|
12
|
+
* The template literal is constructed by merging the static parts with the results of evaluating the dynamic parts.
|
|
13
|
+
*
|
|
14
|
+
* i.e. `Hello ${name}. My name is ${name}.`
|
|
15
|
+
* Would result in three quasi values: `Hello `, `. My name is ` and `.`
|
|
16
|
+
* And two expressions: `Identifier<name>` and `Identifier<name>`
|
|
17
|
+
*
|
|
18
|
+
* There is *always* one more quasi value than there are expressions, even if the last quasi is an empty string.
|
|
19
|
+
*/
|
|
20
|
+
export default class TemplateLiteralNode extends Node<TemplateLiteral> {
|
|
21
|
+
constructor(node: AnyNode, scope: Context);
|
|
22
|
+
run(): unknown;
|
|
23
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import Node from './Node';
|
|
2
|
+
import { construct } from '../utils';
|
|
3
|
+
/**
|
|
4
|
+
* A template literal is a string literal that allows embedded expressions.
|
|
5
|
+
*
|
|
6
|
+
* e.g. `Hello ${name}`
|
|
7
|
+
*
|
|
8
|
+
* The `quasis` property is an array of strings that are the static parts of the template literal.
|
|
9
|
+
* The `expressions` property is an array of expressions that are the dynamic parts of the template literal.
|
|
10
|
+
*
|
|
11
|
+
* The template literal is constructed by merging the static parts with the results of evaluating the dynamic parts.
|
|
12
|
+
*
|
|
13
|
+
* i.e. `Hello ${name}. My name is ${name}.`
|
|
14
|
+
* Would result in three quasi values: `Hello `, `. My name is ` and `.`
|
|
15
|
+
* And two expressions: `Identifier<name>` and `Identifier<name>`
|
|
16
|
+
*
|
|
17
|
+
* There is *always* one more quasi value than there are expressions, even if the last quasi is an empty string.
|
|
18
|
+
*/
|
|
19
|
+
export default class TemplateLiteralNode extends Node {
|
|
20
|
+
constructor(node, scope) {
|
|
21
|
+
super(node, scope, 'TemplateLiteral');
|
|
22
|
+
}
|
|
23
|
+
run() {
|
|
24
|
+
return this.node.quasis.reduce((acc, quasi, i) => {
|
|
25
|
+
const expression = this.node.expressions[i] ? construct(this.node.expressions[i], this.context).run() : '';
|
|
26
|
+
return acc + quasi.value.raw + expression;
|
|
27
|
+
}, '');
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { AnyNode, ArrayExpression } from 'acorn';
|
|
2
|
+
import type Context from '../../Context';
|
|
3
|
+
import Node from '../Node';
|
|
4
|
+
export default class ArrayExpressionNode extends Node<ArrayExpression> {
|
|
5
|
+
constructor(node: AnyNode, context: Context);
|
|
6
|
+
run(): unknown;
|
|
7
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import Node from '../Node';
|
|
2
|
+
import { construct } from '../../utils';
|
|
3
|
+
export default class ArrayExpressionNode extends Node {
|
|
4
|
+
constructor(node, context) {
|
|
5
|
+
super(node, context, 'ArrayExpression');
|
|
6
|
+
}
|
|
7
|
+
run() {
|
|
8
|
+
const array = [];
|
|
9
|
+
for (const element of this.node.elements) {
|
|
10
|
+
if (element === null) {
|
|
11
|
+
// null implies an empty slot in the array (e.g. [1, , 3])
|
|
12
|
+
// an actual null value would be a literal node.
|
|
13
|
+
array.push(null);
|
|
14
|
+
delete array[array.length - 1];
|
|
15
|
+
}
|
|
16
|
+
else if (element.type === 'SpreadElement') {
|
|
17
|
+
array.push(...construct(element.argument, this.context).run());
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
array.push(construct(element, this.context).run());
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return array;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { AnyNode, ArrowFunctionExpression } from 'acorn';
|
|
2
|
+
import type Context from '../../Context';
|
|
3
|
+
import Node from '../Node';
|
|
4
|
+
/** Represents an arrow function expression.
|
|
5
|
+
*
|
|
6
|
+
* e.g. `(a, b) => a + b`
|
|
7
|
+
*
|
|
8
|
+
* In the sandbox this is the only way to define a function.
|
|
9
|
+
*/
|
|
10
|
+
export default class ArrowFunctionExpressionNode extends Node<ArrowFunctionExpression> {
|
|
11
|
+
private readonly params;
|
|
12
|
+
constructor(node: AnyNode, context: Context);
|
|
13
|
+
run(): unknown;
|
|
14
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import Node from '../Node';
|
|
2
|
+
import { construct } from '../../utils';
|
|
3
|
+
/** Represents an arrow function expression.
|
|
4
|
+
*
|
|
5
|
+
* e.g. `(a, b) => a + b`
|
|
6
|
+
*
|
|
7
|
+
* In the sandbox this is the only way to define a function.
|
|
8
|
+
*/
|
|
9
|
+
export default class ArrowFunctionExpressionNode extends Node {
|
|
10
|
+
constructor(node, context) {
|
|
11
|
+
super(node, context, 'ArrowFunctionExpression');
|
|
12
|
+
if (this.node.params.some((param) => param.type !== 'Identifier')) {
|
|
13
|
+
throw new Error('only identifiers are supported as parameters');
|
|
14
|
+
}
|
|
15
|
+
this.params = this.node.params;
|
|
16
|
+
}
|
|
17
|
+
run() {
|
|
18
|
+
if (!this.context.isFunctionCallAllowed)
|
|
19
|
+
throw new Error('functions are not allowed');
|
|
20
|
+
if (!this.node.expression)
|
|
21
|
+
throw new Error('functions must be an expression');
|
|
22
|
+
if (this.node.async)
|
|
23
|
+
throw new Error('async functions are not supported');
|
|
24
|
+
return (...args) => {
|
|
25
|
+
const scope = new Map();
|
|
26
|
+
for (const param of this.params) {
|
|
27
|
+
const index = this.params.indexOf(param);
|
|
28
|
+
scope.set(param.name, args?.[index]);
|
|
29
|
+
}
|
|
30
|
+
const newContext = this.context.newChildContext(scope);
|
|
31
|
+
return construct(this.node.body, newContext).run();
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { AnyNode, BinaryExpression } from 'acorn';
|
|
2
|
+
import Context from '../../Context';
|
|
3
|
+
import Node from '../Node';
|
|
4
|
+
/** A binary expression is an expression that consists of two operands and an operator
|
|
5
|
+
*
|
|
6
|
+
* e.g. `1 + 2`, `a === b`, `c < d`
|
|
7
|
+
*/
|
|
8
|
+
export default class BinaryExpressionNode extends Node<BinaryExpression> {
|
|
9
|
+
constructor(node: AnyNode, context: Context);
|
|
10
|
+
run(): unknown;
|
|
11
|
+
private operate;
|
|
12
|
+
private arithmetic;
|
|
13
|
+
private comparison;
|
|
14
|
+
private equality;
|
|
15
|
+
private checkIn;
|
|
16
|
+
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import Node from '../Node';
|
|
2
|
+
import { construct } from '../../utils';
|
|
3
|
+
/** A binary expression is an expression that consists of two operands and an operator
|
|
4
|
+
*
|
|
5
|
+
* e.g. `1 + 2`, `a === b`, `c < d`
|
|
6
|
+
*/
|
|
7
|
+
export default class BinaryExpressionNode extends Node {
|
|
8
|
+
constructor(node, context) {
|
|
9
|
+
super(node, context, 'BinaryExpression');
|
|
10
|
+
}
|
|
11
|
+
run() {
|
|
12
|
+
const left = construct(this.node.left, this.context).run();
|
|
13
|
+
const right = construct(this.node.right, this.context).run();
|
|
14
|
+
return this.operate(left, right);
|
|
15
|
+
}
|
|
16
|
+
operate(left, right) {
|
|
17
|
+
switch (this.node.operator) {
|
|
18
|
+
case '==':
|
|
19
|
+
case '!=':
|
|
20
|
+
case '===':
|
|
21
|
+
case '!==':
|
|
22
|
+
return this.equality(this.node.operator, left, right);
|
|
23
|
+
case '<':
|
|
24
|
+
case '<=':
|
|
25
|
+
case '>':
|
|
26
|
+
case '>=':
|
|
27
|
+
return this.comparison(this.node.operator, left, right);
|
|
28
|
+
case 'in':
|
|
29
|
+
return this.checkIn(left, right);
|
|
30
|
+
case '**':
|
|
31
|
+
case '+':
|
|
32
|
+
case '-':
|
|
33
|
+
case '*':
|
|
34
|
+
case '/':
|
|
35
|
+
case '%':
|
|
36
|
+
return this.arithmetic(this.node.operator, left, right);
|
|
37
|
+
default:
|
|
38
|
+
throw new Error(`Unsupported operator: ${this.node.operator}`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
arithmetic(operator, left, right) {
|
|
42
|
+
if (operator === '+' && (typeof left === 'string' || typeof right === 'string')) {
|
|
43
|
+
return `${left}${right}`;
|
|
44
|
+
}
|
|
45
|
+
if (typeof left !== 'number' || typeof right !== 'number') {
|
|
46
|
+
throw new Error('Arithmetic operators are only supported for numbers');
|
|
47
|
+
}
|
|
48
|
+
switch (operator) {
|
|
49
|
+
case '+':
|
|
50
|
+
return left + right;
|
|
51
|
+
case '-':
|
|
52
|
+
return left - right;
|
|
53
|
+
case '*':
|
|
54
|
+
return left * right;
|
|
55
|
+
case '/':
|
|
56
|
+
return left / right;
|
|
57
|
+
case '%':
|
|
58
|
+
return left % right;
|
|
59
|
+
case '**':
|
|
60
|
+
return left ** right;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
comparison(operator, left, right) {
|
|
64
|
+
if (typeof left !== 'number' || typeof right !== 'number') {
|
|
65
|
+
throw new Error('Comparison operators are only supported for numbers');
|
|
66
|
+
}
|
|
67
|
+
switch (operator) {
|
|
68
|
+
case '<':
|
|
69
|
+
return left < right;
|
|
70
|
+
case '<=':
|
|
71
|
+
return left <= right;
|
|
72
|
+
case '>':
|
|
73
|
+
return left > right;
|
|
74
|
+
case '>=':
|
|
75
|
+
return left >= right;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
equality(operator, left, right) {
|
|
79
|
+
switch (operator) {
|
|
80
|
+
case '==':
|
|
81
|
+
// eslint-disable-next-line eqeqeq
|
|
82
|
+
return left == right;
|
|
83
|
+
case '!=':
|
|
84
|
+
// eslint-disable-next-line eqeqeq
|
|
85
|
+
return left != right;
|
|
86
|
+
case '===':
|
|
87
|
+
return left === right;
|
|
88
|
+
case '!==':
|
|
89
|
+
return left !== right;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
checkIn(left, right) {
|
|
93
|
+
if (!Array.isArray(right)) {
|
|
94
|
+
throw new Error('The "in" operator is only supported for arrays');
|
|
95
|
+
}
|
|
96
|
+
return right.includes(left);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { AnyNode, CallExpression } from 'acorn';
|
|
2
|
+
import Context from '../../Context';
|
|
3
|
+
import Node from '../Node';
|
|
4
|
+
export default class CallExpressionNode extends Node<CallExpression> {
|
|
5
|
+
constructor(node: AnyNode, context: Context);
|
|
6
|
+
run(): unknown;
|
|
7
|
+
private spreadArgs;
|
|
8
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import Node from '../Node';
|
|
2
|
+
import { construct } from '../../utils';
|
|
3
|
+
export default class CallExpressionNode extends Node {
|
|
4
|
+
constructor(node, context) {
|
|
5
|
+
super(node, context, 'CallExpression');
|
|
6
|
+
}
|
|
7
|
+
run() {
|
|
8
|
+
if (!this.context.isFunctionCallAllowed)
|
|
9
|
+
throw new Error('Function calls are not allowed');
|
|
10
|
+
const callee = construct(this.node.callee, this.context).run();
|
|
11
|
+
let thisArg = {};
|
|
12
|
+
if (this.node.callee.type === 'MemberExpression') {
|
|
13
|
+
thisArg = construct(this.node.callee.object, this.context).run();
|
|
14
|
+
}
|
|
15
|
+
if (typeof callee !== 'function') {
|
|
16
|
+
throw new Error('callee is not a function');
|
|
17
|
+
}
|
|
18
|
+
const args = this.spreadArgs(this.node.arguments);
|
|
19
|
+
return callee.call(thisArg, ...args);
|
|
20
|
+
}
|
|
21
|
+
spreadArgs(args) {
|
|
22
|
+
return args.reduce((acc, arg) => {
|
|
23
|
+
if (arg.type === 'SpreadElement') {
|
|
24
|
+
acc.push(...construct(arg.argument, this.context).run());
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
acc.push(construct(arg, this.context).run());
|
|
28
|
+
}
|
|
29
|
+
return acc;
|
|
30
|
+
}, []);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { AnyNode, ChainExpression } from 'acorn';
|
|
2
|
+
import Context from '../../Context';
|
|
3
|
+
import Node from '../Node';
|
|
4
|
+
/**
|
|
5
|
+
* A ChainExpression node is created when the chain operator is used.
|
|
6
|
+
*
|
|
7
|
+
* e.g. `a?.b?.c`
|
|
8
|
+
*
|
|
9
|
+
* This node does not need to do anything special, as the chain operator is handled by the MemberExpressionNode.
|
|
10
|
+
*
|
|
11
|
+
* @see MemberExpressionNode
|
|
12
|
+
*/
|
|
13
|
+
export default class ExpressionStatementNode extends Node<ChainExpression> {
|
|
14
|
+
constructor(node: AnyNode, context: Context);
|
|
15
|
+
run(): unknown;
|
|
16
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import Node from '../Node';
|
|
2
|
+
import { construct } from '../../utils';
|
|
3
|
+
/**
|
|
4
|
+
* A ChainExpression node is created when the chain operator is used.
|
|
5
|
+
*
|
|
6
|
+
* e.g. `a?.b?.c`
|
|
7
|
+
*
|
|
8
|
+
* This node does not need to do anything special, as the chain operator is handled by the MemberExpressionNode.
|
|
9
|
+
*
|
|
10
|
+
* @see MemberExpressionNode
|
|
11
|
+
*/
|
|
12
|
+
export default class ExpressionStatementNode extends Node {
|
|
13
|
+
constructor(node, context) {
|
|
14
|
+
super(node, context, 'ChainExpression');
|
|
15
|
+
}
|
|
16
|
+
run() {
|
|
17
|
+
return construct(this.node.expression, this.context).run();
|
|
18
|
+
}
|
|
19
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { AnyNode, ConditionalExpression, IfStatement } from 'acorn';
|
|
2
|
+
import type Context from '../../Context';
|
|
3
|
+
import Node from '../Node';
|
|
4
|
+
/** Represents a ternary conditional expression (a ? b : c) or an if statement (if (a) b else c).
|
|
5
|
+
*
|
|
6
|
+
* If a (test) is truthy, b (consequent) is returned. Otherwise, c (alternate) is returned.
|
|
7
|
+
*
|
|
8
|
+
* Since the if statement and the conditional expression are so similar, they are both handled by this node,
|
|
9
|
+
* even though they are separate in the AST.
|
|
10
|
+
*/
|
|
11
|
+
export default class ConditionalExpressionNode extends Node<IfStatement | ConditionalExpression> {
|
|
12
|
+
constructor(node: AnyNode, context: Context);
|
|
13
|
+
run(): unknown;
|
|
14
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import Node from '../Node';
|
|
2
|
+
import { construct } from '../../utils';
|
|
3
|
+
/** Represents a ternary conditional expression (a ? b : c) or an if statement (if (a) b else c).
|
|
4
|
+
*
|
|
5
|
+
* If a (test) is truthy, b (consequent) is returned. Otherwise, c (alternate) is returned.
|
|
6
|
+
*
|
|
7
|
+
* Since the if statement and the conditional expression are so similar, they are both handled by this node,
|
|
8
|
+
* even though they are separate in the AST.
|
|
9
|
+
*/
|
|
10
|
+
export default class ConditionalExpressionNode extends Node {
|
|
11
|
+
constructor(node, context) {
|
|
12
|
+
super(node, context, ['ConditionalExpression', 'IfStatement']);
|
|
13
|
+
}
|
|
14
|
+
run() {
|
|
15
|
+
const test = construct(this.node.test, this.context).run();
|
|
16
|
+
if (test) {
|
|
17
|
+
return construct(this.node.consequent, this.context).run();
|
|
18
|
+
}
|
|
19
|
+
if (this.node.alternate === null || this.node.alternate === undefined) {
|
|
20
|
+
return undefined;
|
|
21
|
+
}
|
|
22
|
+
return construct(this.node.alternate, this.context).run();
|
|
23
|
+
}
|
|
24
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { AnyNode, ExpressionStatement } from 'acorn';
|
|
2
|
+
import Context from '../../Context';
|
|
3
|
+
import Node from '../Node';
|
|
4
|
+
export default class ExpressionStatementNode extends Node<ExpressionStatement> {
|
|
5
|
+
constructor(node: AnyNode, context: Context);
|
|
6
|
+
run(): unknown;
|
|
7
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import Node from '../Node';
|
|
2
|
+
import { construct } from '../../utils';
|
|
3
|
+
export default class ExpressionStatementNode extends Node {
|
|
4
|
+
constructor(node, context) {
|
|
5
|
+
super(node, context, 'ExpressionStatement');
|
|
6
|
+
}
|
|
7
|
+
run() {
|
|
8
|
+
if (this.node.directive)
|
|
9
|
+
throw new Error('Directives are not supported');
|
|
10
|
+
return construct(this.node.expression, this.context).run();
|
|
11
|
+
}
|
|
12
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { AnyNode, LogicalExpression } from 'acorn';
|
|
2
|
+
import Context from '../../Context';
|
|
3
|
+
import Node from '../Node';
|
|
4
|
+
export default class BinaryExpressionNode extends Node<LogicalExpression> {
|
|
5
|
+
constructor(node: AnyNode, context: Context);
|
|
6
|
+
run(): unknown;
|
|
7
|
+
/** Try and skip evaluating the right operand */
|
|
8
|
+
private shortCircuit;
|
|
9
|
+
private operate;
|
|
10
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import Node from '../Node';
|
|
2
|
+
import { construct } from '../../utils';
|
|
3
|
+
export default class BinaryExpressionNode extends Node {
|
|
4
|
+
constructor(node, context) {
|
|
5
|
+
super(node, context, 'LogicalExpression');
|
|
6
|
+
}
|
|
7
|
+
run() {
|
|
8
|
+
const left = construct(this.node.left, this.context).run();
|
|
9
|
+
const shortCircuit = this.shortCircuit(left);
|
|
10
|
+
if (shortCircuit !== null) {
|
|
11
|
+
return shortCircuit;
|
|
12
|
+
}
|
|
13
|
+
const right = construct(this.node.right, this.context).run();
|
|
14
|
+
return this.operate(left, right);
|
|
15
|
+
}
|
|
16
|
+
/** Try and skip evaluating the right operand */
|
|
17
|
+
shortCircuit(left) {
|
|
18
|
+
if (this.node.operator === '&&' && !left) {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
if (this.node.operator === '||' && left) {
|
|
22
|
+
return true;
|
|
23
|
+
}
|
|
24
|
+
if (this.node.operator === '??' && left !== null && left !== undefined) {
|
|
25
|
+
return left;
|
|
26
|
+
}
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
operate(left, right) {
|
|
30
|
+
switch (this.node.operator) {
|
|
31
|
+
case '||':
|
|
32
|
+
return left || right;
|
|
33
|
+
case '&&':
|
|
34
|
+
return left && right;
|
|
35
|
+
case '??':
|
|
36
|
+
return left ?? right;
|
|
37
|
+
default:
|
|
38
|
+
throw new Error(`Unsupported operator: ${this.node.operator}`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { AnyNode, MemberExpression } from 'acorn';
|
|
2
|
+
import Context from '../../Context';
|
|
3
|
+
import Node from '../Node';
|
|
4
|
+
/**
|
|
5
|
+
* A member expression is an expression that accesses a property of an object.
|
|
6
|
+
*
|
|
7
|
+
* Examples of member expressions are:
|
|
8
|
+
* - `a.b`
|
|
9
|
+
* - `a['b']`
|
|
10
|
+
* - `a[0]`
|
|
11
|
+
* - `a?.b`
|
|
12
|
+
* - `a?.['b']`
|
|
13
|
+
* - `a?.[0]`
|
|
14
|
+
*
|
|
15
|
+
* A member access in the sandbox is considered secure if the following conditions are met:
|
|
16
|
+
* - The property is not named 'constructor'
|
|
17
|
+
* - Either:
|
|
18
|
+
* * The property is owned by the object and is *not* on the whitelist.
|
|
19
|
+
* * The prototype is whitelisted and the property list is null or contains the property.
|
|
20
|
+
*
|
|
21
|
+
* @see Context.isPrototypeAllowed
|
|
22
|
+
*/
|
|
23
|
+
export default class MemberExpressionNode extends Node<MemberExpression> {
|
|
24
|
+
constructor(node: AnyNode, context: Context);
|
|
25
|
+
run(): unknown;
|
|
26
|
+
/** Returns the name of the property being accessed.
|
|
27
|
+
*
|
|
28
|
+
* Handles both computed and non-computed properties.
|
|
29
|
+
*/
|
|
30
|
+
private getPropertyIdentifier;
|
|
31
|
+
/** Checks if the property can be accessed on the object.
|
|
32
|
+
*
|
|
33
|
+
* @throws {Error} If the property is not allowed to be accessed.
|
|
34
|
+
*/
|
|
35
|
+
private checkPropertyAccess;
|
|
36
|
+
/** Searches the prototype chain of the object for the prototype that defines the property. */
|
|
37
|
+
private getPropertyPrototype;
|
|
38
|
+
/**
|
|
39
|
+
* Returns true if the property exists on the object.
|
|
40
|
+
*
|
|
41
|
+
* i.e. the property is defined somewhere on the prototype chain.
|
|
42
|
+
*/
|
|
43
|
+
private propertyExists;
|
|
44
|
+
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import Node from '../Node';
|
|
2
|
+
import { construct } from '../../utils';
|
|
3
|
+
/**
|
|
4
|
+
* A member expression is an expression that accesses a property of an object.
|
|
5
|
+
*
|
|
6
|
+
* Examples of member expressions are:
|
|
7
|
+
* - `a.b`
|
|
8
|
+
* - `a['b']`
|
|
9
|
+
* - `a[0]`
|
|
10
|
+
* - `a?.b`
|
|
11
|
+
* - `a?.['b']`
|
|
12
|
+
* - `a?.[0]`
|
|
13
|
+
*
|
|
14
|
+
* A member access in the sandbox is considered secure if the following conditions are met:
|
|
15
|
+
* - The property is not named 'constructor'
|
|
16
|
+
* - Either:
|
|
17
|
+
* * The property is owned by the object and is *not* on the whitelist.
|
|
18
|
+
* * The prototype is whitelisted and the property list is null or contains the property.
|
|
19
|
+
*
|
|
20
|
+
* @see Context.isPrototypeAllowed
|
|
21
|
+
*/
|
|
22
|
+
export default class MemberExpressionNode extends Node {
|
|
23
|
+
constructor(node, context) {
|
|
24
|
+
super(node, context, 'MemberExpression');
|
|
25
|
+
}
|
|
26
|
+
run() {
|
|
27
|
+
const object = construct(this.node.object, this.context).run();
|
|
28
|
+
if (object === null || object === undefined) {
|
|
29
|
+
if (this.node.optional)
|
|
30
|
+
return undefined;
|
|
31
|
+
throw new Error(`Cannot read property of ${object}`);
|
|
32
|
+
}
|
|
33
|
+
const propertyIdentifier = this.getPropertyIdentifier();
|
|
34
|
+
if (!this.propertyExists(object, propertyIdentifier)) {
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
this.checkPropertyAccess(object, propertyIdentifier);
|
|
38
|
+
return object[propertyIdentifier];
|
|
39
|
+
}
|
|
40
|
+
/** Returns the name of the property being accessed.
|
|
41
|
+
*
|
|
42
|
+
* Handles both computed and non-computed properties.
|
|
43
|
+
*/
|
|
44
|
+
getPropertyIdentifier() {
|
|
45
|
+
if (this.node.computed) {
|
|
46
|
+
const name = construct(this.node.property, this.context).run();
|
|
47
|
+
if (typeof name !== 'string' && typeof name !== 'number') {
|
|
48
|
+
throw new Error('Only string or number computed properties are supported');
|
|
49
|
+
}
|
|
50
|
+
return name;
|
|
51
|
+
}
|
|
52
|
+
if (this.node.property.type !== 'Identifier') {
|
|
53
|
+
throw new Error('Only identifiers are supported for non-computed member expression properties');
|
|
54
|
+
}
|
|
55
|
+
return this.node.property.name;
|
|
56
|
+
}
|
|
57
|
+
/** Checks if the property can be accessed on the object.
|
|
58
|
+
*
|
|
59
|
+
* @throws {Error} If the property is not allowed to be accessed.
|
|
60
|
+
*/
|
|
61
|
+
checkPropertyAccess(object, propertyIdentifier) {
|
|
62
|
+
if (typeof propertyIdentifier === 'number')
|
|
63
|
+
return;
|
|
64
|
+
if (propertyIdentifier === 'constructor') {
|
|
65
|
+
throw new Error('Cannot access constructor property');
|
|
66
|
+
}
|
|
67
|
+
const definingProto = this.getPropertyPrototype(object, propertyIdentifier);
|
|
68
|
+
const ownProperty = Object.prototype.hasOwnProperty.call(object, propertyIdentifier);
|
|
69
|
+
if (!this.context.isPrototypeAllowed(definingProto, propertyIdentifier, ownProperty)) {
|
|
70
|
+
throw new Error(`SecurityError: Access to property '${propertyIdentifier}' is not allowed`);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/** Searches the prototype chain of the object for the prototype that defines the property. */
|
|
74
|
+
getPropertyPrototype(object, propertyIdentifier) {
|
|
75
|
+
let proto = object;
|
|
76
|
+
while (proto !== null) {
|
|
77
|
+
if (Object.prototype.hasOwnProperty.call(proto, propertyIdentifier)) {
|
|
78
|
+
return proto;
|
|
79
|
+
}
|
|
80
|
+
proto = Object.getPrototypeOf(proto);
|
|
81
|
+
}
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Returns true if the property exists on the object.
|
|
86
|
+
*
|
|
87
|
+
* i.e. the property is defined somewhere on the prototype chain.
|
|
88
|
+
*/
|
|
89
|
+
propertyExists(object, propertyIdentifier) {
|
|
90
|
+
return this.getPropertyPrototype(object, propertyIdentifier) !== null;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { AnyNode, ObjectExpression } from 'acorn';
|
|
2
|
+
import type Context from '../../Context';
|
|
3
|
+
import Node from '../Node';
|
|
4
|
+
export default class ObjectExpressionNode extends Node<ObjectExpression> {
|
|
5
|
+
constructor(node: AnyNode, context: Context);
|
|
6
|
+
run(): unknown;
|
|
7
|
+
private addProperty;
|
|
8
|
+
private spreadProperty;
|
|
9
|
+
private getKey;
|
|
10
|
+
private getStaticKey;
|
|
11
|
+
}
|