diff --git a/indexer/Dockerfile.auxo.remote b/indexer/Dockerfile.auxo.remote index 1d43896fd6..5b2145a1dd 100644 --- a/indexer/Dockerfile.auxo.remote +++ b/indexer/Dockerfile.auxo.remote @@ -6,6 +6,9 @@ WORKDIR /usr/app # Copy pnpm lock and workspace and package.json from base directory COPY ./pnpm-lock.yaml ./pnpm-workspace.yaml ./package.json ./ +# Copy patches +COPY ./patches ./patches + # Copy auxo and imported packages COPY ./packages/base/ ./packages/base/ COPY ./packages/v4-protos/ ./packages/v4-protos/ @@ -19,7 +22,7 @@ COPY tsconfig.json ./ RUN npm install -g pnpm@6 # Install npm modules using pnpm -RUN pnpm install --loglevel warn --frozen-lockfile +RUN pnpm install --loglevel warn --frozen-lockfile --unsafe-perm RUN pnpm run build:prod:all FROM public.ecr.aws/lambda/nodejs:16 diff --git a/indexer/Dockerfile.bazooka.remote b/indexer/Dockerfile.bazooka.remote index f5867721c8..0d7a711e06 100644 --- a/indexer/Dockerfile.bazooka.remote +++ b/indexer/Dockerfile.bazooka.remote @@ -4,7 +4,10 @@ FROM public.ecr.aws/lambda/nodejs:16 as builder WORKDIR /usr/app # Copy pnpm lock and workspace and package.json from base directory -COPY ./pnpm-lock.yaml ./pnpm-workspace.yaml ./package.json ./ +COPY ./pnpm-lock.yaml ./pnpm-workspace.yaml ./package.json ./patches ./ + +# Copy patches +COPY ./patches ./patches # Copy bazooka and imported packages COPY ./packages/base/ ./packages/base/ @@ -22,7 +25,7 @@ COPY tsconfig.json ./ RUN npm install -g pnpm@6 # Install npm modules using pnpm -RUN pnpm install --loglevel warn --frozen-lockfile +RUN pnpm install --loglevel warn --frozen-lockfile --unsafe-perm RUN pnpm run build:prod:all FROM public.ecr.aws/lambda/nodejs:16 diff --git a/indexer/Dockerfile.postgres-package.local b/indexer/Dockerfile.postgres-package.local index 1d4f6fe0fe..916b88467e 100644 --- a/indexer/Dockerfile.postgres-package.local +++ b/indexer/Dockerfile.postgres-package.local @@ -11,6 +11,9 @@ WORKDIR /home/dydx/app # Copy pnpm lock and workspace and package.json from base directory COPY ./pnpm-lock.yaml ./pnpm-workspace.yaml ./package.json ./ +# Copy patches +COPY ./patches ./patches + # Copy package.json from postgres and imported packages being run COPY ./packages/base/package.json ./packages/base/ COPY ./packages/postgres/package.json ./packages/postgres/ @@ -37,7 +40,7 @@ RUN chown dydx -R /home/dydx/app USER dydx # Install npm modules using pnpm -RUN pnpm i --loglevel warn --production --frozen-lockfile +RUN pnpm i --loglevel warn --production --frozen-lockfile --unsafe-perm WORKDIR /home/dydx/app/packages/postgres diff --git a/indexer/Dockerfile.service.local b/indexer/Dockerfile.service.local index 5237caba53..5a41b57dde 100644 --- a/indexer/Dockerfile.service.local +++ b/indexer/Dockerfile.service.local @@ -13,6 +13,9 @@ WORKDIR /home/dydx/app # Copy pnpm lock and workspace and package.json from base directory COPY ./pnpm-lock.yaml ./pnpm-workspace.yaml ./package.json ./ +# Copy patches +COPY ./patches ./patches + # Copy package.json from all packages being run COPY ./packages/base/package.json ./packages/base/ COPY ./packages/kafka/package.json ./packages/kafka/ @@ -42,7 +45,7 @@ COPY ./scripts/container-run.sh /home/dydx/app/services/$service/scripts/ RUN chown dydx -R /home/dydx/app USER dydx -RUN pnpm i --loglevel warn --production --frozen-lockfile +RUN pnpm i --loglevel warn --production --frozen-lockfile --unsafe-perm WORKDIR /home/dydx/app/services/$service diff --git a/indexer/Dockerfile.service.remote b/indexer/Dockerfile.service.remote index 582273b32b..c8eff5063a 100644 --- a/indexer/Dockerfile.service.remote +++ b/indexer/Dockerfile.service.remote @@ -13,6 +13,9 @@ WORKDIR /home/dydx/app # Copy pnpm lock and workspace and package.json from base directory COPY ./pnpm-lock.yaml ./pnpm-workspace.yaml ./package.json ./ +# Copy patches +COPY ./patches ./patches + # Copy package.json from all packages being run COPY ./packages/base/package.json ./packages/base/ COPY ./packages/kafka/package.json ./packages/kafka/ @@ -42,7 +45,7 @@ COPY ./scripts/container-run.sh /home/dydx/app/services/$service/scripts/ RUN chown dydx -R /home/dydx/app # Install npm modules using pnpm -RUN pnpm i --loglevel warn --production --frozen-lockfile +RUN pnpm i --loglevel warn --production --frozen-lockfile --unsafe-perm USER dydx diff --git a/indexer/package.json b/indexer/package.json index ce29744048..30cab042a3 100644 --- a/indexer/package.json +++ b/indexer/package.json @@ -13,8 +13,15 @@ "lint:all": "pnpm run --parallel lint", "lint:fix:all": "pnpm run --parallel lint:fix", "coverage:all": "pnpm recursive run --workspace-concurrency=1 coverage", - "test:all": "pnpm recursive run --workspace-concurrency=1 test" + "test:all": "pnpm recursive run --workspace-concurrency=1 test", + "postinstall": "patch-package" }, "author": "", - "license": "AGPL-3.0" + "license": "AGPL-3.0", + "dependencies": { + "@milahu/patch-package": "6.4.14" + }, + "devDependencies": { + "@types/ws": "8.5.10" + } } diff --git a/indexer/patches/@types+ws+8.5.10.patch b/indexer/patches/@types+ws+8.5.10.patch new file mode 100644 index 0000000000..ca5d3f6847 --- /dev/null +++ b/indexer/patches/@types+ws+8.5.10.patch @@ -0,0 +1,22 @@ +# generated by patch-package 6.4.14 +# +# declared package: +# @types/ws: 8.5.10 +# +diff --git a/node_modules/@types/ws/index.d.ts b/node_modules/@types/ws/index.d.ts +index 94d1dca..d9abf0b 100644 +--- a/node_modules/@types/ws/index.d.ts ++++ b/node_modules/@types/ws/index.d.ts +@@ -318,7 +318,11 @@ declare namespace WebSocket { + host?: string | undefined; + port?: number | undefined; + backlog?: number | undefined; +- server?: HTTPServer | HTTPSServer | undefined; ++ // LOCAL DYDX PATCH ++ allowSynchronousEvents?: boolean; ++ autoPong?: boolean; ++ server?: HTTPServer | HTTPSServer | undefined; ++ // END LOCAL DYDX PATCH + verifyClient?: + | VerifyClientCallbackAsync> + | VerifyClientCallbackSync> diff --git a/indexer/pnpm-lock.yaml b/indexer/pnpm-lock.yaml index 1d6f67538d..5a9cb06321 100644 --- a/indexer/pnpm-lock.yaml +++ b/indexer/pnpm-lock.yaml @@ -3,7 +3,13 @@ lockfileVersion: 5.3 importers: .: - specifiers: {} + specifiers: + '@milahu/patch-package': 6.4.14 + '@types/ws': 8.5.10 + dependencies: + '@milahu/patch-package': 6.4.14 + devDependencies: + '@types/ws': 8.5.10 packages/base: specifiers: @@ -705,10 +711,10 @@ importers: '@types/express-request-id': ^1.4.3 '@types/jest': ^28.1.4 '@types/lodash': ^4.14.182 - '@types/node': ^18.0.3 + '@types/node': ^18.19.31 '@types/response-time': ^2.3.5 '@types/uuid': ^8.3.4 - '@types/ws': ^8.5.3 + '@types/ws': ^8.5.10 axios: ^1.2.1 body-parser: ^1.20.0 cors: ^2.8.5 @@ -725,7 +731,7 @@ importers: tsconfig-paths: ^4.0.0 typescript: ^4.7.4 uuid: ^8.3.2 - ws: ^8.8.1 + ws: ^8.16.0 dependencies: '@dydxprotocol-indexer/base': link:../../packages/base '@dydxprotocol-indexer/compliance': link:../../packages/compliance @@ -744,7 +750,7 @@ importers: nocache: 3.0.4 response-time: 2.3.2 uuid: 8.3.2 - ws: 8.8.1 + ws: 8.16.0 devDependencies: '@dydxprotocol-indexer/dev': link:../../packages/dev '@types/body-parser': 1.19.2 @@ -753,12 +759,12 @@ importers: '@types/express-request-id': 1.4.3 '@types/jest': 28.1.4 '@types/lodash': 4.14.182 - '@types/node': 18.0.3 + '@types/node': 18.19.31 '@types/response-time': 2.3.5 '@types/uuid': 8.3.4 - '@types/ws': 8.5.3 - jest: 28.1.2_250642e41d506bccecc9f35ad915bcb5 - ts-node: 10.8.2_2dd5d46eecda2aef953638919121af58 + '@types/ws': 8.5.10 + jest: 28.1.2_e1489a60da1bfeaddb37cf23d6a3b371 + ts-node: 10.8.2_4ea55324100c26d4019c6e6bcc89fac6 tsconfig-paths: 4.0.0 typescript: 4.7.4 @@ -5319,6 +5325,28 @@ packages: dev: false optional: true + /@milahu/patch-package/6.4.14: + resolution: {integrity: sha512-sfjl5rZPGu8T7Yl3oSnpwCLp7WGK1rKoSMkC2iZCI7M5y1lijF1GFAuJl2xKCGB4SubgChm+HGJ3YkWYLc3xVg==} + engines: {npm: '>5'} + hasBin: true + dependencies: + '@types/dashdash': 1.14.3 + '@yarnpkg/lockfile': 1.1.0 + chalk: 2.4.2 + cross-spawn: 7.0.3 + dashdash: 2.0.0 + find-yarn-workspace-root: 2.0.0 + fs-extra: 10.1.0 + is-ci: 3.0.1 + klaw-sync: 6.0.0 + open: 8.4.2 + rimraf: 3.0.2 + semver: 7.5.4 + shlex: 2.1.2 + slash: 2.0.0 + tmp: 0.2.3 + dev: false + /@noble/hashes/1.3.0: resolution: {integrity: sha512-ilHEACi9DwqJB0pw7kv+Apvh50jiiSyR/cQ3y4W7lOR5mhvn/50FLUfsnfJz0BDZtl/RR16kXvptiv6q1msYZg==} dev: false @@ -5693,6 +5721,10 @@ packages: resolution: {integrity: sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==} dev: true + /@types/dashdash/1.14.3: + resolution: {integrity: sha512-1BKd5kepSM4R+92c1SV1V0tcCletn2RDHh7QnuI9pTUVpVPwGJPi/3JPdaXR9l7TmwRlV9Zn24hiwxybjWR3Lw==} + dev: false + /@types/eslint-visitor-keys/1.0.0: resolution: {integrity: sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==} dev: true @@ -5784,6 +5816,12 @@ packages: /@types/node/18.0.3: resolution: {integrity: sha512-HzNRZtp4eepNitP+BD6k2L6DROIDG4Q0fm4x+dwfsr6LGmROENnok75VGw40628xf+iR24WeMFcHuuBDUAzzsQ==} + /@types/node/18.19.31: + resolution: {integrity: sha512-ArgCD39YpyyrtFKIqMDvjz79jto5fcI/SVUs2HwB+f0dAzq68yqOdyaSivLiLugSziTpNXLQrVb7RZFmdZzbhA==} + dependencies: + undici-types: 5.26.5 + dev: true + /@types/parse-package-name/0.1.0: resolution: {integrity: sha512-+vF4M3Cd3Ec22Uwb+OKhDrSAcXQ5I6evRx+1letx4KzfzycU+AOEDHnCifus8In11i8iYNFXPfzg9HWTcC1h+Q==} dev: true @@ -5855,10 +5893,10 @@ packages: resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} dev: true - /@types/ws/8.5.3: - resolution: {integrity: sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==} + /@types/ws/8.5.10: + resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} dependencies: - '@types/node': 18.0.3 + '@types/node': 18.19.31 dev: true /@types/yargs-parser/21.0.0: @@ -6073,6 +6111,10 @@ packages: eslint-visitor-keys: 3.3.0 dev: true + /@yarnpkg/lockfile/1.1.0: + resolution: {integrity: sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==} + dev: false + /abbrev/1.1.1: resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} dev: false @@ -6330,7 +6372,6 @@ packages: /assert-plus/1.0.0: resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} engines: {node: '>=0.8'} - dev: true /assign-symbols/1.0.0: resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==} @@ -6837,6 +6878,11 @@ packages: /ci-info/3.3.2: resolution: {integrity: sha512-xmDt/QIAdeZ9+nfdPsaBCpMvHNLFiLdjj59qjqn+6iPe6YmHGQ35sBnQ8uslRBXFmXkiZQOJRjvQeoGppoTjjg==} + /ci-info/3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + dev: false + /cjs-module-lexer/1.2.2: resolution: {integrity: sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==} @@ -7141,6 +7187,13 @@ packages: assert-plus: 1.0.0 dev: true + /dashdash/2.0.0: + resolution: {integrity: sha512-ElMoAPlrzmF4l0OscF5pPBZv8LhUJBnwh7rHKllUOrwabAr47R1aQIIwC53rc59ycCb7k5Sj1/es+A3Bep/x5w==} + engines: {node: '>=10.x'} + dependencies: + assert-plus: 1.0.0 + dev: false + /date-fns/2.29.3: resolution: {integrity: sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==} engines: {node: '>=0.11'} @@ -7253,6 +7306,11 @@ packages: resolution: {integrity: sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==} engines: {node: '>=0.10.0'} + /define-lazy-prop/2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + dev: false + /define-properties/1.1.4: resolution: {integrity: sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==} engines: {node: '>= 0.4'} @@ -7579,6 +7637,10 @@ packages: resolution: {integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==} dev: false + /es-errors/1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + /es-get-iterator/1.1.3: resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} dependencies: @@ -8528,6 +8590,12 @@ packages: locate-path: 5.0.0 path-exists: 4.0.0 + /find-yarn-workspace-root/2.0.0: + resolution: {integrity: sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==} + dependencies: + micromatch: 4.0.5 + dev: false + /findup-sync/3.0.0: resolution: {integrity: sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==} engines: {node: '>= 0.10'} @@ -8708,6 +8776,9 @@ packages: /function-bind/1.1.1: resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + /function-bind/1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + /function.prototype.name/1.1.5: resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} engines: {node: '>= 0.4'} @@ -8772,6 +8843,16 @@ packages: has: 1.0.3 has-symbols: 1.0.3 + /get-intrinsic/1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + has-proto: 1.0.1 + has-symbols: 1.0.3 + hasown: 2.0.2 + /get-own-enumerable-property-symbols/3.0.2: resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==} dev: false @@ -8926,7 +9007,7 @@ packages: /gopd/1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} dependencies: - get-intrinsic: 1.2.0 + get-intrinsic: 1.2.4 /graceful-fs/4.2.10: resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} @@ -9041,6 +9122,12 @@ packages: minimalistic-assert: 1.0.1 dev: false + /hasown/2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + dependencies: + function-bind: 1.1.2 + /hexoid/1.0.0: resolution: {integrity: sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==} engines: {node: '>=8'} @@ -9372,6 +9459,13 @@ packages: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} + /is-ci/3.0.1: + resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} + hasBin: true + dependencies: + ci-info: 3.9.0 + dev: false + /is-core-module/2.9.0: resolution: {integrity: sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==} dependencies: @@ -9415,6 +9509,12 @@ packages: kind-of: 6.0.3 dev: false + /is-docker/2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + dev: false + /is-extendable/0.1.1: resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} engines: {node: '>=0.10.0'} @@ -9584,6 +9684,13 @@ packages: engines: {node: '>=0.10.0'} dev: false + /is-wsl/2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + dependencies: + is-docker: 2.2.1 + dev: false + /isarray/1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} dev: false @@ -9791,6 +9898,34 @@ packages: - ts-node dev: true + /jest-cli/28.1.2_e1489a60da1bfeaddb37cf23d6a3b371: + resolution: {integrity: sha512-l6eoi5Do/IJUXAFL9qRmDiFpBeEJAnjJb1dcd9i/VWfVWbp3mJhuH50dNtX67Ali4Ecvt4eBkWb4hXhPHkAZTw==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 28.1.2_ts-node@10.8.2 + '@jest/test-result': 28.1.1 + '@jest/types': 28.1.1 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.10 + import-local: 3.1.0 + jest-config: 28.1.2_e1489a60da1bfeaddb37cf23d6a3b371 + jest-util: 28.1.1 + jest-validate: 28.1.1 + prompts: 2.4.2 + yargs: 17.5.1 + transitivePeerDependencies: + - '@types/node' + - supports-color + - ts-node + dev: true + /jest-config/28.1.2: resolution: {integrity: sha512-g6EfeRqddVbjPVBVY4JWpUY4IvQoFRIZcv4V36QkqzE0IGhEC/VkugFeBMAeUE7PRgC8KJF0yvJNDeQRbamEVA==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} @@ -9907,6 +10042,46 @@ packages: - supports-color dev: true + /jest-config/28.1.2_e1489a60da1bfeaddb37cf23d6a3b371: + resolution: {integrity: sha512-g6EfeRqddVbjPVBVY4JWpUY4IvQoFRIZcv4V36QkqzE0IGhEC/VkugFeBMAeUE7PRgC8KJF0yvJNDeQRbamEVA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true + dependencies: + '@babel/core': 7.18.6 + '@jest/test-sequencer': 28.1.1 + '@jest/types': 28.1.1 + '@types/node': 18.19.31 + babel-jest: 28.1.2_@babel+core@7.18.6 + chalk: 4.1.2 + ci-info: 3.3.2 + deepmerge: 4.2.2 + glob: 7.2.3 + graceful-fs: 4.2.10 + jest-circus: 28.1.2 + jest-environment-node: 28.1.2 + jest-get-type: 28.0.2 + jest-regex-util: 28.0.2 + jest-resolve: 28.1.1 + jest-runner: 28.1.2 + jest-util: 28.1.1 + jest-validate: 28.1.1 + micromatch: 4.0.5 + parse-json: 5.2.0 + pretty-format: 28.1.1 + slash: 3.0.0 + strip-json-comments: 3.1.1 + ts-node: 10.8.2_4ea55324100c26d4019c6e6bcc89fac6 + transitivePeerDependencies: + - supports-color + dev: true + /jest-diff/28.1.1: resolution: {integrity: sha512-/MUUxeR2fHbqHoMMiffe/Afm+U8U4olFRJ0hiVG2lZatPJcnGxx292ustVu7bULhjV65IYMxRdploAKLbcrsyg==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} @@ -10280,6 +10455,26 @@ packages: - ts-node dev: true + /jest/28.1.2_e1489a60da1bfeaddb37cf23d6a3b371: + resolution: {integrity: sha512-Tuf05DwLeCh2cfWCQbcz9UxldoDyiR1E9Igaei5khjonKncYdc6LDfynKCEWozK0oLE3GD+xKAo2u8x/0s6GOg==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 28.1.2_ts-node@10.8.2 + '@jest/types': 28.1.1 + import-local: 3.1.0 + jest-cli: 28.1.2_e1489a60da1bfeaddb37cf23d6a3b371 + transitivePeerDependencies: + - '@types/node' + - supports-color + - ts-node + dev: true + /jgexml/0.4.4: resolution: {integrity: sha512-j0AzSWT7LXy3s3i1cdv5NZxUtscocwiBxgOLiEBfitCehm8STdXVrcOlbAWsJFLCq1elZYpQlGqA9k8Z+n9iJA==} hasBin: true @@ -10416,6 +10611,12 @@ packages: engines: {node: '>=0.10.0'} dev: false + /klaw-sync/6.0.0: + resolution: {integrity: sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==} + dependencies: + graceful-fs: 4.2.10 + dev: false + /kleur/3.0.3: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} @@ -11309,6 +11510,15 @@ packages: dependencies: mimic-fn: 2.1.0 + /open/8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + dev: false + /openapi-sampler/1.5.1: resolution: {integrity: sha512-tIWIrZUKNAsbqf3bd9U1oH6JEXo8LNYuDlXw26By67EygpjT+ArFnsxxyTMjFWRfbqo5ozkvgSQDK69Gd8CddA==} dependencies: @@ -12234,6 +12444,10 @@ packages: rechoir: 0.6.2 dev: true + /shlex/2.1.2: + resolution: {integrity: sha512-Nz6gtibMVgYeMEhUjp2KuwAgqaJA1K155dU/HuDaEJUGgnmYfVtVZah+uerVWdH8UGnyahhDCgABbYTbs254+w==} + dev: false + /should-equal/2.0.0: resolution: {integrity: sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA==} dependencies: @@ -12291,6 +12505,11 @@ packages: /sisteransi/1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + /slash/2.0.0: + resolution: {integrity: sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==} + engines: {node: '>=6'} + dev: false + /slash/3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} @@ -12784,6 +13003,11 @@ packages: os-tmpdir: 1.0.2 dev: true + /tmp/0.2.3: + resolution: {integrity: sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==} + engines: {node: '>=14.14'} + dev: false + /tmpl/1.0.5: resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} @@ -12920,6 +13144,37 @@ packages: yn: 3.1.1 dev: true + /ts-node/10.8.2_4ea55324100c26d4019c6e6bcc89fac6: + resolution: {integrity: sha512-LYdGnoGddf1D6v8REPtIH+5iq/gTDuZqv2/UJUU7tKjuEU8xVZorBM+buCGNjj+pGEud+sOoM4CX3/YzINpENA==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.9 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.3 + '@types/node': 18.19.31 + acorn: 8.7.1 + acorn-walk: 8.2.0 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 4.7.4 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + dev: true + /tsconfig-paths/3.14.1: resolution: {integrity: sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==} dependencies: @@ -13049,6 +13304,10 @@ packages: engines: {node: '>=0.10.0'} dev: false + /undici-types/5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + dev: true + /unicode-canonical-property-names-ecmascript/2.0.0: resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} engines: {node: '>=4'} @@ -13391,12 +13650,12 @@ packages: optional: true dev: false - /ws/8.8.1: - resolution: {integrity: sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==} + /ws/8.16.0: + resolution: {integrity: sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 + utf-8-validate: '>=5.0.2' peerDependenciesMeta: bufferutil: optional: true diff --git a/indexer/services/socks/__tests__/websocket/index.test.ts b/indexer/services/socks/__tests__/websocket/index.test.ts index 8491fd306f..22d510f7e4 100644 --- a/indexer/services/socks/__tests__/websocket/index.test.ts +++ b/indexer/services/socks/__tests__/websocket/index.test.ts @@ -28,7 +28,6 @@ describe('Index', () => { let mockConnect: (ws: WebSocket, req: IncomingMessage) => void; let wsOnSpy: jest.SpyInstance; let wsPingSpy: jest.SpyInstance; - let wsPongSpy: jest.SpyInstance; let invalidMsgHandlerSpy: jest.SpyInstance; const connectionId: string = 'conId'; @@ -49,10 +48,9 @@ describe('Index', () => { (Subscriptions as unknown as jest.Mock).mockClear(); (sendMessage as unknown as jest.Mock).mockClear(); mockWss = new Wss(); - websocket = new WebSocket(null); + websocket = new WebSocket(null as any as string, [], { autoPong: true } as any); wsOnSpy = jest.spyOn(websocket, 'on'); wsPingSpy = jest.spyOn(websocket, 'ping').mockImplementation(jest.fn()); - wsPongSpy = jest.spyOn(websocket, 'pong').mockImplementation(jest.fn()); mockWss.onConnection = jest.fn().mockImplementation( (cb: (ws: WebSocket, req: IncomingMessage) => void) => { mockConnect = cb; @@ -74,12 +72,11 @@ describe('Index', () => { expect(index.connections[connectionId].messageId).toEqual(0); // Test that handlers are attached. - expect(wsOnSpy).toHaveBeenCalledTimes(5); + expect(wsOnSpy).toHaveBeenCalledTimes(4); expect(wsOnSpy).toHaveBeenCalledWith(WebsocketEvents.MESSAGE, expect.anything()); expect(wsOnSpy).toHaveBeenCalledWith(WebsocketEvents.CLOSE, expect.anything()); expect(wsOnSpy).toHaveBeenCalledWith(WebsocketEvents.ERROR, expect.anything()); expect(wsOnSpy).toHaveBeenCalledWith(WebsocketEvents.PONG, expect.anything()); - expect(wsOnSpy).toHaveBeenCalledWith(WebsocketEvents.PING, expect.anything()); // Test that a connection messages is sent. expect(sendMessage).toHaveBeenCalledTimes(1); @@ -259,15 +256,6 @@ describe('Index', () => { }); }); - describe('ping', () => { - it('sends pong on receiving ping', () => { - (v4 as unknown as jest.Mock).mockReturnValueOnce(connectionId); - mockConnect(websocket, new IncomingMessage(new Socket())); - websocket.emit(WebsocketEvents.PING); - expect(wsPongSpy).toHaveBeenCalledTimes(2); - }); - }); - describe('pong', () => { it('removes delayed disconnect on pong', () => { // Run pending timers to start heartbeat to attach delayed disconnect. diff --git a/indexer/services/socks/package.json b/indexer/services/socks/package.json index ac48ce11ef..bd053b9fa3 100644 --- a/indexer/services/socks/package.json +++ b/indexer/services/socks/package.json @@ -33,7 +33,7 @@ "nocache": "^3.0.4", "response-time": "^2.3.2", "uuid": "^8.3.2", - "ws": "^8.8.1" + "ws": "^8.16.0" }, "devDependencies": { "@dydxprotocol-indexer/dev": "workspace:^0.0.1", @@ -43,10 +43,10 @@ "@types/express-request-id": "^1.4.3", "@types/jest": "^28.1.4", "@types/lodash": "^4.14.182", - "@types/node": "^18.0.3", + "@types/node": "^18.19.31", "@types/response-time": "^2.3.5", "@types/uuid": "^8.3.4", - "@types/ws": "^8.5.3", + "@types/ws": "^8.5.10", "jest": "^28.1.2", "ts-node": "^10.8.2", "tsconfig-paths": "^4.0.0", diff --git a/indexer/services/socks/src/helpers/wss.ts b/indexer/services/socks/src/helpers/wss.ts index 708b3bf4fd..c835129598 100644 --- a/indexer/services/socks/src/helpers/wss.ts +++ b/indexer/services/socks/src/helpers/wss.ts @@ -17,9 +17,13 @@ export class Wss { constructor() { this.started = false; this.closed = false; - this.wss = new WebSocket.Server({ + + const serverOptions: WebSocket.ServerOptions = { port: config.WS_PORT, - }); + allowSynchronousEvents: true, + autoPong: true, + }; + this.wss = new WebSocket.Server(serverOptions); } public async start(): Promise { diff --git a/indexer/services/socks/src/websocket/index.ts b/indexer/services/socks/src/websocket/index.ts index 08c05bd39c..914e898299 100644 --- a/indexer/services/socks/src/websocket/index.ts +++ b/indexer/services/socks/src/websocket/index.ts @@ -164,9 +164,7 @@ export class Index { } }); - this.connections[connectionId].ws.on(WebsocketEvents.PING, (data: Buffer) => { - ws.pong(data); - }); + // Do not attach handler for pings. The ws library automatically responds to pings with pongs. // Attach handler for close events from the connection. this.connections[connectionId].ws.on(WebsocketEvents.CLOSE, (code: number, reason: Buffer) => { @@ -309,7 +307,7 @@ export class Index { ); break; } - // TODO: Consider custom ping messages as invalid after publishing updated documentation. + // Handle pings by doing nothing. The ws library automatically responds to pings with pongs. case IncomingMessageType.PING: { break; }