serverless-spy 0.0.9 → 0.0.10
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/.jsii +5 -2
- package/cli/cli.ts +1 -1
- package/cli/node_modules/ws/LICENSE +19 -0
- package/cli/node_modules/ws/README.md +495 -0
- package/cli/node_modules/ws/browser.js +8 -0
- package/cli/node_modules/ws/index.js +13 -0
- package/cli/node_modules/ws/lib/buffer-util.js +127 -0
- package/cli/node_modules/ws/lib/constants.js +12 -0
- package/cli/node_modules/ws/lib/event-target.js +266 -0
- package/cli/node_modules/ws/lib/extension.js +203 -0
- package/cli/node_modules/ws/lib/limiter.js +55 -0
- package/cli/node_modules/ws/lib/permessage-deflate.js +511 -0
- package/cli/node_modules/ws/lib/receiver.js +618 -0
- package/cli/node_modules/ws/lib/sender.js +478 -0
- package/cli/node_modules/ws/lib/stream.js +159 -0
- package/cli/node_modules/ws/lib/subprotocol.js +62 -0
- package/cli/node_modules/ws/lib/validation.js +125 -0
- package/cli/node_modules/ws/lib/websocket-server.js +535 -0
- package/cli/node_modules/ws/lib/websocket.js +1305 -0
- package/cli/node_modules/ws/package.json +61 -0
- package/cli/node_modules/ws/wrapper.mjs +8 -0
- package/cli/ws.ts +1 -1
- package/lib/cjs/cli/cli.d.ts +1 -0
- package/lib/cjs/cli/cli.js +87 -0
- package/lib/cjs/cli/ws.d.ts +1 -0
- package/lib/cjs/cli/ws.js +68 -0
- package/lib/cjs/common/getWebSocketUrl.d.ts +2 -0
- package/lib/cjs/common/getWebSocketUrl.js +57 -0
- package/lib/cjs/index.d.ts +2 -0
- package/lib/cjs/index.js +19 -0
- package/lib/cjs/listener/PrettifyForDisplay.d.ts +3 -0
- package/lib/cjs/listener/PrettifyForDisplay.js +3 -0
- package/lib/cjs/listener/RecursivePartial.d.ts +4 -0
- package/lib/cjs/listener/RecursivePartial.js +3 -0
- package/lib/cjs/listener/SpyHandlers.ts.d.ts +109 -0
- package/lib/cjs/listener/SpyHandlers.ts.js +3 -0
- package/lib/cjs/listener/SpyListener.d.ts +40 -0
- package/lib/cjs/listener/SpyListener.js +3 -0
- package/lib/cjs/listener/createServerlessSpyListener.d.ts +13 -0
- package/lib/cjs/listener/createServerlessSpyListener.js +167 -0
- package/lib/cjs/listener/index.d.ts +2 -0
- package/lib/cjs/listener/index.js +19 -0
- package/lib/cjs/listener/matchers.d.ts +0 -0
- package/lib/cjs/listener/matchers.js +55 -0
- package/lib/cjs/listener/setup.d.ts +0 -0
- package/lib/cjs/listener/setup.js +21 -0
- package/lib/{ServerlessSpy.d.ts → cjs/src/ServerlessSpy.d.ts} +0 -0
- package/lib/{ServerlessSpy.js → cjs/src/ServerlessSpy.js} +1 -1
- package/lib/{index.d.ts → cjs/src/index.d.ts} +0 -0
- package/lib/{index.js → cjs/src/index.js} +0 -0
- package/lib/mjs/cli/cli.d.ts +1 -0
- package/lib/mjs/cli/cli.js +85 -0
- package/lib/mjs/cli/ws.d.ts +1 -0
- package/lib/mjs/cli/ws.js +66 -0
- package/lib/mjs/common/getWebSocketUrl.d.ts +2 -0
- package/lib/mjs/common/getWebSocketUrl.js +53 -0
- package/lib/mjs/index.d.ts +2 -0
- package/lib/mjs/index.js +3 -0
- package/lib/mjs/listener/PrettifyForDisplay.d.ts +3 -0
- package/lib/mjs/listener/PrettifyForDisplay.js +2 -0
- package/lib/mjs/listener/RecursivePartial.d.ts +4 -0
- package/lib/mjs/listener/RecursivePartial.js +2 -0
- package/lib/mjs/listener/SpyHandlers.ts.d.ts +109 -0
- package/lib/mjs/listener/SpyHandlers.ts.js +2 -0
- package/lib/mjs/listener/SpyListener.d.ts +40 -0
- package/lib/mjs/listener/SpyListener.js +2 -0
- package/lib/mjs/listener/createServerlessSpyListener.d.ts +13 -0
- package/lib/mjs/listener/createServerlessSpyListener.js +163 -0
- package/lib/mjs/listener/index.d.ts +2 -0
- package/lib/mjs/listener/index.js +3 -0
- package/lib/mjs/listener/matchers.d.ts +0 -0
- package/lib/mjs/listener/matchers.js +55 -0
- package/lib/mjs/listener/setup.d.ts +0 -0
- package/lib/mjs/listener/setup.js +21 -0
- package/lib/mjs/src/ServerlessSpy.d.ts +27 -0
- package/lib/mjs/src/ServerlessSpy.js +293 -0
- package/lib/mjs/src/index.d.ts +1 -0
- package/lib/mjs/src/index.js +2 -0
- package/listener/node_modules/ws/LICENSE +19 -0
- package/listener/node_modules/ws/README.md +495 -0
- package/listener/node_modules/ws/browser.js +8 -0
- package/listener/node_modules/ws/index.js +13 -0
- package/listener/node_modules/ws/lib/buffer-util.js +127 -0
- package/listener/node_modules/ws/lib/constants.js +12 -0
- package/listener/node_modules/ws/lib/event-target.js +266 -0
- package/listener/node_modules/ws/lib/extension.js +203 -0
- package/listener/node_modules/ws/lib/limiter.js +55 -0
- package/listener/node_modules/ws/lib/permessage-deflate.js +511 -0
- package/listener/node_modules/ws/lib/receiver.js +618 -0
- package/listener/node_modules/ws/lib/sender.js +478 -0
- package/listener/node_modules/ws/lib/stream.js +159 -0
- package/listener/node_modules/ws/lib/subprotocol.js +62 -0
- package/listener/node_modules/ws/lib/validation.js +125 -0
- package/listener/node_modules/ws/lib/websocket-server.js +535 -0
- package/listener/node_modules/ws/lib/websocket.js +1305 -0
- package/listener/node_modules/ws/package.json +61 -0
- package/listener/node_modules/ws/wrapper.mjs +8 -0
- package/node_modules/@aws-crypto/crc32/node_modules/tslib/package.json +1 -5
- package/node_modules/@aws-crypto/crc32/package.json +1 -5
- package/node_modules/@aws-crypto/crc32c/node_modules/tslib/package.json +1 -5
- package/node_modules/@aws-crypto/crc32c/package.json +1 -5
- package/node_modules/@aws-crypto/ie11-detection/node_modules/tslib/package.json +1 -5
- package/node_modules/@aws-crypto/ie11-detection/package.json +1 -5
- package/node_modules/@aws-crypto/sha1-browser/node_modules/tslib/package.json +1 -5
- package/node_modules/@aws-crypto/sha1-browser/package.json +1 -5
- package/node_modules/@aws-crypto/sha256-browser/node_modules/tslib/package.json +1 -5
- package/node_modules/@aws-crypto/sha256-browser/package.json +1 -5
- package/node_modules/@aws-crypto/sha256-js/node_modules/tslib/package.json +1 -5
- package/node_modules/@aws-crypto/sha256-js/package.json +1 -5
- package/node_modules/@aws-crypto/supports-web-crypto/node_modules/tslib/package.json +1 -5
- package/node_modules/@aws-crypto/supports-web-crypto/package.json +1 -5
- package/node_modules/@aws-crypto/util/node_modules/tslib/package.json +1 -5
- package/node_modules/@aws-crypto/util/package.json +1 -5
- package/node_modules/@aws-sdk/abort-controller/package.json +1 -5
- package/node_modules/@aws-sdk/chunked-blob-reader/package.json +1 -5
- package/node_modules/@aws-sdk/chunked-blob-reader-native/package.json +1 -5
- package/node_modules/@aws-sdk/client-apigatewaymanagementapi/package.json +1 -5
- package/node_modules/@aws-sdk/client-cognito-identity/package.json +1 -5
- package/node_modules/@aws-sdk/client-dynamodb/package.json +1 -5
- package/node_modules/@aws-sdk/client-eventbridge/package.json +1 -5
- package/node_modules/@aws-sdk/client-lambda/package.json +1 -5
- package/node_modules/@aws-sdk/client-s3/node_modules/entities/package.json +1 -5
- package/node_modules/@aws-sdk/client-s3/package.json +1 -5
- package/node_modules/@aws-sdk/client-sns/node_modules/entities/package.json +1 -5
- package/node_modules/@aws-sdk/client-sns/package.json +1 -5
- package/node_modules/@aws-sdk/client-sqs/node_modules/entities/package.json +1 -5
- package/node_modules/@aws-sdk/client-sqs/package.json +1 -5
- package/node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/abort-controller/package.json +1 -5
- package/node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/client-sso/package.json +1 -5
- package/node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/client-sts/package.json +1 -5
- package/node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/config-resolver/package.json +1 -5
- package/node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/credential-provider-env/package.json +1 -5
- package/node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/credential-provider-imds/package.json +1 -5
- package/node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/credential-provider-ini/package.json +1 -5
- package/node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/credential-provider-node/package.json +1 -5
- package/node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/credential-provider-process/package.json +1 -5
- package/node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/credential-provider-sso/package.json +1 -5
- package/node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/credential-provider-web-identity/package.json +1 -5
- package/node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/fetch-http-handler/package.json +1 -5
- package/node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/hash-node/package.json +1 -5
- package/node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/invalid-dependency/package.json +1 -5
- package/node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/is-array-buffer/package.json +1 -5
- package/node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/middleware-content-length/package.json +1 -5
- package/node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/middleware-host-header/package.json +1 -5
- package/node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/middleware-logger/package.json +1 -5
- package/node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/middleware-retry/package.json +1 -5
- package/node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/middleware-sdk-sts/package.json +1 -5
- package/node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/middleware-serde/package.json +1 -5
- package/node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/middleware-signing/package.json +1 -5
- package/node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/middleware-stack/package.json +1 -5
- package/node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/middleware-user-agent/package.json +1 -5
- package/node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/node-config-provider/package.json +1 -5
- package/node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/node-http-handler/package.json +1 -5
- package/node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/property-provider/package.json +1 -5
- package/node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/protocol-http/package.json +1 -5
- package/node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/querystring-builder/package.json +1 -5
- package/node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/querystring-parser/package.json +1 -5
- package/node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/service-error-classification/package.json +1 -5
- package/node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/shared-ini-file-loader/package.json +1 -5
- package/node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/signature-v4/package.json +1 -5
- package/node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/smithy-client/package.json +1 -5
- package/node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/types/package.json +1 -5
- package/node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/url-parser/package.json +1 -5
- package/node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/util-base64-browser/package.json +1 -5
- package/node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/util-base64-node/package.json +1 -5
- package/node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/util-body-length-browser/package.json +1 -5
- package/node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/util-body-length-node/package.json +1 -5
- package/node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/util-buffer-from/package.json +1 -5
- package/node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/util-config-provider/package.json +1 -5
- package/node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/util-hex-encoding/package.json +1 -5
- package/node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/util-uri-escape/package.json +1 -5
- package/node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/util-user-agent-browser/package.json +1 -5
- package/node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/util-user-agent-node/package.json +1 -5
- package/node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/util-utf8-browser/package.json +1 -5
- package/node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/util-utf8-node/package.json +1 -5
- package/node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/util-waiter/package.json +1 -5
- package/node_modules/@aws-sdk/client-ssm/node_modules/entities/package.json +1 -5
- package/node_modules/@aws-sdk/client-ssm/package.json +1 -5
- package/node_modules/@aws-sdk/client-sso/package.json +1 -5
- package/node_modules/@aws-sdk/client-sts/node_modules/entities/package.json +1 -5
- package/node_modules/@aws-sdk/client-sts/package.json +1 -5
- package/node_modules/@aws-sdk/config-resolver/package.json +1 -5
- package/node_modules/@aws-sdk/credential-provider-cognito-identity/package.json +1 -5
- package/node_modules/@aws-sdk/credential-provider-env/package.json +1 -5
- package/node_modules/@aws-sdk/credential-provider-imds/package.json +1 -5
- package/node_modules/@aws-sdk/credential-provider-ini/package.json +1 -5
- package/node_modules/@aws-sdk/credential-provider-node/package.json +1 -5
- package/node_modules/@aws-sdk/credential-provider-process/package.json +1 -5
- package/node_modules/@aws-sdk/credential-provider-sso/package.json +1 -5
- package/node_modules/@aws-sdk/credential-provider-web-identity/package.json +1 -5
- package/node_modules/@aws-sdk/credential-providers/package.json +1 -5
- package/node_modules/@aws-sdk/endpoint-cache/package.json +1 -5
- package/node_modules/@aws-sdk/eventstream-codec/package.json +1 -5
- package/node_modules/@aws-sdk/eventstream-serde-browser/package.json +1 -5
- package/node_modules/@aws-sdk/eventstream-serde-config-resolver/package.json +1 -5
- package/node_modules/@aws-sdk/eventstream-serde-node/package.json +1 -5
- package/node_modules/@aws-sdk/eventstream-serde-universal/package.json +1 -5
- package/node_modules/@aws-sdk/fetch-http-handler/package.json +1 -5
- package/node_modules/@aws-sdk/hash-blob-browser/package.json +1 -5
- package/node_modules/@aws-sdk/hash-node/package.json +1 -5
- package/node_modules/@aws-sdk/hash-stream-node/package.json +1 -5
- package/node_modules/@aws-sdk/invalid-dependency/package.json +1 -5
- package/node_modules/@aws-sdk/is-array-buffer/package.json +1 -5
- package/node_modules/@aws-sdk/lib-dynamodb/package.json +1 -5
- package/node_modules/@aws-sdk/md5-js/package.json +1 -5
- package/node_modules/@aws-sdk/middleware-bucket-endpoint/package.json +1 -5
- package/node_modules/@aws-sdk/middleware-content-length/package.json +1 -5
- package/node_modules/@aws-sdk/middleware-endpoint-discovery/package.json +1 -5
- package/node_modules/@aws-sdk/middleware-expect-continue/package.json +1 -5
- package/node_modules/@aws-sdk/middleware-flexible-checksums/package.json +1 -5
- package/node_modules/@aws-sdk/middleware-host-header/package.json +1 -5
- package/node_modules/@aws-sdk/middleware-location-constraint/package.json +1 -5
- package/node_modules/@aws-sdk/middleware-logger/package.json +1 -5
- package/node_modules/@aws-sdk/middleware-recursion-detection/package.json +1 -5
- package/node_modules/@aws-sdk/middleware-retry/package.json +1 -5
- package/node_modules/@aws-sdk/middleware-sdk-eventbridge/package.json +1 -5
- package/node_modules/@aws-sdk/middleware-sdk-s3/package.json +1 -5
- package/node_modules/@aws-sdk/middleware-sdk-sqs/package.json +1 -5
- package/node_modules/@aws-sdk/middleware-sdk-sts/package.json +1 -5
- package/node_modules/@aws-sdk/middleware-serde/package.json +1 -5
- package/node_modules/@aws-sdk/middleware-signing/package.json +1 -5
- package/node_modules/@aws-sdk/middleware-ssec/package.json +1 -5
- package/node_modules/@aws-sdk/middleware-stack/package.json +1 -5
- package/node_modules/@aws-sdk/middleware-user-agent/package.json +1 -5
- package/node_modules/@aws-sdk/node-config-provider/package.json +1 -5
- package/node_modules/@aws-sdk/node-http-handler/package.json +1 -5
- package/node_modules/@aws-sdk/property-provider/package.json +1 -5
- package/node_modules/@aws-sdk/protocol-http/package.json +1 -5
- package/node_modules/@aws-sdk/querystring-builder/package.json +1 -5
- package/node_modules/@aws-sdk/querystring-parser/package.json +1 -5
- package/node_modules/@aws-sdk/service-error-classification/package.json +1 -5
- package/node_modules/@aws-sdk/shared-ini-file-loader/package.json +1 -5
- package/node_modules/@aws-sdk/signature-v4/package.json +1 -5
- package/node_modules/@aws-sdk/signature-v4-multi-region/package.json +1 -5
- package/node_modules/@aws-sdk/smithy-client/package.json +1 -5
- package/node_modules/@aws-sdk/types/package.json +1 -5
- package/node_modules/@aws-sdk/url-parser/package.json +1 -5
- package/node_modules/@aws-sdk/util-arn-parser/package.json +1 -5
- package/node_modules/@aws-sdk/util-base64-browser/package.json +1 -5
- package/node_modules/@aws-sdk/util-base64-node/package.json +1 -5
- package/node_modules/@aws-sdk/util-body-length-browser/package.json +1 -5
- package/node_modules/@aws-sdk/util-body-length-node/package.json +1 -5
- package/node_modules/@aws-sdk/util-buffer-from/package.json +1 -5
- package/node_modules/@aws-sdk/util-config-provider/package.json +1 -5
- package/node_modules/@aws-sdk/util-credentials/node_modules/@aws-sdk/shared-ini-file-loader/package.json +1 -5
- package/node_modules/@aws-sdk/util-credentials/package.json +1 -5
- package/node_modules/@aws-sdk/util-defaults-mode-browser/package.json +1 -5
- package/node_modules/@aws-sdk/util-defaults-mode-node/package.json +1 -5
- package/node_modules/@aws-sdk/util-dynamodb/package.json +1 -5
- package/node_modules/@aws-sdk/util-hex-encoding/package.json +1 -5
- package/node_modules/@aws-sdk/util-locate-window/package.json +1 -5
- package/node_modules/@aws-sdk/util-middleware/package.json +1 -5
- package/node_modules/@aws-sdk/util-stream-browser/package.json +1 -5
- package/node_modules/@aws-sdk/util-stream-node/package.json +1 -5
- package/node_modules/@aws-sdk/util-uri-escape/package.json +1 -5
- package/node_modules/@aws-sdk/util-user-agent-browser/package.json +1 -5
- package/node_modules/@aws-sdk/util-user-agent-node/package.json +1 -5
- package/node_modules/@aws-sdk/util-utf8-browser/package.json +1 -5
- package/node_modules/@aws-sdk/util-utf8-node/package.json +1 -5
- package/node_modules/@aws-sdk/util-waiter/package.json +1 -5
- package/node_modules/@aws-sdk/xml-builder/package.json +1 -5
- package/node_modules/@graphql-tools/merge/package.json +0 -4
- package/node_modules/@graphql-tools/schema/package.json +0 -4
- package/node_modules/@graphql-tools/utils/package.json +0 -4
- package/node_modules/@serverless-stack/node/package.json +1 -5
- package/node_modules/@tsconfig/node14/package.json +1 -5
- package/node_modules/available-typed-arrays/package.json +1 -5
- package/node_modules/aws-jwt-verify/package.json +1 -5
- package/node_modules/aws-lambda/node_modules/argparse/package.json +1 -5
- package/node_modules/aws-lambda/node_modules/commander/package.json +1 -5
- package/node_modules/aws-lambda/node_modules/js-yaml/package.json +1 -5
- package/node_modules/aws-lambda/package.json +1 -5
- package/node_modules/aws-sdk/node_modules/uuid/package.json +1 -5
- package/node_modules/aws-sdk/package.json +0 -4
- package/node_modules/aws4/package.json +1 -5
- package/node_modules/base64-js/package.json +1 -5
- package/node_modules/bowser/package.json +1 -5
- package/node_modules/buffer/package.json +1 -5
- package/node_modules/call-bind/package.json +1 -5
- package/node_modules/define-properties/package.json +1 -5
- package/node_modules/es-abstract/package.json +1 -5
- package/node_modules/es-to-primitive/package.json +1 -5
- package/node_modules/esprima/package.json +1 -5
- package/node_modules/events/package.json +0 -4
- package/node_modules/fast-xml-parser/package.json +1 -5
- package/node_modules/for-each/package.json +1 -5
- package/node_modules/function-bind/package.json +1 -5
- package/node_modules/function.prototype.name/package.json +1 -5
- package/node_modules/functions-have-names/package.json +1 -5
- package/node_modules/get-intrinsic/package.json +1 -5
- package/node_modules/get-symbol-description/package.json +1 -5
- package/node_modules/glob-to-regexp/package.json +1 -5
- package/node_modules/graceful-fs/package.json +1 -5
- package/node_modules/graphql/package.json +1 -5
- package/node_modules/graphql-helix/package.json +1 -5
- package/node_modules/has/package.json +1 -5
- package/node_modules/has-bigints/package.json +1 -5
- package/node_modules/has-property-descriptors/package.json +1 -5
- package/node_modules/has-symbols/package.json +1 -5
- package/node_modules/has-tostringtag/package.json +1 -5
- package/node_modules/ieee754/package.json +1 -5
- package/node_modules/inherits/package.json +1 -5
- package/node_modules/internal-slot/package.json +1 -5
- package/node_modules/is-arguments/package.json +1 -5
- package/node_modules/is-bigint/package.json +1 -5
- package/node_modules/is-boolean-object/package.json +1 -5
- package/node_modules/is-callable/package.json +1 -5
- package/node_modules/is-date-object/package.json +1 -5
- package/node_modules/is-generator-function/package.json +1 -5
- package/node_modules/is-negative-zero/package.json +1 -5
- package/node_modules/is-number-object/package.json +1 -5
- package/node_modules/is-regex/package.json +1 -5
- package/node_modules/is-shared-array-buffer/package.json +1 -5
- package/node_modules/is-string/package.json +1 -5
- package/node_modules/is-symbol/package.json +1 -5
- package/node_modules/is-typed-array/package.json +1 -5
- package/node_modules/is-weakref/package.json +1 -5
- package/node_modules/isarray/package.json +1 -5
- package/node_modules/jmespath/package.json +1 -5
- package/node_modules/mnemonist/package.json +1 -5
- package/node_modules/object-inspect/package.json +1 -5
- package/node_modules/object-keys/package.json +1 -5
- package/node_modules/object.assign/package.json +1 -5
- package/node_modules/obliterator/package.json +1 -5
- package/node_modules/querystring/package.json +1 -5
- package/node_modules/regexp.prototype.flags/package.json +1 -5
- package/node_modules/safe-buffer/package.json +1 -5
- package/node_modules/sax/package.json +1 -5
- package/node_modules/side-channel/package.json +1 -5
- package/node_modules/sprintf-js/package.json +1 -5
- package/node_modules/string.prototype.trimend/package.json +1 -5
- package/node_modules/string.prototype.trimstart/package.json +1 -5
- package/node_modules/tslib/package.json +1 -5
- package/node_modules/unbox-primitive/package.json +1 -5
- package/node_modules/url/node_modules/punycode/package.json +1 -5
- package/node_modules/url/package.json +1 -5
- package/node_modules/util/package.json +1 -5
- package/node_modules/uuid/package.json +1 -5
- package/node_modules/value-or-promise/package.json +1 -5
- package/node_modules/watchpack/package.json +1 -5
- package/node_modules/which-boxed-primitive/package.json +1 -5
- package/node_modules/which-typed-array/package.json +1 -5
- package/node_modules/xml2js/node_modules/xmlbuilder/package.json +1 -5
- package/node_modules/xml2js/package.json +1 -5
- package/package.json +11 -3
- package/tsconfig.npm.json +50 -0
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createServerlessSpyListener = void 0;
|
|
4
|
+
const getWebSocketUrl_1 = require("serverless-spy-common/getWebSocketUrl");
|
|
5
|
+
const ws_1 = require("ws");
|
|
6
|
+
async function createServerlessSpyListener(params) {
|
|
7
|
+
const urlSigned = await (0, getWebSocketUrl_1.getWebSocketUrl)(params.serverlessSpyWsUrl, params.credentials);
|
|
8
|
+
const ws = new ws_1.default(urlSigned);
|
|
9
|
+
const messages = [];
|
|
10
|
+
let trackers = [];
|
|
11
|
+
let closed = false;
|
|
12
|
+
const functionPrefix = 'waitFor';
|
|
13
|
+
let connectionOpenResolve;
|
|
14
|
+
let waitForConnection = new Promise((resolve) => {
|
|
15
|
+
connectionOpenResolve = resolve;
|
|
16
|
+
});
|
|
17
|
+
ws.on('open', () => {
|
|
18
|
+
console.log('connected ' + new Date().toISOString());
|
|
19
|
+
connectionOpenResolve(undefined);
|
|
20
|
+
});
|
|
21
|
+
ws.on('message', (data) => {
|
|
22
|
+
if (closed)
|
|
23
|
+
return;
|
|
24
|
+
console.log(`From server: ${data}`);
|
|
25
|
+
const message = JSON.parse(data.toString());
|
|
26
|
+
message.serviceKeyForFunction = message.serviceKey.replace(/#/g, '');
|
|
27
|
+
if (message.serviceKey.startsWith('Function')) {
|
|
28
|
+
message.functionContextAwsRequestId = message.data.context.awsRequestId;
|
|
29
|
+
}
|
|
30
|
+
messages.push(message);
|
|
31
|
+
resolveOldTrackerWithNewMessage(message);
|
|
32
|
+
});
|
|
33
|
+
ws.on('close', () => {
|
|
34
|
+
closed = true;
|
|
35
|
+
// console.log("disconnected " + new Date().toISOString());
|
|
36
|
+
});
|
|
37
|
+
const trackerMatchMessage = (tracker, message) => {
|
|
38
|
+
if (tracker.finished)
|
|
39
|
+
return;
|
|
40
|
+
if ((tracker.serviceKey && tracker.serviceKey === message.serviceKey) ||
|
|
41
|
+
(tracker.serviceKeyForFunction &&
|
|
42
|
+
tracker.serviceKeyForFunction === message.serviceKeyForFunction)) {
|
|
43
|
+
if (trackerMatchCondition(tracker, message)) {
|
|
44
|
+
tracker.finished = true;
|
|
45
|
+
const spyAndJestMatchers = {
|
|
46
|
+
getData: () => message.data,
|
|
47
|
+
};
|
|
48
|
+
const serviceKeyForFunction = tracker.serviceKeyForFunction;
|
|
49
|
+
if (serviceKeyForFunction &&
|
|
50
|
+
serviceKeyForFunction.startsWith('Function') &&
|
|
51
|
+
(serviceKeyForFunction.endsWith('Request') ||
|
|
52
|
+
serviceKeyForFunction.endsWith('Console'))) {
|
|
53
|
+
let serviceKeyForFunctionResponse = serviceKeyForFunction;
|
|
54
|
+
if (serviceKeyForFunctionResponse.endsWith('Request')) {
|
|
55
|
+
serviceKeyForFunctionResponse =
|
|
56
|
+
serviceKeyForFunctionResponse.substring(0, serviceKeyForFunctionResponse.length - 'Request'.length);
|
|
57
|
+
}
|
|
58
|
+
else if (serviceKeyForFunctionResponse.endsWith('Console')) {
|
|
59
|
+
serviceKeyForFunctionResponse =
|
|
60
|
+
serviceKeyForFunctionResponse.substring(0, serviceKeyForFunctionResponse.length - 'Console'.length);
|
|
61
|
+
}
|
|
62
|
+
serviceKeyForFunctionResponse += 'Response';
|
|
63
|
+
spyAndJestMatchers.followedByResponse = (paramsW) => {
|
|
64
|
+
return createWaitForXXXFunc(serviceKeyForFunctionResponse, paramsW, message.data.context.awsRequestId)();
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
const proxy = new Proxy(spyAndJestMatchers, {
|
|
68
|
+
get: function (target, objectKey) {
|
|
69
|
+
if (target.hasOwnProperty(objectKey)) {
|
|
70
|
+
return target[objectKey];
|
|
71
|
+
}
|
|
72
|
+
else if (objectKey !== 'then') {
|
|
73
|
+
return function () {
|
|
74
|
+
const jestFunctionToExecute = expect(message.data)[objectKey];
|
|
75
|
+
jestFunctionToExecute.apply(undefined, arguments);
|
|
76
|
+
return proxy;
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
},
|
|
80
|
+
});
|
|
81
|
+
tracker.promiseResolve(proxy);
|
|
82
|
+
return true;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return false;
|
|
86
|
+
};
|
|
87
|
+
const resolveTrackerInOldMessages = (tracker) => {
|
|
88
|
+
for (const message of messages) {
|
|
89
|
+
if (trackerMatchMessage(tracker, message)) {
|
|
90
|
+
return true;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return false;
|
|
94
|
+
};
|
|
95
|
+
const resolveOldTrackerWithNewMessage = (message) => {
|
|
96
|
+
for (let index = 0; index < trackers.length; index++) {
|
|
97
|
+
const tracker = trackers[index];
|
|
98
|
+
if (trackerMatchMessage(tracker, message)) {
|
|
99
|
+
trackers = trackers.splice(index, 1);
|
|
100
|
+
return true;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return false;
|
|
104
|
+
};
|
|
105
|
+
const spyListener = {};
|
|
106
|
+
spyListener.stop = () => {
|
|
107
|
+
closed = true;
|
|
108
|
+
ws.close();
|
|
109
|
+
};
|
|
110
|
+
const proxy = new Proxy(spyListener, {
|
|
111
|
+
get: function (target, objectKey) {
|
|
112
|
+
if (target.hasOwnProperty(objectKey)) {
|
|
113
|
+
return target[objectKey];
|
|
114
|
+
}
|
|
115
|
+
else if (typeof objectKey === 'string' &&
|
|
116
|
+
objectKey.startsWith(functionPrefix)) {
|
|
117
|
+
const paramsW = arguments[0];
|
|
118
|
+
const serviceKeyForFunction = objectKey.substring(functionPrefix.length);
|
|
119
|
+
return createWaitForXXXFunc(serviceKeyForFunction, paramsW);
|
|
120
|
+
}
|
|
121
|
+
},
|
|
122
|
+
});
|
|
123
|
+
await waitForConnection;
|
|
124
|
+
return proxy;
|
|
125
|
+
function trackerMatchCondition(tracker, message) {
|
|
126
|
+
const matchCondition = (tracker.condition && tracker.condition(message.data)) ||
|
|
127
|
+
!tracker.condition;
|
|
128
|
+
const matchRequestId = (tracker.functionContextAwsRequestId &&
|
|
129
|
+
tracker.functionContextAwsRequestId ===
|
|
130
|
+
message.functionContextAwsRequestId) ||
|
|
131
|
+
!tracker.functionContextAwsRequestId;
|
|
132
|
+
if (tracker.functionContextAwsRequestId) {
|
|
133
|
+
console.log(`${tracker.functionContextAwsRequestId} - ${message.functionContextAwsRequestId}`);
|
|
134
|
+
}
|
|
135
|
+
return matchCondition && matchRequestId;
|
|
136
|
+
}
|
|
137
|
+
function createWaitForXXXFunc(serviceKeyForFunction, paramsW, functionContextAwsRequestId) {
|
|
138
|
+
let tracker;
|
|
139
|
+
const promise = new Promise((resolve, reject) => {
|
|
140
|
+
tracker = {
|
|
141
|
+
finished: false,
|
|
142
|
+
promiseResolve: resolve,
|
|
143
|
+
promiseReject: reject,
|
|
144
|
+
serviceKeyForFunction,
|
|
145
|
+
functionContextAwsRequestId,
|
|
146
|
+
};
|
|
147
|
+
});
|
|
148
|
+
return function waitForXXXFunc() {
|
|
149
|
+
tracker.condition = paramsW?.condition;
|
|
150
|
+
const timer = setTimeout(() => {
|
|
151
|
+
if (tracker.finished)
|
|
152
|
+
return;
|
|
153
|
+
tracker.finished = true;
|
|
154
|
+
tracker.promiseReject(new Error(`Timeout waiting for Serverless Spy message ${serviceKeyForFunction}`));
|
|
155
|
+
}, paramsW?.timoutMs || 10000);
|
|
156
|
+
promise.finally(() => {
|
|
157
|
+
clearTimeout(timer);
|
|
158
|
+
});
|
|
159
|
+
if (!resolveTrackerInOldMessages(tracker)) {
|
|
160
|
+
trackers.push(tracker);
|
|
161
|
+
}
|
|
162
|
+
return promise;
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
exports.createServerlessSpyListener = createServerlessSpyListener;
|
|
167
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlU2VydmVybGVzc1NweUxpc3RlbmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vbGlzdGVuZXIvY3JlYXRlU2VydmVybGVzc1NweUxpc3RlbmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVBLDJFQUF3RTtBQUl4RSwyQkFBMkI7QUFRcEIsS0FBSyxVQUFVLDJCQUEyQixDQUMvQyxNQUFtQztJQUVuQyxNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUEsaUNBQWUsRUFDckMsTUFBTSxDQUFDLGtCQUFrQixFQUN6QixNQUFNLENBQUMsV0FBVyxDQUNuQixDQUFDO0lBQ0YsTUFBTSxFQUFFLEdBQUcsSUFBSSxZQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDcEMsTUFBTSxRQUFRLEdBQXdCLEVBQUUsQ0FBQztJQUN6QyxJQUFJLFFBQVEsR0FBYyxFQUFFLENBQUM7SUFDN0IsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDO0lBQ25CLE1BQU0sY0FBYyxHQUFHLFNBQVMsQ0FBQztJQUNqQyxJQUFJLHFCQUErQyxDQUFDO0lBRXBELElBQUksaUJBQWlCLEdBQUcsSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtRQUM5QyxxQkFBcUIsR0FBRyxPQUFPLENBQUM7SUFDbEMsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUU7UUFDakIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBQ3JELHFCQUFxQixDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ25DLENBQUMsQ0FBQyxDQUFDO0lBQ0gsRUFBRSxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRTtRQUN4QixJQUFJLE1BQU07WUFBRSxPQUFPO1FBRW5CLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0JB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LENBQUM7WUFFSCxJQUFJLENBQUMsMkJBQTJCLENBQUMsT0FBTyxDQUFDLEVBQUU7Z0JBQ3pDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDeEI7WUFFRCxPQUFPLE9BQU8sQ0FBQztRQUNqQixDQUFDLENBQUM7SUFDSixDQUFDO0FBQ0gsQ0FBQztBQXhPRCxrRUF3T0MiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuby1wcm90b3R5cGUtYnVpbHRpbnMgKi9cbmltcG9ydCB7IENyZWRlbnRpYWxzIH0gZnJvbSAnQGF3cy1zZGsvdHlwZXMnO1xuaW1wb3J0IHsgZ2V0V2ViU29ja2V0VXJsIH0gZnJvbSAnc2VydmVybGVzcy1zcHktY29tbW9uL2dldFdlYlNvY2tldFVybCc7XG5pbXBvcnQgeyBGdW5jdGlvblJlcXVlc3RTcHlFdmVudCB9IGZyb20gJ3NlcnZlcmxlc3Mtc3B5LWNvbW1vbi9zcHlFdmVudHMvRnVuY3Rpb25SZXF1ZXN0U3B5RXZlbnQnO1xuaW1wb3J0IHsgU3B5RXZlbnQgfSBmcm9tICdzZXJ2ZXJsZXNzLXNweS1jb21tb24vc3B5RXZlbnRzL1NweUV2ZW50JztcbmltcG9ydCB7IFNweU1lc3NhZ2UgfSBmcm9tICdzZXJ2ZXJsZXNzLXNweS1jb21tb24vc3B5RXZlbnRzL1NweU1lc3NhZ2UnO1xuaW1wb3J0IFdlYlNvY2tldCBmcm9tICd3cyc7XG5pbXBvcnQgeyBTcHlMaXN0ZW5lciB9IGZyb20gJy4vU3B5TGlzdGVuZXInO1xuXG50eXBlIFNlcnZlcmxlc3NTcHlMaXN0ZW5lclBhcmFtcyA9IHtcbiAgc2VydmVybGVzc1NweVdzVXJsOiBzdHJpbmc7XG4gIGNyZWRlbnRpYWxzPzogQ3JlZGVudGlhbHM7XG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlU2VydmVybGVzc1NweUxpc3RlbmVyPFRTcHlFdmVudHM+KFxuICBwYXJhbXM6IFNlcnZlcmxlc3NTcHlMaXN0ZW5lclBhcmFtc1xuKSB7XG4gIGNvbnN0IHVybFNpZ25lZCA9IGF3YWl0IGdldFdlYlNvY2tldFVybChcbiAgICBwYXJhbXMuc2VydmVybGVzc1NweVdzVXJsLFxuICAgIHBhcmFtcy5jcmVkZW50aWFsc1xuICApO1xuICBjb25zdCB3cyA9IG5ldyBXZWJTb2NrZXQodXJsU2lnbmVkKTtcbiAgY29uc3QgbWVzc2FnZXM6IFNweU1lc3NhZ2VTdG9yYWdlW10gPSBbXTtcbiAgbGV0IHRyYWNrZXJzOiBUcmFja2VyW10gPSBbXTtcbiAgbGV0IGNsb3NlZCA9IGZhbHNlO1xuICBjb25zdCBmdW5jdGlvblByZWZpeCA9ICd3YWl0Rm9yJztcbiAgbGV0IGNvbm5lY3Rpb25PcGVuUmVzb2x2ZTogKHZhbHVlOiB1bmtub3duKSA9PiB2b2lkO1xuXG4gIGxldCB3YWl0Rm9yQ29ubmVjdGlvbiA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgY29ubmVjdGlvbk9wZW5SZXNvbHZlID0gcmVzb2x2ZTtcbiAgfSk7XG5cbiAgd3Mub24oJ29wZW4nLCAoKSA9PiB7XG4gICAgY29uc29sZS5sb2coJ2Nvbm5lY3RlZCAnICsgbmV3IERhdGUoKS50b0lTT1N0cmluZygpKTtcbiAgICBjb25uZWN0aW9uT3BlblJlc29sdmUodW5kZWZpbmVkKTtcbiAgfSk7XG4gIHdzLm9uKCdtZXNzYWdlJywgKGRhdGEpID0+IHtcbiAgICBpZiAoY2xvc2VkKSByZXR1cm47XG5cbiAgICBjb25zb2xlLmxvZyhgRnJvbSBzZXJ2ZXI6ICR7ZGF0YX1gKTtcblxuICAgIGNvbnN0IG1lc3NhZ2UgPSBKU09OLnBhcnNlKGRhdGEudG9TdHJpbmcoKSkgYXMgU3B5TWVzc2FnZVN0b3JhZ2U7XG5cbiAgICBtZXNzYWdlLnNlcnZpY2VLZXlGb3JGdW5jdGlvbiA9IG1lc3NhZ2Uuc2VydmljZUtleS5yZXBsYWNlKC8jL2csICcnKTtcblxuICAgIGlmIChtZXNzYWdlLnNlcnZpY2VLZXkuc3RhcnRzV2l0aCgnRnVuY3Rpb24nKSkge1xuICAgICAgbWVzc2FnZS5mdW5jdGlvbkNvbnRleHRBd3NSZXF1ZXN0SWQgPSAoXG4gICAgICAgIG1lc3NhZ2UuZGF0YSBhcyBGdW5jdGlvblJlcXVlc3RTcHlFdmVudFxuICAgICAgKS5jb250ZXh0LmF3c1JlcXVlc3RJZDtcbiAgICB9XG5cbiAgICBtZXNzYWdlcy5wdXNoKG1lc3NhZ2UpO1xuICAgIHJlc29sdmVPbGRUcmFja2VyV2l0aE5ld01lc3NhZ2UobWVzc2FnZSk7XG4gIH0pO1xuICB3cy5vbignY2xvc2UnLCAoKSA9PiB7XG4gICAgY2xvc2VkID0gdHJ1ZTtcbiAgICAvLyBjb25zb2xlLmxvZyhcImRpc2Nvbm5lY3RlZCBcIiArIG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSk7XG4gIH0pO1xuXG4gIGNvbnN0IHRyYWNrZXJNYXRjaE1lc3NhZ2UgPSAoXG4gICAgdHJhY2tlcjogVHJhY2tlcixcbiAgICBtZXNzYWdlOiBTcHlNZXNzYWdlU3RvcmFnZVxuICApID0+IHtcbiAgICBpZiAodHJhY2tlci5maW5pc2hlZCkgcmV0dXJuO1xuXG4gICAgaWYgKFxuICAgICAgKHRyYWNrZXIuc2VydmljZUtleSAmJiB0cmFja2VyLnNlcnZpY2VLZXkgPT09IG1lc3NhZ2Uuc2VydmljZUtleSkgfHxcbiAgICAgICh0cmFja2VyLnNlcnZpY2VLZXlGb3JGdW5jdGlvbiAmJlxuICAgICAgICB0cmFja2VyLnNlcnZpY2VLZXlGb3JGdW5jdGlvbiA9PT0gbWVzc2FnZS5zZXJ2aWNlS2V5Rm9yRnVuY3Rpb24pXG4gICAgKSB7XG4gICAgICBpZiAodHJhY2tlck1hdGNoQ29uZGl0aW9uKHRyYWNrZXIsIG1lc3NhZ2UpKSB7XG4gICAgICAgIHRyYWNrZXIuZmluaXNoZWQgPSB0cnVlO1xuXG4gICAgICAgIGNvbnN0IHNweUFuZEplc3RNYXRjaGVyczogYW55ID0ge1xuICAgICAgICAgIGdldERhdGE6ICgpID0+IG1lc3NhZ2UuZGF0YSxcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBzZXJ2aWNlS2V5Rm9yRnVuY3Rpb24gPSB0cmFja2VyLnNlcnZpY2VLZXlGb3JGdW5jdGlvbjtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHNlcnZpY2VLZXlGb3JGdW5jdGlvbiAmJlxuICAgICAgICAgIHNlcnZpY2VLZXlGb3JGdW5jdGlvbi5zdGFydHNXaXRoKCdGdW5jdGlvbicpICYmXG4gICAgICAgICAgKHNlcnZpY2VLZXlGb3JGdW5jdGlvbi5lbmRzV2l0aCgnUmVxdWVzdCcpIHx8XG4gICAgICAgICAgICBzZXJ2aWNlS2V5Rm9yRnVuY3Rpb24uZW5kc1dpdGgoJ0NvbnNvbGUnKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgbGV0IHNlcnZpY2VLZXlGb3JGdW5jdGlvblJlc3BvbnNlID0gc2VydmljZUtleUZvckZ1bmN0aW9uO1xuXG4gICAgICAgICAgaWYgKHNlcnZpY2VLZXlGb3JGdW5jdGlvblJlc3BvbnNlLmVuZHNXaXRoKCdSZXF1ZXN0JykpIHtcbiAgICAgICAgICAgIHNlcnZpY2VLZXlGb3JGdW5jdGlvblJlc3BvbnNlID1cbiAgICAgICAgICAgICAgc2VydmljZUtleUZvckZ1bmN0aW9uUmVzcG9uc2Uuc3Vic3RyaW5nKFxuICAgICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgICAgc2VydmljZUtleUZvckZ1bmN0aW9uUmVzcG9uc2UubGVuZ3RoIC0gJ1JlcXVlc3QnLmxlbmd0aFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSBpZiAoc2VydmljZUtleUZvckZ1bmN0aW9uUmVzcG9uc2UuZW5kc1dpdGgoJ0NvbnNvbGUnKSkge1xuICAgICAgICAgICAgc2VydmljZUtleUZvckZ1bmN0aW9uUmVzcG9uc2UgPVxuICAgICAgICAgICAgICBzZXJ2aWNlS2V5Rm9yRnVuY3Rpb25SZXNwb25zZS5zdWJzdHJpbmcoXG4gICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICBzZXJ2aWNlS2V5Rm9yRnVuY3Rpb25SZXNwb25zZS5sZW5ndGggLSAnQ29uc29sZScubGVuZ3RoXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc2VydmljZUtleUZvckZ1bmN0aW9uUmVzcG9uc2UgKz0gJ1Jlc3BvbnNlJztcblxuICAgICAgICAgIHNweUFuZEplc3RNYXRjaGVycy5mb2xsb3dlZEJ5UmVzcG9uc2UgPSAocGFyYW1zVzogV2FpdEZvclBhcmFtcykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVdhaXRGb3JYWFhGdW5jKFxuICAgICAgICAgICAgICBzZXJ2aWNlS2V5Rm9yRnVuY3Rpb25SZXNwb25zZSxcbiAgICAgICAgICAgICAgcGFyYW1zVyxcbiAgICAgICAgICAgICAgKG1lc3NhZ2UuZGF0YSBhcyBGdW5jdGlvblJlcXVlc3RTcHlFdmVudCkuY29udGV4dC5hd3NSZXF1ZXN0SWRcbiAgICAgICAgICAgICkoKTtcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJveHkgPSBuZXcgUHJveHkoc3B5QW5kSmVzdE1hdGNoZXJzLCB7XG4gICAgICAgICAgZ2V0OiBmdW5jdGlvbiAodGFyZ2V0OiBhbnksIG9iamVjdEtleTogc3RyaW5nKSB7XG4gICAgICAgICAgICBpZiAodGFyZ2V0Lmhhc093blByb3BlcnR5KG9iamVjdEtleSkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldFtvYmplY3RLZXldO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChvYmplY3RLZXkgIT09ICd0aGVuJykge1xuICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGplc3RGdW5jdGlvblRvRXhlY3V0ZSA9IChleHBlY3QobWVzc2FnZS5kYXRhKSBhcyBhbnkpW1xuICAgICAgICAgICAgICAgICAgb2JqZWN0S2V5XG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICBqZXN0RnVuY3Rpb25Ub0V4ZWN1dGUuYXBwbHkodW5kZWZpbmVkLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBwcm94eTtcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcblxuICAgICAgICB0cmFja2VyLnByb21pc2VSZXNvbHZlKHByb3h5KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICBjb25zdCByZXNvbHZlVHJhY2tlckluT2xkTWVzc2FnZXMgPSAodHJhY2tlcjogVHJhY2tlcikgPT4ge1xuICAgIGZvciAoY29uc3QgbWVzc2FnZSBvZiBtZXNzYWdlcykge1xuICAgICAgaWYgKHRyYWNrZXJNYXRjaE1lc3NhZ2UodHJhY2tlciwgbWVzc2FnZSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIGNvbnN0IHJlc29sdmVPbGRUcmFja2VyV2l0aE5ld01lc3NhZ2UgPSAobWVzc2FnZTogU3B5TWVzc2FnZVN0b3JhZ2UpID0+IHtcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdHJhY2tlcnMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICBjb25zdCB0cmFja2VyID0gdHJhY2tlcnNbaW5kZXhdO1xuICAgICAgaWYgKHRyYWNrZXJNYXRjaE1lc3NhZ2UodHJhY2tlciwgbWVzc2FnZSkpIHtcbiAgICAgICAgdHJhY2tlcnMgPSB0cmFja2Vycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG5cbiAgY29uc3Qgc3B5TGlzdGVuZXIgPSB7fSBhcyBTcHlMaXN0ZW5lcjxUU3B5RXZlbnRzPjtcblxuICBzcHlMaXN0ZW5lci5zdG9wID0gKCkgPT4ge1xuICAgIGNsb3NlZCA9IHRydWU7XG4gICAgd3MuY2xvc2UoKTtcbiAgfTtcblxuICBjb25zdCBwcm94eSA9IG5ldyBQcm94eShzcHlMaXN0ZW5lciwge1xuICAgIGdldDogZnVuY3Rpb24gKHRhcmdldDogYW55LCBvYmplY3RLZXk6IHN0cmluZykge1xuICAgICAgaWYgKHRhcmdldC5oYXNPd25Qcm9wZXJ0eShvYmplY3RLZXkpKSB7XG4gICAgICAgIHJldHVybiB0YXJnZXRbb2JqZWN0S2V5XTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIHR5cGVvZiBvYmplY3RLZXkgPT09ICdzdHJpbmcnICYmXG4gICAgICAgIG9iamVjdEtleS5zdGFydHNXaXRoKGZ1bmN0aW9uUHJlZml4KVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHBhcmFtc1cgPSBhcmd1bWVudHNbMF0gYXMgV2FpdEZvclBhcmFtcztcbiAgICAgICAgY29uc3Qgc2VydmljZUtleUZvckZ1bmN0aW9uID0gb2JqZWN0S2V5LnN1YnN0cmluZyhcbiAgICAgICAgICBmdW5jdGlvblByZWZpeC5sZW5ndGhcbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4gY3JlYXRlV2FpdEZvclhYWEZ1bmMoc2VydmljZUtleUZvckZ1bmN0aW9uLCBwYXJhbXNXKTtcbiAgICAgIH1cbiAgICB9LFxuICB9KTtcblxuICBhd2FpdCB3YWl0Rm9yQ29ubmVjdGlvbjtcblxuICByZXR1cm4gcHJveHkgYXMgU3B5TGlzdGVuZXI8VFNweUV2ZW50cz47XG5cbiAgZnVuY3Rpb24gdHJhY2tlck1hdGNoQ29uZGl0aW9uKHRyYWNrZXI6IFRyYWNrZXIsIG1lc3NhZ2U6IFNweU1lc3NhZ2VTdG9yYWdlKSB7XG4gICAgY29uc3QgbWF0Y2hDb25kaXRpb24gPVxuICAgICAgKHRyYWNrZXIuY29uZGl0aW9uICYmIHRyYWNrZXIuY29uZGl0aW9uKG1lc3NhZ2UuZGF0YSkpIHx8XG4gICAgICAhdHJhY2tlci5jb25kaXRpb247XG5cbiAgICBjb25zdCBtYXRjaFJlcXVlc3RJZCA9XG4gICAgICAodHJhY2tlci5mdW5jdGlvbkNvbnRleHRBd3NSZXF1ZXN0SWQgJiZcbiAgICAgICAgdHJhY2tlci5mdW5jdGlvbkNvbnRleHRBd3NSZXF1ZXN0SWQgPT09XG4gICAgICAgICAgbWVzc2FnZS5mdW5jdGlvbkNvbnRleHRBd3NSZXF1ZXN0SWQpIHx8XG4gICAgICAhdHJhY2tlci5mdW5jdGlvbkNvbnRleHRBd3NSZXF1ZXN0SWQ7XG5cbiAgICBpZiAodHJhY2tlci5mdW5jdGlvbkNvbnRleHRBd3NSZXF1ZXN0SWQpIHtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBgJHt0cmFja2VyLmZ1bmN0aW9uQ29udGV4dEF3c1JlcXVlc3RJZH0gLSAke21lc3NhZ2UuZnVuY3Rpb25Db250ZXh0QXdzUmVxdWVzdElkfWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hdGNoQ29uZGl0aW9uICYmIG1hdGNoUmVxdWVzdElkO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlV2FpdEZvclhYWEZ1bmMoXG4gICAgc2VydmljZUtleUZvckZ1bmN0aW9uOiBzdHJpbmcsXG4gICAgcGFyYW1zVzogV2FpdEZvclBhcmFtczxTcHlFdmVudD4sXG4gICAgZnVuY3Rpb25Db250ZXh0QXdzUmVxdWVzdElkPzogc3RyaW5nXG4gICkge1xuICAgIGxldCB0cmFja2VyOiBUcmFja2VyO1xuXG4gICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyYWNrZXIgPSB7XG4gICAgICAgIGZpbmlzaGVkOiBmYWxzZSxcbiAgICAgICAgcHJvbWlzZVJlc29sdmU6IHJlc29sdmUsXG4gICAgICAgIHByb21pc2VSZWplY3Q6IHJlamVjdCxcbiAgICAgICAgc2VydmljZUtleUZvckZ1bmN0aW9uLFxuICAgICAgICBmdW5jdGlvbkNvbnRleHRBd3NSZXF1ZXN0SWQsXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIHdhaXRGb3JYWFhGdW5jKCkge1xuICAgICAgdHJhY2tlci5jb25kaXRpb24gPSBwYXJhbXNXPy5jb25kaXRpb247XG5cbiAgICAgIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmICh0cmFja2VyLmZpbmlzaGVkKSByZXR1cm47XG4gICAgICAgIHRyYWNrZXIuZmluaXNoZWQgPSB0cnVlO1xuICAgICAgICB0cmFja2VyLnByb21pc2VSZWplY3QoXG4gICAgICAgICAgbmV3IEVycm9yKFxuICAgICAgICAgICAgYFRpbWVvdXQgd2FpdGluZyBmb3IgU2VydmVybGVzcyBTcHkgbWVzc2FnZSAke3NlcnZpY2VLZXlGb3JGdW5jdGlvbn1gXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfSwgcGFyYW1zVz8udGltb3V0TXMgfHwgMTAwMDApO1xuXG4gICAgICBwcm9taXNlLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgfSk7XG5cbiAgICAgIGlmICghcmVzb2x2ZVRyYWNrZXJJbk9sZE1lc3NhZ2VzKHRyYWNrZXIpKSB7XG4gICAgICAgIHRyYWNrZXJzLnB1c2godHJhY2tlcik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBXYWl0Rm9yUGFyYW1zPFRTcHlFdmVudCBleHRlbmRzIFNweUV2ZW50ID0gU3B5RXZlbnQ+IHtcbiAgY29uZGl0aW9uPzogKGV2ZW50OiBUU3B5RXZlbnQpID0+IGJvb2xlYW47XG4gIHRpbW91dE1zPzogbnVtYmVyO1xufVxuXG50eXBlIFRyYWNrZXIgPSB7XG4gIHByb21pc2VSZXNvbHZlOiAoZGF0YTogYW55KSA9PiB2b2lkO1xuICBwcm9taXNlUmVqZWN0OiAoZGF0YTogYW55KSA9PiB2b2lkO1xuICBmaW5pc2hlZDogYm9vbGVhbjtcbiAgc2VydmljZUtleT86IHN0cmluZztcbiAgc2VydmljZUtleUZvckZ1bmN0aW9uPzogc3RyaW5nO1xuICBjb25kaXRpb24/OiAoZGF0YTogYW55KSA9PiBib29sZWFuO1xuICB0aW1vdXRNcz86IG51bWJlcjtcbiAgZnVuY3Rpb25Db250ZXh0QXdzUmVxdWVzdElkPzogc3RyaW5nO1xufTtcblxudHlwZSBTcHlNZXNzYWdlU3RvcmFnZSA9IFNweU1lc3NhZ2UgJiB7XG4gIHNlcnZpY2VLZXlGb3JGdW5jdGlvbjogc3RyaW5nO1xuICBmdW5jdGlvbkNvbnRleHRBd3NSZXF1ZXN0SWQ/OiBzdHJpbmc7XG59O1xuIl19
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./createServerlessSpyListener"), exports);
|
|
18
|
+
__exportStar(require("./SpyListener"), exports);
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9saXN0ZW5lci9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsZ0VBQThDO0FBQzlDLGdEQUE4QiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vY3JlYXRlU2VydmVybGVzc1NweUxpc3RlbmVyJztcbmV4cG9ydCAqIGZyb20gJy4vU3B5TGlzdGVuZXInO1xuIl19
|
|
File without changes
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
// import { ServerlessSpyListener } from "./ServerlessSpyListener";
|
|
4
|
+
|
|
5
|
+
type CustomMatcherResult = {
|
|
6
|
+
message: () => string;
|
|
7
|
+
pass: boolean;
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
export const toReceiveEvent = async (
|
|
11
|
+
spy: any,
|
|
12
|
+
serviceKey: string,
|
|
13
|
+
condition?: (data: any) => boolean
|
|
14
|
+
): Promise<CustomMatcherResult> => {
|
|
15
|
+
console.log('NOTRI');
|
|
16
|
+
|
|
17
|
+
await sleep(3000);
|
|
18
|
+
|
|
19
|
+
// console.log("SPY", spy);
|
|
20
|
+
// const events = await spy.awaitEvents((events) => {
|
|
21
|
+
// return events.some((event) => event["detail-type"] === expected);
|
|
22
|
+
// });
|
|
23
|
+
|
|
24
|
+
// const pass = events.some((event) => event["detail-type"] === expected);
|
|
25
|
+
|
|
26
|
+
// const message = pass
|
|
27
|
+
// ? () => {
|
|
28
|
+
// return (
|
|
29
|
+
// matcherHint("toHaveEventWithDetailType", "eventsSpy", "detail-type") +
|
|
30
|
+
// "\n\n" +
|
|
31
|
+
// `Expected: not ${printExpected(expected)}\n` +
|
|
32
|
+
// `Number of events: ${printReceived(events.length)}`
|
|
33
|
+
// );
|
|
34
|
+
// }
|
|
35
|
+
// : () => {
|
|
36
|
+
// return (
|
|
37
|
+
// matcherHint("toHaveEventWithDetailType", "eventsSpy", "detail-type") +
|
|
38
|
+
// "\n\n" +
|
|
39
|
+
// `Expected: ${printExpected(expected)}\n` +
|
|
40
|
+
// (events.length > 0
|
|
41
|
+
// ? `Received: ${printReceived(events[0]?.["detail-type"])}`
|
|
42
|
+
// : `Number of events: ${printReceived(events.length)}`)
|
|
43
|
+
// );
|
|
44
|
+
// };
|
|
45
|
+
|
|
46
|
+
return { message: () => 'OK', pass: true };
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
function sleep(ms: number) {
|
|
50
|
+
return new Promise((resolve) => {
|
|
51
|
+
setTimeout(resolve, ms);
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
*/
|
|
55
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0Y2hlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9saXN0ZW5lci9tYXRjaGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUFvREUiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuLy8gaW1wb3J0IHsgU2VydmVybGVzc1NweUxpc3RlbmVyIH0gZnJvbSBcIi4vU2VydmVybGVzc1NweUxpc3RlbmVyXCI7XG5cbnR5cGUgQ3VzdG9tTWF0Y2hlclJlc3VsdCA9IHtcbiAgbWVzc2FnZTogKCkgPT4gc3RyaW5nO1xuICBwYXNzOiBib29sZWFuO1xufTtcblxuZXhwb3J0IGNvbnN0IHRvUmVjZWl2ZUV2ZW50ID0gYXN5bmMgKFxuICBzcHk6IGFueSxcbiAgc2VydmljZUtleTogc3RyaW5nLFxuICBjb25kaXRpb24/OiAoZGF0YTogYW55KSA9PiBib29sZWFuXG4pOiBQcm9taXNlPEN1c3RvbU1hdGNoZXJSZXN1bHQ+ID0+IHtcbiAgY29uc29sZS5sb2coJ05PVFJJJyk7XG5cbiAgYXdhaXQgc2xlZXAoMzAwMCk7XG5cbiAgLy8gY29uc29sZS5sb2coXCJTUFlcIiwgc3B5KTtcbiAgLy8gY29uc3QgZXZlbnRzID0gYXdhaXQgc3B5LmF3YWl0RXZlbnRzKChldmVudHMpID0+IHtcbiAgLy8gICByZXR1cm4gZXZlbnRzLnNvbWUoKGV2ZW50KSA9PiBldmVudFtcImRldGFpbC10eXBlXCJdID09PSBleHBlY3RlZCk7XG4gIC8vIH0pO1xuXG4gIC8vIGNvbnN0IHBhc3MgPSBldmVudHMuc29tZSgoZXZlbnQpID0+IGV2ZW50W1wiZGV0YWlsLXR5cGVcIl0gPT09IGV4cGVjdGVkKTtcblxuICAvLyBjb25zdCBtZXNzYWdlID0gcGFzc1xuICAvLyAgID8gKCkgPT4ge1xuICAvLyAgICAgICByZXR1cm4gKFxuICAvLyAgICAgICAgIG1hdGNoZXJIaW50KFwidG9IYXZlRXZlbnRXaXRoRGV0YWlsVHlwZVwiLCBcImV2ZW50c1NweVwiLCBcImRldGFpbC10eXBlXCIpICtcbiAgLy8gICAgICAgICBcIlxcblxcblwiICtcbiAgLy8gICAgICAgICBgRXhwZWN0ZWQ6IG5vdCAke3ByaW50RXhwZWN0ZWQoZXhwZWN0ZWQpfVxcbmAgK1xuICAvLyAgICAgICAgIGBOdW1iZXIgb2YgZXZlbnRzOiAke3ByaW50UmVjZWl2ZWQoZXZlbnRzLmxlbmd0aCl9YFxuICAvLyAgICAgICApO1xuICAvLyAgICAgfVxuICAvLyAgIDogKCkgPT4ge1xuICAvLyAgICAgICByZXR1cm4gKFxuICAvLyAgICAgICAgIG1hdGNoZXJIaW50KFwidG9IYXZlRXZlbnRXaXRoRGV0YWlsVHlwZVwiLCBcImV2ZW50c1NweVwiLCBcImRldGFpbC10eXBlXCIpICtcbiAgLy8gICAgICAgICBcIlxcblxcblwiICtcbiAgLy8gICAgICAgICBgRXhwZWN0ZWQ6ICR7cHJpbnRFeHBlY3RlZChleHBlY3RlZCl9XFxuYCArXG4gIC8vICAgICAgICAgKGV2ZW50cy5sZW5ndGggPiAwXG4gIC8vICAgICAgICAgICA/IGBSZWNlaXZlZDogJHtwcmludFJlY2VpdmVkKGV2ZW50c1swXT8uW1wiZGV0YWlsLXR5cGVcIl0pfWBcbiAgLy8gICAgICAgICAgIDogYE51bWJlciBvZiBldmVudHM6ICR7cHJpbnRSZWNlaXZlZChldmVudHMubGVuZ3RoKX1gKVxuICAvLyAgICAgICApO1xuICAvLyAgICAgfTtcblxuICByZXR1cm4geyBtZXNzYWdlOiAoKSA9PiAnT0snLCBwYXNzOiB0cnVlIH07XG59O1xuXG5mdW5jdGlvbiBzbGVlcChtczogbnVtYmVyKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpO1xuICB9KTtcbn1cbiovXG4iXX0=
|
|
File without changes
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// import * as matchers from './matchers';
|
|
3
|
+
// if (expect !== undefined) {
|
|
4
|
+
// expect.extend(matchers);
|
|
5
|
+
// } else {
|
|
6
|
+
// /* eslint-disable no-console */
|
|
7
|
+
// console.error(
|
|
8
|
+
// "Unable to find Jest's global expect." +
|
|
9
|
+
// '\nPlease check you have added jest-extended correctly to your jest configuration.' +
|
|
10
|
+
// '\nSee https://github.com/jest-community/jest-extended#setup for help.'
|
|
11
|
+
// );
|
|
12
|
+
// /* eslint-enable no-console */
|
|
13
|
+
// }
|
|
14
|
+
// declare global {
|
|
15
|
+
// namespace jest {
|
|
16
|
+
// interface Matchers<R> {
|
|
17
|
+
// toReceiveEvent(serviceKey: string, condition?: (data: any) => boolean): R;
|
|
18
|
+
// }
|
|
19
|
+
// }
|
|
20
|
+
// }
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0dXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9saXN0ZW5lci9zZXR1cC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsMENBQTBDO0FBRTFDLDhCQUE4QjtBQUM5Qiw2QkFBNkI7QUFDN0IsV0FBVztBQUNYLG9DQUFvQztBQUNwQyxtQkFBbUI7QUFDbkIsK0NBQStDO0FBQy9DLDhGQUE4RjtBQUM5RixnRkFBZ0Y7QUFDaEYsT0FBTztBQUNQLG1DQUFtQztBQUNuQyxJQUFJO0FBRUosbUJBQW1CO0FBQ25CLHFCQUFxQjtBQUNyQiw4QkFBOEI7QUFDOUIsbUZBQW1GO0FBQ25GLFFBQVE7QUFDUixNQUFNO0FBQ04sSUFBSSIsInNvdXJjZXNDb250ZW50IjpbIi8vIGltcG9ydCAqIGFzIG1hdGNoZXJzIGZyb20gJy4vbWF0Y2hlcnMnO1xuXG4vLyBpZiAoZXhwZWN0ICE9PSB1bmRlZmluZWQpIHtcbi8vICAgZXhwZWN0LmV4dGVuZChtYXRjaGVycyk7XG4vLyB9IGVsc2Uge1xuLy8gICAvKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG4vLyAgIGNvbnNvbGUuZXJyb3IoXG4vLyAgICAgXCJVbmFibGUgdG8gZmluZCBKZXN0J3MgZ2xvYmFsIGV4cGVjdC5cIiArXG4vLyAgICAgICAnXFxuUGxlYXNlIGNoZWNrIHlvdSBoYXZlIGFkZGVkIGplc3QtZXh0ZW5kZWQgY29ycmVjdGx5IHRvIHlvdXIgamVzdCBjb25maWd1cmF0aW9uLicgK1xuLy8gICAgICAgJ1xcblNlZSBodHRwczovL2dpdGh1Yi5jb20vamVzdC1jb21tdW5pdHkvamVzdC1leHRlbmRlZCNzZXR1cCBmb3IgaGVscC4nXG4vLyAgICk7XG4vLyAgIC8qIGVzbGludC1lbmFibGUgbm8tY29uc29sZSAqL1xuLy8gfVxuXG4vLyBkZWNsYXJlIGdsb2JhbCB7XG4vLyAgIG5hbWVzcGFjZSBqZXN0IHtcbi8vICAgICBpbnRlcmZhY2UgTWF0Y2hlcnM8Uj4ge1xuLy8gICAgICAgdG9SZWNlaXZlRXZlbnQoc2VydmljZUtleTogc3RyaW5nLCBjb25kaXRpb24/OiAoZGF0YTogYW55KSA9PiBib29sZWFuKTogUjtcbi8vICAgICB9XG4vLyAgIH1cbi8vIH1cbiJdfQ==
|
|
File without changes
|
|
@@ -297,5 +297,5 @@ class ServerlessSpy extends constructs_1.Construct {
|
|
|
297
297
|
}
|
|
298
298
|
exports.ServerlessSpy = ServerlessSpy;
|
|
299
299
|
_a = JSII_RTTI_SYMBOL_1;
|
|
300
|
-
ServerlessSpy[_a] = { fqn: "serverless-spy.ServerlessSpy", version: "0.0.
|
|
300
|
+
ServerlessSpy[_a] = { fqn: "serverless-spy.ServerlessSpy", version: "0.0.10" };
|
|
301
301
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VydmVybGVzc1NweS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9TZXJ2ZXJsZXNzU3B5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsNkJBQTZCO0FBQzdCLDJEQUEyRDtBQUMzRCwyRUFBMkU7QUFDM0UsNkNBQThDO0FBRTlDLHFEQUFxRDtBQUNyRCxpREFBaUQ7QUFDakQsMERBQTBEO0FBQzFELGlEQUFpRDtBQUNqRCx1RUFBdUU7QUFDdkUsNERBQTREO0FBQzVELHlDQUF5QztBQUN6Qyw0REFBNEQ7QUFDNUQsMkNBQTJDO0FBQzNDLDZEQUE2RDtBQUM3RCwyQ0FBMkM7QUFDM0MsMkNBQW1EO0FBRW5ELE1BQWEsYUFBYyxTQUFRLHNCQUFTO0lBaUIxQyxZQUFZLEtBQWdCLEVBQUUsRUFBVTtRQUN0QyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBWFgsaUJBQVksR0FBaUIsRUFBRSxDQUFDO1FBRWhDLDZCQUF3QixHQUEyQixFQUFFLENBQUM7UUFXNUQsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLE1BQU0sQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRTtZQUMvRCxrQkFBa0IsRUFBRTtnQkFDbEIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXO2dCQUMxQixNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVc7Z0JBQzFCLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVzthQUMzQjtZQUNELElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FDekIsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsZ0NBQWdDLENBQUMsQ0FDdkQ7U0FDRixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFFNUMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFF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QUFZLE1BQU0sQ0FBQyxRQUFRO1lBQzlCLElBQXdCLENBQUMsWUFBWSxLQUFLLFlBQVksQ0FDMUQsQ0FBQztRQUVGLE9BQU8sV0FBVyxDQUFDO0lBQ3JCLENBQUM7SUFFTyxXQUFXLENBQ2pCLFVBQXlDLEVBQ3pDLE1BQW1CO1FBRW5CLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDWCxNQUFNLEdBQUcsbUJBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDekI7UUFFRCxLQUFLLE1BQU0sSUFBSSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ3ZDLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUNwQixPQUFPLElBQVMsQ0FBQzthQUNsQjtZQUNELElBQUksQ0FBQyxXQUFXLENBQUksVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ3ZDO1FBRUQsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQzs7QUFyYUgsc0NBc2FDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIGFwaUd3VjIgZnJvbSAnQGF3cy1jZGsvYXdzLWFwaWdhdGV3YXl2Mi1hbHBoYSc7XG5pbXBvcnQgKiBhcyBhcGlHd1YySW50IGZyb20gJ0Bhd3MtY2RrL2F3cy1hcGlnYXRld2F5djItaW50ZWdyYXRpb25zLWFscGhhJztcbmltcG9ydCB7IER1cmF0aW9uLCBTdGFjayB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIGFndyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtYXBpZ2F0ZXdheXYyJztcbmltcG9ydCAqIGFzIGR5bmFtb0RiIGZyb20gJ2F3cy1jZGstbGliL2F3cy1keW5hbW9kYic7XG5pbXBvcnQgKiBhcyBldmVudHMgZnJvbSAnYXdzLWNkay1saWIvYXdzLWV2ZW50cyc7XG5pbXBvcnQgKiBhcyB0YXJnZXRzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1ldmVudHMtdGFyZ2V0cyc7XG5pbXBvcnQgKiBhcyBsYW1iZGEgZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQgKiBhcyBkeW5hbW9EYlN0cmVhbSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhLWV2ZW50LXNvdXJjZXMnO1xuaW1wb3J0ICogYXMgbGFtYmRhTm9kZSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhLW5vZGVqcyc7XG5pbXBvcnQgKiBhcyBzMyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMnO1xuaW1wb3J0ICogYXMgczNub3RpZiBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMtbm90aWZpY2F0aW9ucyc7XG5pbXBvcnQgKiBhcyBzbnMgZnJvbSAnYXdzLWNkay1saWIvYXdzLXNucyc7XG5pbXBvcnQgKiBhcyBzbnNTdWJzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1zbnMtc3Vic2NyaXB0aW9ucyc7XG5pbXBvcnQgKiBhcyBzcXMgZnJvbSAnYXdzLWNkay1saWIvYXdzLXNxcyc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QsIElDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcblxuZXhwb3J0IGNsYXNzIFNlcnZlcmxlc3NTcHkgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBwcml2YXRlIGV4dGVuc2lvbkxheWVyOiBsYW1iZGEuTGF5ZXJWZXJzaW9uO1xuXG4gIHByaXZhdGUgdGFibGU6IGR5bmFtb0RiLlRhYmxlO1xuXG4gIHByaXZhdGUgd2ViU29ja2V0QXBpOiBhcGlHd1YyLldlYlNvY2tldEFwaTtcblxuICBwcml2YXRlIG93bkNvbnRydWN0czogSUNvbnN0cnVjdFtdID0gW107XG5cbiAgcHJpdmF0ZSBmdW5jdGlvblN1YnNjcmlwdGlvblBvb2w6IEZ1bmN0aW9uU3Vic2NyaXB0aW9uW10gPSBbXTtcblxuICBwcml2YXRlIGZ1bmN0aW9uU3Vic2NyaXB0aW9uTWFpbjogRnVuY3Rpb25TdWJzY3JpcHRpb247XG5cbiAgcHJpdmF0ZSB3ZWJTb2NrZXRTdGFnZTogYXBpR3dWMi5XZWJTb2NrZXRTdGFnZTtcblxuICB3c1VybDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgdGhpcy5leHRlbnNpb25MYXllciA9IG5ldyBsYW1iZGEuTGF5ZXJWZXJzaW9uKHRoaXMsICdFeHRlbnNpb24nLCB7XG4gICAgICBjb21wYXRpYmxlUnVudGltZXM6IFtcbiAgICAgICAgbGFtYmRhLlJ1bnRpbWUuTk9ERUpTXzEyX1gsXG4gICAgICAgIGxhbWJkYS5SdW50aW1lLk5PREVKU18xNF9YLFxuICAgICAgICBsYW1iZGEuUnVudGltZS5OT0RFSlNfMTZfWCxcbiAgICAgIF0sXG4gICAgICBjb2RlOiBsYW1iZGEuQ29kZS5mcm9tQXNzZXQoXG4gICAgICAgIHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi9sYW1iZGEtZXh0ZW5zaW9uL2Rpc3QvbGF5ZXInKVxuICAgICAgKSxcbiAgICB9KTtcbiAgICB0aGlzLm93bkNvbnRydWN0cy5wdXNoKHRoaXMuZXh0ZW5zaW9uTGF5ZXIpO1xuXG4gICAgdGhpcy50YWJsZSA9IG5ldyBkeW5hbW9EYi5UYWJsZSh0aGlzLCAnV2ViU29ja2V0Jywge1xuICAgICAgcGFydGl0aW9uS2V5OiB7XG4gICAgICAgIG5hbWU6ICdjb25uZWN0aW9uSWQnLFxuICAgICAgICB0eXBlOiBkeW5hbW9EYi5BdHRyaWJ1dGVUeXBlLlNUUklORyxcbiAgICAgIH0sXG4gICAgICBiaWxsaW5nTW9kZTogZHluYW1vRGIuQmlsbGluZ01vZGUuUEFZX1BFUl9SRVFVRVNULFxuICAgIH0pO1xuICAgIHRoaXMub3duQ29udHJ1Y3RzLnB1c2godGhpcy50YWJsZSk7XG5cbiAgICBjb25zdCBmdW5jdGlvbk9uQ29ubmVjdCA9IG5ldyBsYW1iZGFOb2RlLk5vZGVqc0Z1bmN0aW9uKHRoaXMsICdPbkNvbm5lY3QnLCB7XG4gICAgICBtZW1vcnlTaXplOiA1MTIsXG4gICAgICB0aW1lb3V0OiBEdXJhdGlvbi5zZWNvbmRzKDUpLFxuICAgICAgcnVudGltZTogbGFtYmRhLlJ1bnRpbWUuTk9ERUpTXzE2X1gsXG4gICAgICBoYW5kbGVyOiAnaGFuZGxlcicsXG4gICAgICBlbnRyeTogcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uL2Z1bmN0aW9ucy9vbkNvbm5lY3QudHMnKSxcbiAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgIFRBQkxFX05BTUU6IHRoaXMudGFibGUudGFibGVOYW1lLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICB0aGlzLnRhYmxlLmdyYW50V3JpdGVEYXRhKGZ1bmN0aW9uT25Db25uZWN0KTtcbiAgICB0aGlzLm93bkNvbnRydWN0cy5wdXNoKGZ1bmN0aW9uT25Db25uZWN0KTtcblxuICAgIGNvbnN0IGZ1bmN0aW9uT25EaXNjb25uZWN0ID0gbmV3IGxhbWJkYU5vZGUuTm9kZWpzRnVuY3Rpb24oXG4gICAgICB0aGlzLFxuICAgICAgJ09uRGlzY29ubmVjdCcsXG4gICAgICB7XG4gICAgICAgIG1lbW9yeVNpemU6IDUxMixcbiAgICAgICAgdGltZW91dDogRHVyYXRpb24uc2Vjb25kcyg1KSxcbiAgICAgICAgcnVudGltZTogbGFtYmRhLlJ1bnRpbWUuTk9ERUpTXzE2X1gsXG4gICAgICAgIGhhbmRsZXI6ICdoYW5kbGVyJyxcbiAgICAgICAgZW50cnk6IHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi9mdW5jdGlvbnMvb25EaXNjb25uZWN0LnRzJyksXG4gICAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgICAgVEFCTEVfTkFNRTogdGhpcy50YWJsZS50YWJsZU5hbWUsXG4gICAgICAgIH0sXG4gICAgICB9XG4gICAgKTtcbiAgICB0aGlzLnRhYmxlLmdyYW50V3JpdGVEYXRhKGZ1bmN0aW9uT25EaXNjb25uZWN0KTtcbiAgICB0aGlzLm93bkNvbnRydWN0cy5wdXNoKGZ1bmN0aW9uT25EaXNjb25uZWN0KTtcblxuICAgIHRoaXMud2ViU29ja2V0QXBpID0gbmV3IGFwaUd3VjIuV2ViU29ja2V0QXBpKHRoaXMsICdBcGlHd1dlYlNvY2tldCcpO1xuICAgIHRoaXMub3duQ29udHJ1Y3RzLnB1c2godGhpcy53ZWJTb2NrZXRBcGkpO1xuICAgIHRoaXMud2ViU29ja2V0U3RhZ2UgPSBuZXcgYXBpR3dWMi5XZWJTb2NrZXRTdGFnZShcbiAgICAgIHRoaXMsXG4gICAgICAnQXBpR3dXZWJTb2NrZXRTdGFnZScsXG4gICAgICB7XG4gICAgICAgIHdlYlNvY2tldEFwaTogdGhpcy53ZWJTb2NrZXRBcGksXG4gICAgICAgIHN0YWdlTmFtZTogJ3Byb2QnLFxuICAgICAgICBhdXRvRGVwbG95OiB0cnVlLFxuICAgICAgfVxuICAgICk7XG4gICAgdGhpcy5vd25Db250cnVjdHMucHVzaCh0aGlzLndlYlNvY2tldFN0YWdlKTtcbiAgICBjb25zdCB3ZWJTb2NrZXRBcGlSb3V0ZSA9IHRoaXMud2ViU29ja2V0QXBpLmFkZFJvdXRlKCckY29ubmVjdCcsIHtcbiAgICAgIGludGVncmF0aW9uOiBuZXcgYXBpR3dWMkludC5XZWJTb2NrZXRMYW1iZGFJbnRlZ3JhdGlvbihcbiAgICAgICAgJyRjb25uZWN0JyxcbiAgICAgICAgZnVuY3Rpb25PbkNvbm5lY3RcbiAgICAgICksXG4gICAgfSk7XG4gICAgKHdlYlNvY2tldEFwaVJvdXRlLm5vZGUuZGVmYXVsdENoaWxkIGFzIGFndy5DZm5Sb3V0ZSkuYXV0aG9yaXphdGlvblR5cGUgPVxuICAgICAgJ0FXU19JQU0nO1xuXG4gICAgdGhpcy53ZWJTb2NrZXRBcGkuYWRkUm91dGUoJyRkaXNjb25uZWN0Jywge1xuICAgICAgaW50ZWdyYXRpb246IG5ldyBhcGlHd1YySW50LldlYlNvY2tldExhbWJkYUludGVncmF0aW9uKFxuICAgICAgICAnJGRpc2Nvbm5lY3QnLFxuICAgICAgICBmdW5jdGlvbk9uRGlzY29ubmVjdFxuICAgICAgKSxcbiAgICB9KTtcblxuICAgIHRoaXMuZnVuY3Rpb25TdWJzY3JpcHRpb25NYWluID0gdGhpcy5wcm92aWRlRnVuY3Rpb25Gb3JTdWJzY3JpcHRpb24oKTtcblxuICAgIHRoaXMud2ViU29ja2V0QXBpLmFkZFJvdXRlKCdzZW5kbWVzc2FnZScsIHtcbiAgICAgIGludGVncmF0aW9uOiBuZXcgYXBpR3dWMkludC5XZWJTb2NrZXRMYW1iZGFJbnRlZ3JhdGlvbihcbiAgICAgICAgJ1NlbmRNZXNzYWdlJyxcbiAgICAgICAgdGhpcy5mdW5jdGlvblN1YnNjcmlwdGlvbk1haW4uZnVuY3Rpb25cbiAgICAgICksXG4gICAgfSk7XG5cbiAgICB0aGlzLml0ZXJhdGVBbGxFbGVtZW50cyhTdGFjay5vZih0aGlzKSk7XG5cbiAgICBmb3IgKGNvbnN0IGZ1bmMgb2YgdGhpcy5mdW5jdGlvblN1YnNjcmlwdGlvblBvb2wpIHtcbiAgICAgIGZ1bmMuZnVuY3Rpb24uYWRkRW52aXJvbm1lbnQoXG4gICAgICAgICdJTkZSQV9NQVBQSU5HJyxcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoZnVuYy5tYXBwaW5nKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBuZXcgQ2ZuT3V0cHV0KHRoaXMsIFwiQVBJX1VSTFwiLCB7XG4gICAgLy8gICB2YWx1ZTogYHdzczovLyR7dGhpcy53ZWJTb2NrZXRBcGkuYXBpSWR9LmV4ZWN1dGUtYXBpLiR7XG4gICAgLy8gICAgIFN0YWNrLm9mKHNjb3BlKS5yZWdpb25cbiAgICAvLyAgIH0uYW1hem9uYXdzLmNvbS8ke3RoaXMud2ViU29ja2V0U3RhZ2Uuc3RhZ2VOYW1lfWAsXG4gICAgLy8gfSk7XG5cbiAgICB0aGlzLndzVXJsID0gYHdzczovLyR7dGhpcy53ZWJTb2NrZXRBcGkuYXBpSWR9LmV4ZWN1dGUtYXBpLiR7XG4gICAgICBTdGFjay5vZih0aGlzKS5yZWdpb25cbiAgICB9LmFtYXpvbmF3cy5jb20vJHt0aGlzLndlYlNvY2tldFN0YWdlLnN0YWdlTmFtZX1gO1xuXG4gICAgLy8gbmV3IENmbk91dHB1dCh0aGlzLCBcIkFQSV9VUkxcIiwge1xuICAgIC8vICAgdmFsdWU6IHRoaXMud3NVcmwsXG4gICAgLy8gfSk7XG4gIH1cblxuICBwcml2YXRlIGl0ZXJhdGVBbGxFbGVtZW50cyhwYXJlbnQ6IElDb25zdHJ1Y3QpIHtcbiAgICBmb3IgKGNvbnN0IG5vZGUgb2YgcGFyZW50Lm5vZGUuY2hpbGRyZW4pIHtcbiAgICAgIGlmICh0aGlzLm93bkNvbnRydWN0cy5pbmNsdWRlcyhub2RlKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuZnVuY3Rpb25TdWJzY3JpcHRpb25Qb29sLmZpbmQoKHMpID0+IHMuZnVuY3Rpb24gPT09IG5vZGUpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zb2xlLmxvZygnTk9ERScsIG5vZGUuY29uc3RydWN0b3IubmFtZSk7XG5cbiAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgbGFtYmRhLkZ1bmN0aW9uKSB7XG4gICAgICAgIHRoaXMuaW50ZXJjZXB0RnVuY3Rpb24obm9kZSk7XG4gICAgICB9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBzbnMuVG9waWMpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ2ludGVyY2VwdFNuc1RvcGljJyk7XG4gICAgICAgIHRoaXMuaW50ZXJjZXB0U25zVG9waWMobm9kZSk7XG4gICAgICB9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBzbnMuU3Vic2NyaXB0aW9uKSB7XG4gICAgICAgIHRoaXMuaW50ZXJjZXB0U25zU3Vic2NyaXB0aW9uKG5vZGUpO1xuICAgICAgfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgczMuQnVja2V0KSB7XG4gICAgICAgIHRoaXMuaW50ZXJjZXB0UzMobm9kZSk7XG4gICAgICB9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBkeW5hbW9EYi5UYWJsZSkge1xuICAgICAgICB0aGlzLmludGVyY2VwdER5bmFtb2RiKG5vZGUpO1xuICAgICAgfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgZXZlbnRzLkV2ZW50QnVzKSB7XG4gICAgICAgIHRoaXMuaW50ZXJjZXB0RXZlbnRCdXMobm9kZSk7XG4gICAgICB9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBldmVudHMuUnVsZSkge1xuICAgICAgICB0aGlzLmludGVyY2VwdEV2ZW50QnVzUnVsZShub2RlKTtcbiAgICAgIH0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIGxhbWJkYS5DZm5FdmVudFNvdXJjZU1hcHBpbmcpIHtcbiAgICAgICAgdGhpcy5pbnRlcmNlcHRTcXMobm9kZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBjb25zb2xlLmxvZygnTk8gTUFUQ0gnLCBub2RlKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5pdGVyYXRlQWxsRWxlbWVudHMobm9kZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpbnRlcmNlcHRTcXMobm9kZTogbGFtYmRhLkNmbkV2ZW50U291cmNlTWFwcGluZykge1xuICAgIGNvbnN0IHF1ZXVlID0gdGhpcy5maW5kRWxlbWVudDxzcXMuUXVldWU+KFxuICAgICAgKG46IElDb25zdHJ1Y3QpID0+XG4gICAgICAgIG4gaW5zdGFuY2VvZiBzcXMuUXVldWUgJiZcbiAgICAgICAgKG4gYXMgc3FzLlF1ZXVlKS5xdWV1ZUFybiA9PT0gbm9kZS5ldmVudFNvdXJjZUFyblxuICAgICk7XG5cbiAgICBjb25zdCBmdW5jID0gdGhpcy5maW5kRWxlbWVudDxsYW1iZGEuRnVuY3Rpb24+KFxuICAgICAgKG46IElDb25zdHJ1Y3QpID0+XG4gICAgICAgIG4gaW5zdGFuY2VvZiBsYW1iZGEuRnVuY3Rpb24gJiZcbiAgICAgICAgKG4gYXMgbGFtYmRhLkZ1bmN0aW9uKS5mdW5jdGlvbk5hbWUgPT09IG5vZGUuZnVuY3Rpb25OYW1lXG4gICAgKTtcblxuICAgIGlmIChxdWV1ZSAmJiBmdW5jKSB7XG4gICAgICBjb25zdCBxdWV1ZU5hbWUgPSB0aGlzLmdldENvbnN0cnVjdE5hbWUocXVldWUpO1xuICAgICAgdGhpcy5mdW5jdGlvblN1YnNjcmlwdGlvbk1haW4ubWFwcGluZ1tcbiAgICAgICAgcXVldWUucXVldWVBcm5cbiAgICAgIF0gPSBgU3FzIyR7cXVldWVOYW1lfWA7XG4gICAgICBmdW5jLmFkZEVudmlyb25tZW50KCdGTFVFTlRfVEVTVF9TVUJTQ1JJQkVEX1RPX1NRUycsICd0cnVlJyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVGdW5jdGlvbkZvclN1YnNjcmlwdGlvbihpbmRleDogbnVtYmVyKSB7XG4gICAgY29uc3QgZnVuYyA9IG5ldyBsYW1iZGFOb2RlLk5vZGVqc0Z1bmN0aW9uKHRoaXMsIGBTdWJzY3JpcHRpb24ke2luZGV4fWAsIHtcbiAgICAgIG1lbW9yeVNpemU6IDUxMixcbiAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLnNlY29uZHMoNSksXG4gICAgICBydW50aW1lOiBsYW1iZGEuUnVudGltZS5OT0RFSlNfMTZfWCxcbiAgICAgIGhhbmRsZXI6ICdoYW5kbGVyJyxcbiAgICAgIGVudHJ5OiBwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vZnVuY3Rpb25zL3NlbmRNZXNzYWdlLnRzJyksXG4gICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICBUQUJMRV9OQU1FOiB0aGlzLnRhYmxlLnRhYmxlTmFtZSxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICB0aGlzLnRhYmxlLmdyYW50V3JpdGVEYXRhKGZ1bmMpO1xuICAgIHRoaXMudGFibGUuZ3JhbnRSZWFkRGF0YShmdW5jKTtcbiAgICBmdW5jLmFkZEVudmlyb25tZW50KFxuICAgICAgJ1dTX0VORFBPSU5UJyxcbiAgICAgIGBodHRwczovLyR7dGhpcy53ZWJTb2NrZXRBcGkuYXBpSWR9LmV4ZWN1dGUtYXBpLiR7XG4gICAgICAgIFN0YWNrLm9mKHRoaXMpLnJlZ2lvblxuICAgICAgfS5hbWF6b25hd3MuY29tLyR7dGhpcy53ZWJTb2NrZXRTdGFnZS5zdGFnZU5hbWV9YFxuICAgICk7XG5cbiAgICB0aGlzLndlYlNvY2tldEFwaS5ncmFudE1hbmFnZUNvbm5lY3Rpb25zKGZ1bmMpO1xuICAgIHJldHVybiBmdW5jO1xuICB9XG5cbiAgcHJpdmF0ZSBpbnRlcmNlcHRTMyhzM0J1Y2tldDogczMuQnVja2V0KSB7XG4gICAgczNCdWNrZXQuYWRkRXZlbnROb3RpZmljYXRpb24oXG4gICAgICBzMy5FdmVudFR5cGUuT0JKRUNUX0NSRUFURURfUFVULFxuICAgICAgbmV3IHMzbm90aWYuTGFtYmRhRGVzdGluYXRpb24odGhpcy5mdW5jdGlvblN1YnNjcmlwdGlvbk1haW4uZnVuY3Rpb24pXG4gICAgKTtcblxuICAgIGNvbnN0IG5hbWUgPSB0aGlzLmdldENvbnN0cnVjdE5hbWUoczNCdWNrZXQpO1xuICAgIHRoaXMuZnVuY3Rpb25TdWJzY3JpcHRpb25NYWluLm1hcHBpbmdbczNCdWNrZXQuYnVja2V0QXJuXSA9IGBTMyMke25hbWV9YDtcbiAgfVxuXG4gIHByaXZhdGUgaW50ZXJjZXB0RHluYW1vZGIodGFibGU6IGR5bmFtb0RiLlRhYmxlKSB7XG4gICAgLy8gZW5hYmxlIER5bmFtb0RCIHN0cmVhbXMgd2l0aCBhIGhhY2tcbiAgICAodGFibGUubm9kZS5kZWZhdWx0Q2hpbGQgYXMgZHluYW1vRGIuQ2ZuVGFibGUpLnN0cmVhbVNwZWNpZmljYXRpb24gPSB7XG4gICAgICBzdHJlYW1WaWV3VHlwZTogZHluYW1vRGIuU3RyZWFtVmlld1R5cGUuTkVXX0FORF9PTERfSU1BR0VTLFxuICAgIH07XG4gICAgKHRhYmxlIGFzIGFueSkudGFibGVTdHJlYW1Bcm4gPSAoXG4gICAgICB0YWJsZS5ub2RlLmRlZmF1bHRDaGlsZCBhcyBkeW5hbW9EYi5DZm5UYWJsZVxuICAgICkuYXR0clN0cmVhbUFybjtcblxuICAgIHRoaXMuZnVuY3Rpb25TdWJzY3JpcHRpb25NYWluLmZ1bmN0aW9uLmFkZEV2ZW50U291cmNlKFxuICAgICAgbmV3IGR5bmFtb0RiU3RyZWFtLkR5bmFtb0V2ZW50U291cmNlKHRhYmxlLCB7XG4gICAgICAgIHN0YXJ0aW5nUG9zaXRpb246IGxhbWJkYS5TdGFydGluZ1Bvc2l0aW9uLkxBVEVTVCxcbiAgICAgICAgYmF0Y2hTaXplOiAxLFxuICAgICAgICByZXRyeUF0dGVtcHRzOiAwLFxuICAgICAgfSlcbiAgICApO1xuXG4gICAgY29uc3QgbmFtZSA9IHRoaXMuZ2V0Q29uc3RydWN0TmFtZSh0YWJsZSk7XG5cbiAgICB0aGlzLmZ1bmN0aW9uU3Vic2NyaXB0aW9uTWFpbi5tYXBwaW5nW3RhYmxlLnRhYmxlQXJuXSA9IGBEeW5hbW9EQiMke25hbWV9YDtcbiAgfVxuXG4gIHByaXZhdGUgaW50ZXJjZXB0RXZlbnRCdXNSdWxlKHJ1bGU6IGV2ZW50cy5SdWxlKSB7XG4gICAgY29uc3QgeyBldmVudEJ1c05hbWUgfSA9IHJ1bGUubm9kZS5kZWZhdWx0Q2hpbGQgYXMgZXZlbnRzLkNmblJ1bGU7XG4gICAgY29uc3QgZXZlbnRCcmlkZ2UgPSB0aGlzLmdldEV2ZW50QnJpZGdlKFxuICAgICAgKHJ1bGUubm9kZS5kZWZhdWx0Q2hpbGQgYXMgYW55KS5ldmVudEJ1c05hbWVcbiAgICApO1xuXG4gICAgaWYgKCFldmVudEJyaWRnZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW4gbm90IGZpbmQgRXZlbnRCcmlkZ2Ugd2l0aCBuYW1lIFwiJHtldmVudEJ1c05hbWV9XCJgKTtcbiAgICB9XG5cbiAgICBjb25zdCBmdW5jdGlvblN1YnNjcmlwdGlvbiA9IHRoaXMucHJvdmlkZUZ1bmN0aW9uRm9yU3Vic2NyaXB0aW9uKFxuICAgICAgKHMpID0+ICFzLnVzZWRGb3JFdmVudEJyaWRnZVxuICAgICk7XG4gICAgZnVuY3Rpb25TdWJzY3JpcHRpb24udXNlZEZvckV2ZW50QnJpZGdlID0gdHJ1ZTtcblxuICAgIHJ1bGUuYWRkVGFyZ2V0KG5ldyB0YXJnZXRzLkxhbWJkYUZ1bmN0aW9uKGZ1bmN0aW9uU3Vic2NyaXB0aW9uLmZ1bmN0aW9uKSk7XG5cbiAgICBjb25zdCBicmlkZ2VOYW1lID0gdGhpcy5nZXRDb25zdHJ1Y3ROYW1lKGV2ZW50QnJpZGdlKTtcbiAgICBjb25zdCBydWxlTmFtZSA9IHRoaXMuZ2V0Q29uc3RydWN0TmFtZShydWxlKTtcbiAgICBmdW5jdGlvblN1YnNjcmlwdGlvbi5tYXBwaW5nLmV2ZW50QnJpZGdlID0gYEV2ZW50QnJpZGdlUnVsZSMke2JyaWRnZU5hbWV9IyR7cnVsZU5hbWV9YDtcbiAgfVxuXG4gIHByaXZhdGUgaW50ZXJjZXB0RXZlbnRCdXMoZXZlbnRCdXM6IGV2ZW50cy5FdmVudEJ1cykge1xuICAgIGNvbnN0IGZ1bmN0aW9uU3Vic2NyaXB0aW9uID0gdGhpcy5wcm92aWRlRnVuY3Rpb25Gb3JTdWJzY3JpcHRpb24oXG4gICAgICAocykgPT4gIXMudXNlZEZvckV2ZW50QnJpZGdlXG4gICAgKTtcbiAgICBmdW5jdGlvblN1YnNjcmlwdGlvbi51c2VkRm9yRXZlbnRCcmlkZ2UgPSB0cnVlO1xuXG4gICAgY29uc3QgYnJpZGdlTmFtZSA9IHRoaXMuZ2V0Q29uc3RydWN0TmFtZShldmVudEJ1cyk7XG4gICAgY29uc3QgcnVsZSA9IG5ldyBldmVudHMuUnVsZSh0aGlzLCBgUnVsZUFsbCR7YnJpZGdlTmFtZX1gLCB7XG4gICAgICBldmVudEJ1cyxcbiAgICAgIGV2ZW50UGF0dGVybjogeyB2ZXJzaW9uOiBbJzAnXSB9LFxuICAgICAgdGFyZ2V0czogW25ldyB0YXJnZXRzLkxhbWJkYUZ1bmN0aW9uKGZ1bmN0aW9uU3Vic2NyaXB0aW9uLmZ1bmN0aW9uKV0sXG4gICAgfSk7XG5cbiAgICB0aGlzLm93bkNvbnRydWN0cy5wdXNoKHJ1bGUpO1xuICAgIGZ1bmN0aW9uU3Vic2NyaXB0aW9uLm1hcHBpbmcuZXZlbnRCcmlkZ2UgPSBgRXZlbnRCcmlkZ2UjJHticmlkZ2VOYW1lfWA7XG4gIH1cblxuICBwcml2YXRlIGludGVyY2VwdFNuc1RvcGljKHRvcGljOiBzbnMuVG9waWMpIHtcbiAgICBjb25zdCBmdW5jdGlvblN1YnNjcmlwdGlvbiA9IHRoaXMucHJvdmlkZUZ1bmN0aW9uRm9yU3Vic2NyaXB0aW9uKFxuICAgICAgKHMpID0+ICFzLnN1YnNyaWJlZFRvcGljcy5pbmNsdWRlcyh0b3BpYylcbiAgICApO1xuXG4gICAgdG9waWMuYWRkU3Vic2NyaXB0aW9uKFxuICAgICAgbmV3IHNuc1N1YnMuTGFtYmRhU3Vic2NyaXB0aW9uKGZ1bmN0aW9uU3Vic2NyaXB0aW9uLmZ1bmN0aW9uKVxuICAgICk7XG4gICAgY29uc3QgdG9waWNOYW1lID0gdGhpcy5nZXRDb25zdHJ1Y3ROYW1lKHRvcGljKTtcbiAgICBmdW5jdGlvblN1YnNjcmlwdGlvbi5tYXBwaW5nW3RvcGljLnRvcGljQXJuXSA9IGBTbnNUb3BpYyMke3RvcGljTmFtZX1gO1xuICAgIGZ1bmN0aW9uU3Vic2NyaXB0aW9uLnN1YnNyaWJlZFRvcGljcy5wdXNoKHRvcGljKTtcbiAgfVxuXG4gIHByaXZhdGUgaW50ZXJjZXB0U25zU3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbjogc25zLlN1YnNjcmlwdGlvbikge1xuICAgIGlmICghc3Vic2NyaXB0aW9uLm5vZGUuc2NvcGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB0b3BpYyA9IHRoaXMuZ2V0VG9waWMoXG4gICAgICAoc3Vic2NyaXB0aW9uLm5vZGUuZGVmYXVsdENoaWxkIGFzIHNucy5DZm5TdWJzY3JpcHRpb24pLnRvcGljQXJuXG4gICAgKTtcblxuICAgIGlmICghdG9waWMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2FuIG5vdCBmaW5kIFRvcGljJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZnVuY3Rpb25TdWJzY3JpcHRpb24gPSB0aGlzLnByb3ZpZGVGdW5jdGlvbkZvclN1YnNjcmlwdGlvbihcbiAgICAgIChzKSA9PiAhcy5zdWJzcmliZWRUb3BpY3MuaW5jbHVkZXModG9waWMpXG4gICAgKTtcblxuICAgIGNvbnN0IHsgZmlsdGVyUG9saWN5IH0gPSBzdWJzY3JpcHRpb24ubm9kZVxuICAgICAgLmRlZmF1bHRDaGlsZCBhcyBzbnMuQ2ZuU3Vic2NyaXB0aW9uO1xuXG4gICAgY29uc3Qgc3Vic2NyaXB0aW9uQ2xvbmUgPSB0b3BpYy5hZGRTdWJzY3JpcHRpb24oXG4gICAgICBuZXcgc25zU3Vicy5MYW1iZGFTdWJzY3JpcHRpb24oZnVuY3Rpb25TdWJzY3JpcHRpb24uZnVuY3Rpb24pXG4gICAgKTtcbiAgICAoc3Vic2NyaXB0aW9uQ2xvbmUubm9kZS5kZWZhdWx0Q2hpbGQgYXMgc25zLkNmblN1YnNjcmlwdGlvbikuZmlsdGVyUG9saWN5ID1cbiAgICAgIGZpbHRlclBvbGljeTtcblxuICAgIHRoaXMub3duQ29udHJ1Y3RzLnB1c2goc3Vic2NyaXB0aW9uQ2xvbmUpO1xuXG4gICAgY29uc3QgdG9waWNOYW1lID0gdGhpcy5nZXRDb25zdHJ1Y3ROYW1lKHRvcGljKTtcbiAgICBjb25zdCB0YXJnZXROYW1lID0gdGhpcy5nZXRDb25zdHJ1Y3ROYW1lKHN1YnNjcmlwdGlvbi5ub2RlLnNjb3BlKTtcblxuICAgIGZ1bmN0aW9uU3Vic2NyaXB0aW9uLnN1YnNyaWJlZFRvcGljcy5wdXNoKHRvcGljKTtcbiAgICBmdW5jdGlvblN1YnNjcmlwdGlvbi5tYXBwaW5nW1xuICAgICAgdG9waWMudG9waWNBcm5cbiAgICBdID0gYFNuc1N1YnNjcmlwdGlvbiMke3RvcGljTmFtZX0jJHt0YXJnZXROYW1lfWA7XG4gIH1cblxuICBwcml2YXRlIHByb3ZpZGVGdW5jdGlvbkZvclN1YnNjcmlwdGlvbihcbiAgICBmaWx0ZXJGdW5jdGlvbj86IChzdWJzY3JpcHRpb246IEZ1bmN0aW9uU3Vic2NyaXB0aW9uKSA9PiBib29sZWFuXG4gICkge1xuICAgIGxldCBmdW5jdGlvblN1YnNjcmlwdGlvbjogRnVuY3Rpb25TdWJzY3JpcHRpb24gfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAoZmlsdGVyRnVuY3Rpb24pIHtcbiAgICAgIGZ1bmN0aW9uU3Vic2NyaXB0aW9uID0gdGhpcy5mdW5jdGlvblN1YnNjcmlwdGlvblBvb2wuZmluZChmaWx0ZXJGdW5jdGlvbik7XG4gICAgfSBlbHNlIGlmICh0aGlzLmZ1bmN0aW9uU3Vic2NyaXB0aW9uUG9vbC5sZW5ndGggPiAwKSB7XG4gICAgICBmdW5jdGlvblN1YnNjcmlwdGlvbiA9IHRoaXMuZnVuY3Rpb25TdWJzY3JpcHRpb25Qb29sWzBdO1xuICAgIH1cblxuICAgIGlmICghZnVuY3Rpb25TdWJzY3JpcHRpb24pIHtcbiAgICAgIGZ1bmN0aW9uU3Vic2NyaXB0aW9uID0ge1xuICAgICAgICBzdWJzcmliZWRUb3BpY3M6IFtdLFxuICAgICAgICB1c2VkRm9yRXZlbnRCcmlkZ2U6IGZhbHNlLFxuICAgICAgICBtYXBwaW5nOiB7fSxcbiAgICAgICAgZnVuY3Rpb246IHRoaXMuY3JlYXRlRnVuY3Rpb25Gb3JTdWJzY3JpcHRpb24oXG4gICAgICAgICAgdGhpcy5mdW5jdGlvblN1YnNjcmlwdGlvblBvb2wubGVuZ3RoXG4gICAgICAgICksXG4gICAgICB9O1xuICAgICAgdGhpcy5mdW5jdGlvblN1YnNjcmlwdGlvblBvb2wucHVzaChmdW5jdGlvblN1YnNjcmlwdGlvbik7XG4gICAgfVxuICAgIHJldHVybiBmdW5jdGlvblN1YnNjcmlwdGlvbjtcbiAgfVxuXG4gIHByaXZhdGUgaW50ZXJjZXB0RnVuY3Rpb24oZnVuYzogbGFtYmRhLkZ1bmN0aW9uKSB7XG4gICAgZnVuYy5hZGRMYXllcnModGhpcy5leHRlbnNpb25MYXllcik7XG4gICAgdGhpcy5mdW5jdGlvblN1YnNjcmlwdGlvbk1haW4uZnVuY3Rpb24uZ3JhbnRJbnZva2UoZnVuYyk7XG5cbiAgICBjb25zdCBmdW5jdGlvbk5hbWUgPSB0aGlzLmdldENvbnN0cnVjdE5hbWUoZnVuYyk7XG5cbiAgICBmdW5jLmFkZEVudmlyb25tZW50KCdGVU5DVElPTl9OQU1FJywgZnVuY3Rpb25OYW1lKTtcbiAgICBmdW5jLmFkZEVudmlyb25tZW50KCdBV1NfTEFNQkRBX0VYRUNfV1JBUFBFUicsICcvb3B0L3NweS13cmFwcGVyJyk7XG4gICAgZnVuYy5hZGRFbnZpcm9ubWVudChcbiAgICAgICdGTFVFTlRfVEVTVF9TRU5EX0ZVTkNUSU9OX05BTUUnLFxuICAgICAgdGhpcy5mdW5jdGlvblN1YnNjcmlwdGlvbk1haW4uZnVuY3Rpb24uZnVuY3Rpb25OYW1lXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDb25zdHJ1Y3ROYW1lKGNvbnN0cnVjdDogSUNvbnN0cnVjdCkge1xuICAgIGxldCBmdW5jdGlvbk5hbWUgPSBjb25zdHJ1Y3Qubm9kZS5wYXRoO1xuICAgIGNvbnN0IHsgc3RhY2tOYW1lIH0gPSBTdGFjay5vZih0aGlzKTtcblxuICAgIGlmIChmdW5jdGlvbk5hbWUuc3RhcnRzV2l0aChzdGFja05hbWUpKSB7XG4gICAgICBmdW5jdGlvbk5hbWUgPSBmdW5jdGlvbk5hbWUuc3Vic3RyaW5nKHN0YWNrTmFtZS5sZW5ndGggKyAxKTtcbiAgICB9XG4gICAgcmV0dXJuIGZ1bmN0aW9uTmFtZTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VG9waWModG9waWNBcm46IHN0cmluZyk6IHNucy5Ub3BpYyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgdG9waWMgPSB0aGlzLmZpbmRFbGVtZW50PHNucy5Ub3BpYz4oXG4gICAgICAobm9kZTogSUNvbnN0cnVjdCkgPT5cbiAgICAgICAgbm9kZSBpbnN0YW5jZW9mIHNucy5Ub3BpYyAmJiAobm9kZSBhcyBzbnMuVG9waWMpLnRvcGljQXJuID09PSB0b3BpY0FyblxuICAgICk7XG5cbiAgICByZXR1cm4gdG9waWM7XG4gIH1cblxuICBwcml2YXRlIGdldEV2ZW50QnJpZGdlKGV2ZW50QnVzTmFtZTogc3RyaW5nKTogZXZlbnRzLkV2ZW50QnVzIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBldmVudEJyaWRnZSA9IHRoaXMuZmluZEVsZW1lbnQ8ZXZlbnRzLkV2ZW50QnVzPihcbiAgICAgIChub2RlOiBJQ29uc3RydWN0KSA9PlxuICAgICAgICBub2RlIGluc3RhbmNlb2YgZXZlbnRzLkV2ZW50QnVzICYmXG4gICAgICAgIChub2RlIGFzIGV2ZW50cy5FdmVudEJ1cykuZXZlbnRCdXNOYW1lID09PSBldmVudEJ1c05hbWVcbiAgICApO1xuXG4gICAgcmV0dXJuIGV2ZW50QnJpZGdlO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kRWxlbWVudDxUIGV4dGVuZHMgSUNvbnN0cnVjdCA9IElDb25zdHJ1Y3Q+KFxuICAgIGZpbHRlckZ1bmM6IChub2RlOiBJQ29uc3RydWN0KSA9PiBib29sZWFuLFxuICAgIHBhcmVudD86IElDb25zdHJ1Y3RcbiAgKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFwYXJlbnQpIHtcbiAgICAgIHBhcmVudCA9IFN0YWNrLm9mKHRoaXMpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3Qgbm9kZSBvZiBwYXJlbnQubm9kZS5jaGlsZHJlbikge1xuICAgICAgaWYgKGZpbHRlckZ1bmMobm9kZSkpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUgYXMgVDtcbiAgICAgIH1cbiAgICAgIHRoaXMuZmluZEVsZW1lbnQ8VD4oZmlsdGVyRnVuYywgbm9kZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG50eXBlIEZ1bmN0aW9uU3Vic2NyaXB0aW9uID0ge1xuICBzdWJzcmliZWRUb3BpY3M6IHNucy5Ub3BpY1tdO1xuICB1c2VkRm9yRXZlbnRCcmlkZ2U6IGJvb2xlYW47XG4gIGZ1bmN0aW9uOiBsYW1iZGFOb2RlLk5vZGVqc0Z1bmN0aW9uO1xuICBtYXBwaW5nOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xufTtcbiJdfQ==
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import * as http from 'http';
|
|
3
|
+
import * as path from 'path';
|
|
4
|
+
import { getWebSocketUrl } from '../common/getWebSocketUrl';
|
|
5
|
+
async function run() {
|
|
6
|
+
const cdkExportFileName = '../.spy/cdkExports.json';
|
|
7
|
+
let serverlessSpyWsUrl;
|
|
8
|
+
if (fs.existsSync(cdkExportFileName)) {
|
|
9
|
+
const rawdata = fs.readFileSync(cdkExportFileName);
|
|
10
|
+
const config = JSON.parse(rawdata.toString());
|
|
11
|
+
if (config && config[Object.keys(config)[0]]) {
|
|
12
|
+
// get first ServerlessSpyWsUrl
|
|
13
|
+
// {
|
|
14
|
+
// "my-stack": {
|
|
15
|
+
// "ServerlessSpyWsUrl": "xxx"
|
|
16
|
+
// }
|
|
17
|
+
// }
|
|
18
|
+
serverlessSpyWsUrl = config[Object.keys(config)[0]].ServerlessSpyWsUrl;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
serverlessSpyWsUrl =
|
|
22
|
+
'wss://preh1xo1xh.execute-api.eu-west-1.amazonaws.com/prod';
|
|
23
|
+
if (!serverlessSpyWsUrl) {
|
|
24
|
+
throw new Error('Missing WS url');
|
|
25
|
+
}
|
|
26
|
+
console.log('serverlessSpyWsUrl', serverlessSpyWsUrl);
|
|
27
|
+
const wsUrl = await getWebSocketUrl(serverlessSpyWsUrl);
|
|
28
|
+
// source https://developer.mozilla.org/en-US/docs/Learn/Server-side/Node_server_without_framework
|
|
29
|
+
http
|
|
30
|
+
.createServer((request, response) => {
|
|
31
|
+
console.log('request ', request.url);
|
|
32
|
+
let filePath = `.${request.url}`;
|
|
33
|
+
if (filePath === './') {
|
|
34
|
+
filePath = './index.html';
|
|
35
|
+
}
|
|
36
|
+
const extname = String(path.extname(filePath)).toLowerCase();
|
|
37
|
+
const mimeTypes = {
|
|
38
|
+
'.html': 'text/html',
|
|
39
|
+
'.js': 'text/javascript',
|
|
40
|
+
'.css': 'text/css',
|
|
41
|
+
'.json': 'application/json',
|
|
42
|
+
'.png': 'image/png',
|
|
43
|
+
'.jpg': 'image/jpg',
|
|
44
|
+
'.gif': 'image/gif',
|
|
45
|
+
'.svg': 'image/svg+xml',
|
|
46
|
+
'.wav': 'audio/wav',
|
|
47
|
+
'.mp4': 'video/mp4',
|
|
48
|
+
'.woff': 'application/font-woff',
|
|
49
|
+
'.ttf': 'application/font-ttf',
|
|
50
|
+
'.eot': 'application/vnd.ms-fontobject',
|
|
51
|
+
'.otf': 'application/font-otf',
|
|
52
|
+
'.wasm': 'application/wasm',
|
|
53
|
+
};
|
|
54
|
+
const contentType = mimeTypes[extname] || 'application/octet-stream';
|
|
55
|
+
fs.readFile(filePath, (error, content) => {
|
|
56
|
+
if (error) {
|
|
57
|
+
if (error.code === 'ENOENT') {
|
|
58
|
+
fs.readFile('./404.html', (_err, cont) => {
|
|
59
|
+
response.writeHead(404, { 'Content-Type': 'text/html' });
|
|
60
|
+
response.end(cont, 'utf-8');
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
response.writeHead(500);
|
|
65
|
+
response.end(`Sorry, check with the site admin for error: ${error.code} ..\n`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
response.writeHead(200, { 'Content-Type': contentType });
|
|
70
|
+
if (request.url === '/serverlessSpy.js') {
|
|
71
|
+
const contentNew = content
|
|
72
|
+
.toString()
|
|
73
|
+
.replace('SERVERLESS_SPY_WS_URL', wsUrl);
|
|
74
|
+
response.end(contentNew, 'utf-8');
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
response.end(content, 'utf-8');
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
})
|
|
82
|
+
.listen(8125);
|
|
83
|
+
}
|
|
84
|
+
run().catch(console.error);
|
|
85
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vY2xpL2NsaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxNQUFNLElBQUksQ0FBQztBQUN6QixPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFNUQsS0FBSyxVQUFVLEdBQUc7SUFDaEIsTUFBTSxpQkFBaUIsR0FBRyx5QkFBeUIsQ0FBQztJQUVwRCxJQUFJLGtCQUFzQyxDQUFDO0lBQzNDLElBQUksRUFBRSxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFO1FBQ3BDLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUNuRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBRTlDLElBQUksTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDNUMsK0JBQStCO1lBQy9CLElBQUk7WUFDSixrQkFBa0I7WUFDbEIsa0NBQWtDO1lBQ2xDLE1BQU07WUFDTixJQUFJO1lBRUosa0JBQWtCLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQztTQUN4RTtLQUNGO0lBRUQsa0JBQWtCO1FBQ2hCLDJEQUEyRCxDQUFDO0lBRTlELElBQUksQ0FBQyxrQkFBa0IsRUFBRTtRQUN2QixNQUFNLElBQUksS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUM7S0FDbkM7SUFFRCxPQUFPLENBQUMsR0FBRyxDQUFD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cyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBodHRwIGZyb20gJ2h0dHAnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IGdldFdlYlNvY2tldFVybCB9IGZyb20gJy4uL2NvbW1vbi9nZXRXZWJTb2NrZXRVcmwnO1xuXG5hc3luYyBmdW5jdGlvbiBydW4oKSB7XG4gIGNvbnN0IGNka0V4cG9ydEZpbGVOYW1lID0gJy4uLy5zcHkvY2RrRXhwb3J0cy5qc29uJztcblxuICBsZXQgc2VydmVybGVzc1NweVdzVXJsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGlmIChmcy5leGlzdHNTeW5jKGNka0V4cG9ydEZpbGVOYW1lKSkge1xuICAgIGNvbnN0IHJhd2RhdGEgPSBmcy5yZWFkRmlsZVN5bmMoY2RrRXhwb3J0RmlsZU5hbWUpO1xuICAgIGNvbnN0IGNvbmZpZyA9IEpTT04ucGFyc2UocmF3ZGF0YS50b1N0cmluZygpKTtcblxuICAgIGlmIChjb25maWcgJiYgY29uZmlnW09iamVjdC5rZXlzKGNvbmZpZylbMF1dKSB7XG4gICAgICAvLyBnZXQgZmlyc3QgU2VydmVybGVzc1NweVdzVXJsXG4gICAgICAvLyB7XG4gICAgICAvLyAgIFwibXktc3RhY2tcIjoge1xuICAgICAgLy8gICAgIFwiU2VydmVybGVzc1NweVdzVXJsXCI6IFwieHh4XCJcbiAgICAgIC8vICAgfVxuICAgICAgLy8gfVxuXG4gICAgICBzZXJ2ZXJsZXNzU3B5V3NVcmwgPSBjb25maWdbT2JqZWN0LmtleXMoY29uZmlnKVswXV0uU2VydmVybGVzc1NweVdzVXJsO1xuICAgIH1cbiAgfVxuXG4gIHNlcnZlcmxlc3NTcHlXc1VybCA9XG4gICAgJ3dzczovL3ByZWgxeG8xeGguZXhlY3V0ZS1hcGkuZXUtd2VzdC0xLmFtYXpvbmF3cy5jb20vcHJvZCc7XG5cbiAgaWYgKCFzZXJ2ZXJsZXNzU3B5V3NVcmwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgV1MgdXJsJyk7XG4gIH1cblxuICBjb25zb2xlLmxvZygnc2VydmVybGVzc1NweVdzVXJsJywgc2VydmVybGVzc1NweVdzVXJsKTtcblxuICBjb25zdCB3c1VybCA9IGF3YWl0IGdldFdlYlNvY2tldFVybChzZXJ2ZXJsZXNzU3B5V3NVcmwpO1xuXG4gIC8vIHNvdXJjZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL0xlYXJuL1NlcnZlci1zaWRlL05vZGVfc2VydmVyX3dpdGhvdXRfZnJhbWV3b3JrXG4gIGh0dHBcbiAgICAuY3JlYXRlU2VydmVyKChyZXF1ZXN0LCByZXNwb25zZSkgPT4ge1xuICAgICAgY29uc29sZS5sb2coJ3JlcXVlc3QgJywgcmVxdWVzdC51cmwpO1xuXG4gICAgICBsZXQgZmlsZVBhdGggPSBgLiR7cmVxdWVzdC51cmx9YDtcbiAgICAgIGlmIChmaWxlUGF0aCA9PT0gJy4vJykge1xuICAgICAgICBmaWxlUGF0aCA9ICcuL2luZGV4Lmh0bWwnO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBleHRuYW1lID0gU3RyaW5nKHBhdGguZXh0bmFtZShmaWxlUGF0aCkpLnRvTG93ZXJDYXNlKCk7XG4gICAgICBjb25zdCBtaW1lVHlwZXM6IGFueSA9IHtcbiAgICAgICAgJy5odG1sJzogJ3RleHQvaHRtbCcsXG4gICAgICAgICcuanMnOiAndGV4dC9qYXZhc2NyaXB0JyxcbiAgICAgICAgJy5jc3MnOiAndGV4dC9jc3MnLFxuICAgICAgICAnLmpzb24nOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICcucG5nJzogJ2ltYWdlL3BuZycsXG4gICAgICAgICcuanBnJzogJ2ltYWdlL2pwZycsXG4gICAgICAgICcuZ2lmJzogJ2ltYWdlL2dpZicsXG4gICAgICAgICcuc3ZnJzogJ2ltYWdlL3N2Zyt4bWwnLFxuICAgICAgICAnLndhdic6ICdhdWRpby93YXYnLFxuICAgICAgICAnLm1wNCc6ICd2aWRlby9tcDQnLFxuICAgICAgICAnLndvZmYnOiAnYXBwbGljYXRpb24vZm9udC13b2ZmJyxcbiAgICAgICAgJy50dGYnOiAnYXBwbGljYXRpb24vZm9udC10dGYnLFxuICAgICAgICAnLmVvdCc6ICdhcHBsaWNhdGlvbi92bmQubXMtZm9udG9iamVjdCcsXG4gICAgICAgICcub3RmJzogJ2FwcGxpY2F0aW9uL2ZvbnQtb3RmJyxcbiAgICAgICAgJy53YXNtJzogJ2FwcGxpY2F0aW9uL3dhc20nLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgY29udGVudFR5cGUgPSBtaW1lVHlwZXNbZXh0bmFtZV0gfHwgJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSc7XG5cbiAgICAgIGZzLnJlYWRGaWxlKGZpbGVQYXRoLCAoZXJyb3IsIGNvbnRlbnQpID0+IHtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgaWYgKGVycm9yLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICAgICAgICBmcy5yZWFkRmlsZSgnLi80MDQuaHRtbCcsIChfZXJyLCBjb250KSA9PiB7XG4gICAgICAgICAgICAgIHJlc3BvbnNlLndyaXRlSGVhZCg0MDQsIHsgJ0NvbnRlbnQtVHlwZSc6ICd0ZXh0L2h0bWwnIH0pO1xuICAgICAgICAgICAgICByZXNwb25zZS5lbmQoY29udCwgJ3V0Zi04Jyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzcG9uc2Uud3JpdGVIZWFkKDUwMCk7XG4gICAgICAgICAgICByZXNwb25zZS5lbmQoXG4gICAgICAgICAgICAgIGBTb3JyeSwgY2hlY2sgd2l0aCB0aGUgc2l0ZSBhZG1pbiBmb3IgZXJyb3I6ICR7ZXJyb3IuY29kZX0gLi5cXG5gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNwb25zZS53cml0ZUhlYWQoMjAwLCB7ICdDb250ZW50LVR5cGUnOiBjb250ZW50VHlwZSB9KTtcbiAgICAgICAgICBpZiAocmVxdWVzdC51cmwgPT09ICcvc2VydmVybGVzc1NweS5qcycpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnROZXcgPSBjb250ZW50XG4gICAgICAgICAgICAgIC50b1N0cmluZygpXG4gICAgICAgICAgICAgIC5yZXBsYWNlKCdTRVJWRVJMRVNTX1NQWV9XU19VUkwnLCB3c1VybCk7XG4gICAgICAgICAgICByZXNwb25zZS5lbmQoY29udGVudE5ldywgJ3V0Zi04Jyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc3BvbnNlLmVuZChjb250ZW50LCAndXRmLTgnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pXG4gICAgLmxpc3Rlbig4MTI1KTtcbn1cblxucnVuKCkuY2F0Y2goY29uc29sZS5lcnJvcik7XG4iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import * as readline from 'readline';
|
|
3
|
+
import WebSocket from 'ws';
|
|
4
|
+
import { getWebSocketUrl } from '../common/getWebSocketUrl';
|
|
5
|
+
async function run() {
|
|
6
|
+
// var credentialsProvider = awsCp.fromTemporaryCredentials();
|
|
7
|
+
// const credentials = await credentialsProvider();
|
|
8
|
+
// const client = new STSClient({});
|
|
9
|
+
// client.send()
|
|
10
|
+
// const command = new GetSessionTokenCommand({});
|
|
11
|
+
// const { Credentials: credentials } = await client.send(command);
|
|
12
|
+
// //const credentials = s.Credentials;
|
|
13
|
+
// console.log("credentials", credentials);
|
|
14
|
+
// const url = process.argv[2];
|
|
15
|
+
const url = 'wss://preh1xo1xh.execute-api.eu-west-1.amazonaws.com/prod';
|
|
16
|
+
// https://medium.com/@o.bredenberg/iam-sign-your-api-gateway-websocket-connection-request-no-custom-auth-from-your-frontend-65451166757d
|
|
17
|
+
const url2 = await getWebSocketUrl(url);
|
|
18
|
+
const ws = new WebSocket(url2);
|
|
19
|
+
const fileDescriptor = fs.openSync('spy_log.json', 'w');
|
|
20
|
+
// 📢📁⚡️💾 💽 💾 💿 📀🛢🪣📑🔊
|
|
21
|
+
ws.on('open', () => console.log(`connected ${new Date().toISOString()}`));
|
|
22
|
+
ws.on('message', (data) => {
|
|
23
|
+
// console.log(`From server: ${data}`);
|
|
24
|
+
let parsed;
|
|
25
|
+
try {
|
|
26
|
+
parsed = JSON.parse(data);
|
|
27
|
+
}
|
|
28
|
+
catch (err) {
|
|
29
|
+
console.error(`Can not parse ${data}`);
|
|
30
|
+
}
|
|
31
|
+
if (parsed) {
|
|
32
|
+
console.log(`\x1b[47m\x1b[34m${parsed.timestamp} \x1b[31m🍕 ${parsed.serviceKey}\x1b[0m\x1b[32m\n${JSON.stringify(parsed.data, null, 2)}\x1b[0m`);
|
|
33
|
+
}
|
|
34
|
+
fs.write(fileDescriptor, data, (error) => {
|
|
35
|
+
if (!error) {
|
|
36
|
+
// fs.close(fileDescriptor);
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
console.error(error);
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
fs.write(fileDescriptor, '\n', (error) => {
|
|
43
|
+
if (!error) {
|
|
44
|
+
// fs.close(fileDescriptor);
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
console.error(error);
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
ws.on('close', () => {
|
|
52
|
+
console.log(`disconnected ${new Date().toISOString()}`);
|
|
53
|
+
fs.close(fileDescriptor, () => undefined);
|
|
54
|
+
process.exit();
|
|
55
|
+
});
|
|
56
|
+
readline
|
|
57
|
+
.createInterface({
|
|
58
|
+
input: process.stdin,
|
|
59
|
+
output: process.stdout,
|
|
60
|
+
})
|
|
61
|
+
.on('line', (data) => {
|
|
62
|
+
ws.send(data);
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
run().catch(console.error);
|
|
66
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9jbGkvd3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDekIsT0FBTyxLQUFLLFFBQVEsTUFBTSxVQUFVLENBQUM7QUFDckMsT0FBTyxTQUFTLE1BQU0sSUFBSSxDQUFDO0FBQzNCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUU1RCxLQUFLLFVBQVUsR0FBRztJQUNoQiw4REFBOEQ7SUFDOUQsbURBQW1EO0lBRW5ELG9DQUFvQztJQUNwQyxnQkFBZ0I7SUFFaEIsa0RBQWtEO0lBQ2xELG1FQUFtRTtJQUNuRSx1Q0FBdUM7SUFFdkMsMkNBQTJDO0lBRTNDLCtCQUErQjtJQUMvQixNQUFNLEdBQUcsR0FBRywyREFBMkQsQ0FBQztJQUV4RSx5SUFBeUk7SUFDekksTUFBTSxJQUFJLEdBQUcsTUFBTSxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFeEMsTUFBTSxFQUFFLEdBQUcsSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFL0IsTUFBTSxjQUFjLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxjQUFjLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDeEQsK0JBQStCO0lBRS9CLEVBQUUsQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsYUFBYSxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUMsSUFBUyxFQUFFLEVBQUU7UUFDN0IsdUNBQXVDO1FBRXZDLElBQUksTUFBTSxDQUFDO1FBQ1gsSUFBSTtZQUNGLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzNCO1FBQUMsT0FBTyxHQUFHLEVBQUU7WUFDWixPQUFPLENBQUMsS0FBSyxDQUFDLGlCQUFpQixJQUFJLEVBQUUsQ0FBQyxDQUFDO1NBQ3hDO1FBRUQsSUFBSSxNQUFNLEVBQUU7WUFDVixPQUFPLENBQUMsR0FBRyxDQUNULG1CQUFtQixNQUFNLENBQUMsU0FBUyxlQUNqQyxNQUFNLENBQUMsVUFDVCxvQkFBb0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsU0FBUyxDQUNsRSxDQUFDO1NBQ0g7UUFFRCxFQUFFLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUN2QyxJQUFJLENBQUMsS0FBSyxFQUFFO2dCQUNWLDRCQUE0QjthQUM3QjtpQkFBTTtnQkFDTCxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ3RCO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxFQUFFLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUN2QyxJQUFJLENBQUMsS0FBSyxFQUFFO2dCQUNWLDRCQUE0QjthQUM3QjtpQkFBTTtnQkFDTCxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ3RCO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUNILEVBQUUsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRTtRQUNsQixPQUFPLENBQUMsR0FBRyxDQUFDLGdCQUFnQixJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN4RCxFQUFFLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMxQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDakIsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRO1NBQ0wsZUFBZSxDQUFDO1FBQ2YsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLO1FBQ3BCLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTTtLQUN2QixDQUFDO1NBQ0QsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFO1FBQ25CLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDaEIsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDO0FBQ0QsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIHJlYWRsaW5lIGZyb20gJ3JlYWRsaW5lJztcbmltcG9ydCBXZWJTb2NrZXQgZnJvbSAnd3MnO1xuaW1wb3J0IHsgZ2V0V2ViU29ja2V0VXJsIH0gZnJvbSAnLi4vY29tbW9uL2dldFdlYlNvY2tldFVybCc7XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1bigpIHtcbiAgLy8gdmFyIGNyZWRlbnRpYWxzUHJvdmlkZXIgPSBhd3NDcC5mcm9tVGVtcG9yYXJ5Q3JlZGVudGlhbHMoKTtcbiAgLy8gY29uc3QgY3JlZGVudGlhbHMgPSBhd2FpdCBjcmVkZW50aWFsc1Byb3ZpZGVyKCk7XG5cbiAgLy8gY29uc3QgY2xpZW50ID0gbmV3IFNUU0NsaWVudCh7fSk7XG4gIC8vIGNsaWVudC5zZW5kKClcblxuICAvLyBjb25zdCBjb21tYW5kID0gbmV3IEdldFNlc3Npb25Ub2tlbkNvbW1hbmQoe30pO1xuICAvLyBjb25zdCB7IENyZWRlbnRpYWxzOiBjcmVkZW50aWFscyB9ID0gYXdhaXQgY2xpZW50LnNlbmQoY29tbWFuZCk7XG4gIC8vIC8vY29uc3QgY3JlZGVudGlhbHMgPSBzLkNyZWRlbnRpYWxzO1xuXG4gIC8vIGNvbnNvbGUubG9nKFwiY3JlZGVudGlhbHNcIiwgY3JlZGVudGlhbHMpO1xuXG4gIC8vIGNvbnN0IHVybCA9IHByb2Nlc3MuYXJndlsyXTtcbiAgY29uc3QgdXJsID0gJ3dzczovL3ByZWgxeG8xeGguZXhlY3V0ZS1hcGkuZXUtd2VzdC0xLmFtYXpvbmF3cy5jb20vcHJvZCc7XG5cbiAgLy8gaHR0cHM6Ly9tZWRpdW0uY29tL0BvLmJyZWRlbmJlcmcvaWFtLXNpZ24teW91ci1hcGktZ2F0ZXdheS13ZWJzb2NrZXQtY29ubmVjdGlvbi1yZXF1ZXN0LW5vLWN1c3RvbS1hdXRoLWZyb20teW91ci1mcm9udGVuZC02NTQ1MTE2Njc1N2RcbiAgY29uc3QgdXJsMiA9IGF3YWl0IGdldFdlYlNvY2tldFVybCh1cmwpO1xuXG4gIGNvbnN0IHdzID0gbmV3IFdlYlNvY2tldCh1cmwyKTtcblxuICBjb25zdCBmaWxlRGVzY3JpcHRvciA9IGZzLm9wZW5TeW5jKCdzcHlfbG9nLmpzb24nLCAndycpO1xuICAvLyDwn5Oi8J+TgeKaoe+4j/Cfkr4g8J+SvSDwn5K+IPCfkr8g8J+TgPCfm6Lwn6qj8J+TkfCflIpcblxuICB3cy5vbignb3BlbicsICgpID0+IGNvbnNvbGUubG9nKGBjb25uZWN0ZWQgJHtuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCl9YCkpO1xuICB3cy5vbignbWVzc2FnZScsIChkYXRhOiBhbnkpID0+IHtcbiAgICAvLyBjb25zb2xlLmxvZyhgRnJvbSBzZXJ2ZXI6ICR7ZGF0YX1gKTtcblxuICAgIGxldCBwYXJzZWQ7XG4gICAgdHJ5IHtcbiAgICAgIHBhcnNlZCA9IEpTT04ucGFyc2UoZGF0YSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBDYW4gbm90IHBhcnNlICR7ZGF0YX1gKTtcbiAgICB9XG5cbiAgICBpZiAocGFyc2VkKSB7XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgYFxceDFiWzQ3bVxceDFiWzM0bSR7cGFyc2VkLnRpbWVzdGFtcH0gXFx4MWJbMzFt8J+NlSAke1xuICAgICAgICAgIHBhcnNlZC5zZXJ2aWNlS2V5XG4gICAgICAgIH1cXHgxYlswbVxceDFiWzMybVxcbiR7SlNPTi5zdHJpbmdpZnkocGFyc2VkLmRhdGEsIG51bGwsIDIpfVxceDFiWzBtYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBmcy53cml0ZShmaWxlRGVzY3JpcHRvciwgZGF0YSwgKGVycm9yKSA9PiB7XG4gICAgICBpZiAoIWVycm9yKSB7XG4gICAgICAgIC8vIGZzLmNsb3NlKGZpbGVEZXNjcmlwdG9yKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGZzLndyaXRlKGZpbGVEZXNjcmlwdG9yLCAnXFxuJywgKGVycm9yKSA9PiB7XG4gICAgICBpZiAoIWVycm9yKSB7XG4gICAgICAgIC8vIGZzLmNsb3NlKGZpbGVEZXNjcmlwdG9yKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbiAgd3Mub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgIGNvbnNvbGUubG9nKGBkaXNjb25uZWN0ZWQgJHtuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCl9YCk7XG4gICAgZnMuY2xvc2UoZmlsZURlc2NyaXB0b3IsICgpID0+IHVuZGVmaW5lZCk7XG4gICAgcHJvY2Vzcy5leGl0KCk7XG4gIH0pO1xuXG4gIHJlYWRsaW5lXG4gICAgLmNyZWF0ZUludGVyZmFjZSh7XG4gICAgICBpbnB1dDogcHJvY2Vzcy5zdGRpbixcbiAgICAgIG91dHB1dDogcHJvY2Vzcy5zdGRvdXQsXG4gICAgfSlcbiAgICAub24oJ2xpbmUnLCAoZGF0YSkgPT4ge1xuICAgICAgd3Muc2VuZChkYXRhKTtcbiAgICB9KTtcbn1cbnJ1bigpLmNhdGNoKGNvbnNvbGUuZXJyb3IpO1xuIl19
|