diff --git a/eslint.config.mts b/eslint.config.mts index 4c19fd5..e13ed7a 100644 --- a/eslint.config.mts +++ b/eslint.config.mts @@ -11,6 +11,7 @@ export default tseslint.config( 'node_modules/**', 'dist/**', 'jest.config.js', + 'src/protos/**/*.ts', ], }, // TypeScript configuration for source files (type-aware linting) diff --git a/package-lock.json b/package-lock.json index d9ea6af..22449b5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,8 @@ "version": "1.0.0", "license": "MIT", "dependencies": { + "@grpc/grpc-js": "^1.13.4", + "@grpc/proto-loader": "^0.8.0", "cors": "^2.8.5", "dotenv": "^17.2.1", "express": "^5.1.0", @@ -827,6 +829,55 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/@grpc/grpc-js": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.13.4.tgz", + "integrity": "sha512-GsFaMXCkMqkKIvwCQjCrwH+GHbPKBjhwo/8ZuUkWHqbI73Kky9I+pQltrlT0+MWpedCoosda53lgjYfyEPgxBg==", + "license": "Apache-2.0", + "dependencies": { + "@grpc/proto-loader": "^0.7.13", + "@js-sdsl/ordered-map": "^4.4.2" + }, + "engines": { + "node": ">=12.10.0" + } + }, + "node_modules/@grpc/grpc-js/node_modules/@grpc/proto-loader": { + "version": "0.7.15", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.15.tgz", + "integrity": "sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ==", + "license": "Apache-2.0", + "dependencies": { + "lodash.camelcase": "^4.3.0", + "long": "^5.0.0", + "protobufjs": "^7.2.5", + "yargs": "^17.7.2" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.8.0.tgz", + "integrity": "sha512-rc1hOQtjIWGxcxpb9aHAfLpIctjEnsDehj0DAiVfBlmT84uvR0uUtN2hEi/ecvWVjXUGf5qPF4qEgiLOx1YIMQ==", + "license": "Apache-2.0", + "dependencies": { + "lodash.camelcase": "^4.3.0", + "long": "^5.0.0", + "protobufjs": "^7.5.3", + "yargs": "^17.7.2" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/@humanfs/core": { "version": "0.19.1", "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", @@ -1421,6 +1472,16 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@js-sdsl/ordered-map": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", + "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" + } + }, "node_modules/@napi-rs/wasm-runtime": { "version": "0.2.12", "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", @@ -1496,6 +1557,70 @@ "url": "https://opencollective.com/pkgr" } }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", + "license": "BSD-3-Clause" + }, "node_modules/@redis/bloom": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-5.8.0.tgz", @@ -1806,7 +1931,6 @@ "version": "24.2.1", "resolved": "https://registry.npmjs.org/@types/node/-/node-24.2.1.tgz", "integrity": "sha512-DRh5K+ka5eJic8CjH7td8QpYEV6Zo10gfRkjHCO3weqZHWDtAaSTFtl4+VMqOJ4N5jcuhZ9/l+yy8rVgw7BQeQ==", - "dev": true, "license": "MIT", "dependencies": { "undici-types": "~7.10.0" @@ -2483,7 +2607,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -2927,7 +3050,6 @@ "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, "license": "ISC", "dependencies": { "string-width": "^4.2.0", @@ -2942,7 +3064,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -2952,14 +3073,12 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, "license": "MIT" }, "node_modules/cliui/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", @@ -2974,7 +3093,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" @@ -2987,7 +3105,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", @@ -3032,7 +3149,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -3045,7 +3161,6 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, "license": "MIT" }, "node_modules/concat-map": { @@ -3342,7 +3457,6 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -4033,7 +4147,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" @@ -4441,7 +4554,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -5327,6 +5439,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "license": "MIT" + }, "node_modules/lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", @@ -5341,6 +5459,12 @@ "dev": true, "license": "MIT" }, + "node_modules/long": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", + "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", + "license": "Apache-2.0" + }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -6165,6 +6289,30 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/protobufjs": { + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.3.tgz", + "integrity": "sha512-sildjKwVqOI2kmFDiXQ6aEB0fjYTafpEvIBs8tOR8qI4spuL9OPROLVu2qZqi/xgCfsHIwVqlaF8JBjWFHnKbw==", + "hasInstallScript": true, + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -6312,7 +6460,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -7248,7 +7395,6 @@ "version": "7.10.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.10.0.tgz", "integrity": "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==", - "dev": true, "license": "MIT" }, "node_modules/unpipe": { @@ -7538,7 +7684,6 @@ "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, "license": "ISC", "engines": { "node": ">=10" @@ -7555,7 +7700,6 @@ "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, "license": "MIT", "dependencies": { "cliui": "^8.0.1", @@ -7574,7 +7718,6 @@ "version": "21.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, "license": "ISC", "engines": { "node": ">=12" @@ -7584,7 +7727,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -7594,14 +7736,12 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, "license": "MIT" }, "node_modules/yargs/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", @@ -7616,7 +7756,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" diff --git a/package.json b/package.json index 9c3bd8c..4f58a05 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,8 @@ "test": "jest", "test:watch": "jest --watch", "test:coverage": "jest --coverage", - "fix": "npm run format && npm run lint -- --fix" + "fix": "npm run format && npm run lint -- --fix", + "proto:gen": "./proto-gen.sh" }, "keywords": [], "author": "", @@ -41,6 +42,8 @@ "typescript-eslint": "^8.38.0" }, "dependencies": { + "@grpc/grpc-js": "^1.13.4", + "@grpc/proto-loader": "^0.8.0", "cors": "^2.8.5", "dotenv": "^17.2.1", "express": "^5.1.0", diff --git a/proto-gen.sh b/proto-gen.sh new file mode 100755 index 0000000..8c4ef9d --- /dev/null +++ b/proto-gen.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +npx proto-loader-gen-types --grpcLib=@grpc/grpc-js --outDir=src/protos/ src/protos/*.proto diff --git a/src/protos/media-signaling.proto b/src/protos/media-signaling.proto new file mode 100644 index 0000000..caaa49f --- /dev/null +++ b/src/protos/media-signaling.proto @@ -0,0 +1,25 @@ +syntax = "proto3"; + +package media_signaling_package; + +// Service definition for bidirectional communication +service MediaSignaling { + // Health check + rpc HealthCheck(HealthCheckRequest) returns (HealthCheckResponse); +} + + +// Health check messages +message HealthCheckRequest { + string service = 1; +} + +message HealthCheckResponse { + enum ServingStatus { + UNKNOWN = 0; + SERVING = 1; + NOT_SERVING = 2; + SERVICE_UNKNOWN = 3; + } + ServingStatus status = 1; +} diff --git a/src/protos/media-signaling.ts b/src/protos/media-signaling.ts new file mode 100644 index 0000000..1b83f00 --- /dev/null +++ b/src/protos/media-signaling.ts @@ -0,0 +1,39 @@ +import type * as grpc from '@grpc/grpc-js'; +import type { MessageTypeDefinition } from '@grpc/proto-loader'; + +import type { + HealthCheckRequest as _media_signaling_package_HealthCheckRequest, + HealthCheckRequest__Output as _media_signaling_package_HealthCheckRequest__Output, +} from './media_signaling_package/HealthCheckRequest'; +import type { + HealthCheckResponse as _media_signaling_package_HealthCheckResponse, + HealthCheckResponse__Output as _media_signaling_package_HealthCheckResponse__Output, +} from './media_signaling_package/HealthCheckResponse'; +import type { + MediaSignalingClient as _media_signaling_package_MediaSignalingClient, + MediaSignalingDefinition as _media_signaling_package_MediaSignalingDefinition, +} from './media_signaling_package/MediaSignaling'; + +type SubtypeConstructor< + Constructor extends new (...args: any) => any, + Subtype, +> = { + new (...args: ConstructorParameters): Subtype; +}; + +export interface ProtoGrpcType { + media_signaling_package: { + HealthCheckRequest: MessageTypeDefinition< + _media_signaling_package_HealthCheckRequest, + _media_signaling_package_HealthCheckRequest__Output + >; + HealthCheckResponse: MessageTypeDefinition< + _media_signaling_package_HealthCheckResponse, + _media_signaling_package_HealthCheckResponse__Output + >; + MediaSignaling: SubtypeConstructor< + typeof grpc.Client, + _media_signaling_package_MediaSignalingClient + > & { service: _media_signaling_package_MediaSignalingDefinition }; + }; +} diff --git a/src/protos/mediaSignalingPackage/HealthCheckRequest.ts b/src/protos/mediaSignalingPackage/HealthCheckRequest.ts new file mode 100644 index 0000000..68b9d0b --- /dev/null +++ b/src/protos/mediaSignalingPackage/HealthCheckRequest.ts @@ -0,0 +1,10 @@ +// Original file: src/protos/media-signaling.proto + + +export interface HealthCheckRequest { + 'service'?: (string); +} + +export interface HealthCheckRequest__Output { + 'service'?: (string); +} diff --git a/src/protos/mediaSignalingPackage/HealthCheckResponse.ts b/src/protos/mediaSignalingPackage/HealthCheckResponse.ts new file mode 100644 index 0000000..e8bf0b1 --- /dev/null +++ b/src/protos/mediaSignalingPackage/HealthCheckResponse.ts @@ -0,0 +1,31 @@ +// Original file: src/protos/media-signaling.proto + + +// Original file: src/protos/media-signaling.proto + +export const _mediaSignalingPackage_HealthCheckResponse_ServingStatus = { + UNKNOWN: 0, + SERVING: 1, + NOT_SERVING: 2, + SERVICE_UNKNOWN: 3, +} as const; + +export type _mediaSignalingPackage_HealthCheckResponse_ServingStatus = + | 'UNKNOWN' + | 0 + | 'SERVING' + | 1 + | 'NOT_SERVING' + | 2 + | 'SERVICE_UNKNOWN' + | 3 + +export type _mediaSignalingPackage_HealthCheckResponse_ServingStatus__Output = typeof _mediaSignalingPackage_HealthCheckResponse_ServingStatus[keyof typeof _mediaSignalingPackage_HealthCheckResponse_ServingStatus] + +export interface HealthCheckResponse { + 'status'?: (_mediaSignalingPackage_HealthCheckResponse_ServingStatus); +} + +export interface HealthCheckResponse__Output { + 'status'?: (_mediaSignalingPackage_HealthCheckResponse_ServingStatus__Output); +} diff --git a/src/protos/mediaSignalingPackage/MediaSignalingService.ts b/src/protos/mediaSignalingPackage/MediaSignalingService.ts new file mode 100644 index 0000000..adffbea --- /dev/null +++ b/src/protos/mediaSignalingPackage/MediaSignalingService.ts @@ -0,0 +1,73 @@ +// Original file: src/protos/media-signaling.proto + +import type * as grpc from '@grpc/grpc-js'; +import type { MethodDefinition } from '@grpc/proto-loader'; +import type { + HealthCheckRequest as _mediaSignalingPackage_HealthCheckRequest, + HealthCheckRequest__Output as _mediaSignalingPackage_HealthCheckRequest__Output, +} from './HealthCheckRequest'; +import type { + HealthCheckResponse as _mediaSignalingPackage_HealthCheckResponse, + HealthCheckResponse__Output as _mediaSignalingPackage_HealthCheckResponse__Output, +} from './HealthCheckResponse'; + +export interface MediaSignalingServiceClient extends grpc.Client { + HealthCheck( + argument: _mediaSignalingPackage_HealthCheckRequest, + metadata: grpc.Metadata, + options: grpc.CallOptions, + callback: grpc.requestCallback<_mediaSignalingPackage_HealthCheckResponse__Output> + ): grpc.ClientUnaryCall; + HealthCheck( + argument: _mediaSignalingPackage_HealthCheckRequest, + metadata: grpc.Metadata, + callback: grpc.requestCallback<_mediaSignalingPackage_HealthCheckResponse__Output> + ): grpc.ClientUnaryCall; + HealthCheck( + argument: _mediaSignalingPackage_HealthCheckRequest, + options: grpc.CallOptions, + callback: grpc.requestCallback<_mediaSignalingPackage_HealthCheckResponse__Output> + ): grpc.ClientUnaryCall; + HealthCheck( + argument: _mediaSignalingPackage_HealthCheckRequest, + callback: grpc.requestCallback<_mediaSignalingPackage_HealthCheckResponse__Output> + ): grpc.ClientUnaryCall; + healthCheck( + argument: _mediaSignalingPackage_HealthCheckRequest, + metadata: grpc.Metadata, + options: grpc.CallOptions, + callback: grpc.requestCallback<_mediaSignalingPackage_HealthCheckResponse__Output> + ): grpc.ClientUnaryCall; + healthCheck( + argument: _mediaSignalingPackage_HealthCheckRequest, + metadata: grpc.Metadata, + callback: grpc.requestCallback<_mediaSignalingPackage_HealthCheckResponse__Output> + ): grpc.ClientUnaryCall; + healthCheck( + argument: _mediaSignalingPackage_HealthCheckRequest, + options: grpc.CallOptions, + callback: grpc.requestCallback<_mediaSignalingPackage_HealthCheckResponse__Output> + ): grpc.ClientUnaryCall; + healthCheck( + argument: _mediaSignalingPackage_HealthCheckRequest, + callback: grpc.requestCallback<_mediaSignalingPackage_HealthCheckResponse__Output> + ): grpc.ClientUnaryCall; +} + +export interface MediaSignalingServiceHandlers + extends grpc.UntypedServiceImplementation { + HealthCheck: grpc.handleUnaryCall< + _mediaSignalingPackage_HealthCheckRequest__Output, + _mediaSignalingPackage_HealthCheckResponse + >; +} + +export interface MediaSignalingServiceDefinition + extends grpc.ServiceDefinition { + HealthCheck: MethodDefinition< + _mediaSignalingPackage_HealthCheckRequest, + _mediaSignalingPackage_HealthCheckResponse, + _mediaSignalingPackage_HealthCheckRequest__Output, + _mediaSignalingPackage_HealthCheckResponse__Output + >; +} diff --git a/src/protos/media_signaling_package/HealthCheckRequest.ts b/src/protos/media_signaling_package/HealthCheckRequest.ts new file mode 100644 index 0000000..68b9d0b --- /dev/null +++ b/src/protos/media_signaling_package/HealthCheckRequest.ts @@ -0,0 +1,10 @@ +// Original file: src/protos/media-signaling.proto + + +export interface HealthCheckRequest { + 'service'?: (string); +} + +export interface HealthCheckRequest__Output { + 'service'?: (string); +} diff --git a/src/protos/media_signaling_package/HealthCheckResponse.ts b/src/protos/media_signaling_package/HealthCheckResponse.ts new file mode 100644 index 0000000..c89f8b0 --- /dev/null +++ b/src/protos/media_signaling_package/HealthCheckResponse.ts @@ -0,0 +1,31 @@ +// Original file: src/protos/media-signaling.proto + + +// Original file: src/protos/media-signaling.proto + +export const _media_signaling_package_HealthCheckResponse_ServingStatus = { + UNKNOWN: 0, + SERVING: 1, + NOT_SERVING: 2, + SERVICE_UNKNOWN: 3, +} as const; + +export type _media_signaling_package_HealthCheckResponse_ServingStatus = + | 'UNKNOWN' + | 0 + | 'SERVING' + | 1 + | 'NOT_SERVING' + | 2 + | 'SERVICE_UNKNOWN' + | 3 + +export type _media_signaling_package_HealthCheckResponse_ServingStatus__Output = typeof _media_signaling_package_HealthCheckResponse_ServingStatus[keyof typeof _media_signaling_package_HealthCheckResponse_ServingStatus] + +export interface HealthCheckResponse { + 'status'?: (_media_signaling_package_HealthCheckResponse_ServingStatus); +} + +export interface HealthCheckResponse__Output { + 'status'?: (_media_signaling_package_HealthCheckResponse_ServingStatus__Output); +} diff --git a/src/protos/media_signaling_package/MediaSignaling.ts b/src/protos/media_signaling_package/MediaSignaling.ts new file mode 100644 index 0000000..c68fc3e --- /dev/null +++ b/src/protos/media_signaling_package/MediaSignaling.ts @@ -0,0 +1,72 @@ +// Original file: src/protos/media-signaling.proto + +import type * as grpc from '@grpc/grpc-js'; +import type { MethodDefinition } from '@grpc/proto-loader'; +import type { + HealthCheckRequest as _media_signaling_package_HealthCheckRequest, + HealthCheckRequest__Output as _media_signaling_package_HealthCheckRequest__Output, +} from './HealthCheckRequest'; +import type { + HealthCheckResponse as _media_signaling_package_HealthCheckResponse, + HealthCheckResponse__Output as _media_signaling_package_HealthCheckResponse__Output, +} from './HealthCheckResponse'; + +export interface MediaSignalingClient extends grpc.Client { + HealthCheck( + argument: _media_signaling_package_HealthCheckRequest, + metadata: grpc.Metadata, + options: grpc.CallOptions, + callback: grpc.requestCallback<_media_signaling_package_HealthCheckResponse__Output> + ): grpc.ClientUnaryCall; + HealthCheck( + argument: _media_signaling_package_HealthCheckRequest, + metadata: grpc.Metadata, + callback: grpc.requestCallback<_media_signaling_package_HealthCheckResponse__Output> + ): grpc.ClientUnaryCall; + HealthCheck( + argument: _media_signaling_package_HealthCheckRequest, + options: grpc.CallOptions, + callback: grpc.requestCallback<_media_signaling_package_HealthCheckResponse__Output> + ): grpc.ClientUnaryCall; + HealthCheck( + argument: _media_signaling_package_HealthCheckRequest, + callback: grpc.requestCallback<_media_signaling_package_HealthCheckResponse__Output> + ): grpc.ClientUnaryCall; + healthCheck( + argument: _media_signaling_package_HealthCheckRequest, + metadata: grpc.Metadata, + options: grpc.CallOptions, + callback: grpc.requestCallback<_media_signaling_package_HealthCheckResponse__Output> + ): grpc.ClientUnaryCall; + healthCheck( + argument: _media_signaling_package_HealthCheckRequest, + metadata: grpc.Metadata, + callback: grpc.requestCallback<_media_signaling_package_HealthCheckResponse__Output> + ): grpc.ClientUnaryCall; + healthCheck( + argument: _media_signaling_package_HealthCheckRequest, + options: grpc.CallOptions, + callback: grpc.requestCallback<_media_signaling_package_HealthCheckResponse__Output> + ): grpc.ClientUnaryCall; + healthCheck( + argument: _media_signaling_package_HealthCheckRequest, + callback: grpc.requestCallback<_media_signaling_package_HealthCheckResponse__Output> + ): grpc.ClientUnaryCall; +} + +export interface MediaSignalingHandlers + extends grpc.UntypedServiceImplementation { + HealthCheck: grpc.handleUnaryCall< + _media_signaling_package_HealthCheckRequest__Output, + _media_signaling_package_HealthCheckResponse + >; +} + +export interface MediaSignalingDefinition extends grpc.ServiceDefinition { + HealthCheck: MethodDefinition< + _media_signaling_package_HealthCheckRequest, + _media_signaling_package_HealthCheckResponse, + _media_signaling_package_HealthCheckRequest__Output, + _media_signaling_package_HealthCheckResponse__Output + >; +} diff --git a/src/servers/grpc-server.ts b/src/servers/grpc-server.ts new file mode 100644 index 0000000..bff43cd --- /dev/null +++ b/src/servers/grpc-server.ts @@ -0,0 +1,75 @@ +import * as grpc from '@grpc/grpc-js'; +import * as protoLoader from '@grpc/proto-loader'; +import path from 'path'; +import { ProtoGrpcType } from '../protos/media-signaling'; + +class GrpcServer { + private static instance: GrpcServer | null = null; + private server: grpc.Server; + private connections: Map; + + private constructor() { + this.server = new grpc.Server(); + this.connections = new Map(); + this.setup(); + } + + static getInstance(): GrpcServer { + if (!GrpcServer.instance) { + GrpcServer.instance = new GrpcServer(); + } + + return GrpcServer.instance; + } + + async start(port: number = 50051): Promise { + try { + this.server.bindAsync( + `0.0.0.0:${port}`, + grpc.ServerCredentials.createInsecure(), + () => { + // if (error) { + // console.log(error); + // throw error; + // } + this.server.start(); + } + ); + } catch (error) { + console.error(error); + throw error; + } + } + + private setup(): void { + const PROTO_FILE = path.resolve( + __dirname, + '../protos/media-signaling.proto' + ); + + const packageDefinition = protoLoader.loadSync(PROTO_FILE); + const protoDescriptor = grpc.loadPackageDefinition( + packageDefinition + ) as unknown as ProtoGrpcType; + + const mediaSignaling = + protoDescriptor.media_signaling_package.MediaSignaling; + + this.server.addService(mediaSignaling.service, { + HealthCheck: this.healthCheck.bind(this), + }); + } + + // Health check implementation + private healthCheck( + call: grpc.ServerUnaryCall, + callback: grpc.sendUnaryData + ): void { + console.log('call', call.request); + callback(null, { + status: 1, // SERVING + }); + } +} + +export const grpcServer = GrpcServer.getInstance();