diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..60736c5 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,4 @@ +*/**/node_modules/ +*/**/lib +.husky/ +node_modules/ \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 629a61e..2b4a453 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,19 +1,36 @@ -FROM public.ecr.aws/bitnami/node:20.18.1 -RUN apt-get install git -ENV NODE_ENV=production -RUN npm install -g typescript +FROM node:20.18.1 AS builder WORKDIR /app -COPY drift-common /app/drift-common -COPY . . + +# Copy package files first to leverage cache +COPY package.json yarn.lock ./ +COPY drift-common/protocol/sdk/package.json ./drift-common/protocol/sdk/ +COPY drift-common/common-ts/package.json ./drift-common/common-ts/ + +RUN npm install -g bun typescript husky + WORKDIR /app/drift-common/protocol/sdk -RUN yarn -RUN yarn build +COPY drift-common/protocol/sdk/ . +RUN bun install && bun run build + WORKDIR /app/drift-common/common-ts -RUN yarn -RUN yarn build +COPY drift-common/common-ts/ . +RUN bun install && bun run build + WORKDIR /app -RUN yarn -RUN yarn build +COPY . . +# no '--production' for esbuild +RUN bun install && bun esbuild.config.js + +FROM node:20.18.1-alpine +# 'bigint-buffer' native lib for performance +# @triton-one/yellowstone-grpc so .wasm lib included +RUN apk add python3 make g++ --virtual .build &&\ + npm install -C /lib bigint-buffer @triton-one/yellowstone-grpc &&\ + apk del .build +COPY --from=builder /app/lib/ ./lib/ +ENV NODE_ENV=production EXPOSE 9464 + +CMD ["node", "./lib/index.js"] \ No newline at end of file diff --git a/drift-common b/drift-common index 06495bf..24c4310 160000 --- a/drift-common +++ b/drift-common @@ -1 +1 @@ -Subproject commit 06495bf9d730318000db020ed857dc77f2171fcc +Subproject commit 24c4310ab1e306ae3974a355fa5f3561b03db07a diff --git a/esbuild.config.js b/esbuild.config.js new file mode 100644 index 0000000..b269b11 --- /dev/null +++ b/esbuild.config.js @@ -0,0 +1,28 @@ +const esbuild = require('esbuild'); +const glob = require('tiny-glob'); + +const commonConfig = { + bundle: true, + platform: 'node', + target: 'node20', + sourcemap: false, + // minify: true, makes messy debug/error output + treeShaking: true, + legalComments: 'none', + mainFields: ['module', 'main'], + metafile: true, + format: 'cjs', + external: [ + 'bigint-buffer', + '@triton-one/yellowstone-grpc' + ] +}; + +(async () => { + let entryPoints = await glob("./src/**/*.ts"); + await esbuild.build({ + ...commonConfig, + entryPoints, + outdir: 'lib', + }); +})().catch(() => process.exit(1)); diff --git a/package.json b/package.json index 6765ccd..2976c56 100644 --- a/package.json +++ b/package.json @@ -6,8 +6,8 @@ "license": "Apache-2.0", "dependencies": { "@coral-xyz/anchor": "^0.29.0", - "@drift/common": "file:./drift-common/common-ts", "@drift-labs/sdk": "file:./drift-common/protocol/sdk", + "@drift/common": "file:./drift-common/common-ts", "@opentelemetry/api": "^1.1.0", "@opentelemetry/auto-instrumentations-node": "^0.31.1", "@opentelemetry/exporter-prometheus": "^0.31.0", @@ -33,7 +33,6 @@ "response-time": "^2.3.2", "rxjs": "^7.8.1", "socket.io-redis": "^6.1.1", - "typescript": "4.5.4", "undici": "^6.16.1", "winston": "^3.8.1", "ws": "^8.14.2" @@ -42,12 +41,14 @@ "@types/k6": "^0.45.0", "@typescript-eslint/eslint-plugin": "^4.28.0", "@typescript-eslint/parser": "^4.28.0", + "esbuild": "^0.24.0", "eslint": "^7.29.0", "eslint-config-prettier": "^8.3.0", "eslint-plugin-prettier": "^3.4.0", "husky": "^7.0.4", "k6": "^0.0.0", "prettier": "^2.4.1", + "tiny-glob": "^0.2.9", "ts-node": "^10.9.1" }, "scripts": {