Chore: Move ddp-streamer micro service to its own sub-repo (#25246)

This commit is contained in:
Diego Sampaio 2022-05-12 13:29:33 -03:00 committed by GitHub
parent b70894833c
commit 1b9a5f0984
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
25 changed files with 299 additions and 73 deletions

View File

@ -368,7 +368,7 @@ jobs:
run: yarn
- name: Build micro services
run: yarn build:services
run: yarn build
- name: E2E Test API
env:
@ -617,14 +617,14 @@ jobs:
IMAGE_TAG: check
run: |
yarn
yarn build:services
yarn build
echo "Building Docker image for service: ${{ matrix.service }}:${IMAGE_TAG}"
docker build \
--build-arg SERVICE=${{ matrix.service }} \
-t rocketchat/${{ matrix.service }}-service:${IMAGE_TAG} \
-f ./apps/meteor/ee/server/services/Dockerfile \
-f ./ee/apps/ddp-streamer/Dockerfile \
.
release-versions:
@ -872,14 +872,20 @@ jobs:
# first install repo dependencies
yarn
yarn build:services
yarn build
echo "Building Docker image for service: ${{ matrix.service }}:${IMAGE_TAG}"
if [[ "${{ matrix.service }}" == "ddp-streamer" ]]; then
DOCKERFILE_PATH="./ee/apps/ddp-streamer/Dockerfile"
else
DOCKERFILE_PATH="./apps/meteor/ee/server/services/Dockerfile"
fi
docker build \
--build-arg SERVICE=${{ matrix.service }} \
-t rocketchat/${{ matrix.service }}-service:${IMAGE_TAG} \
-f ./apps/meteor/ee/server/services/Dockerfile \
-f ${DOCKERFILE_PATH} \
.
docker push rocketchat/${{ matrix.service }}-service:${IMAGE_TAG}

View File

@ -2,8 +2,9 @@ Copyright (c) 2015-2022 Rocket.Chat Technologies Corp.
Portions of this software are licensed as follows:
* All content that resides under the "apps/meteor/ee/" directory of this repository, if
that directory exists, is licensed under the license defined in "apps/meteor/ee/LICENSE".
* All content that resides under the "apps/meteor/ee/" and "ee/" directories
of this repository, if that directory exists, is licensed under the license
defined in "apps/meteor/ee/LICENSE".
* All third-party components incorporated into the Rocket.Chat Software are
licensed under the original license provided by the owner of the applicable
component.

View File

@ -69,6 +69,7 @@ function killAllProcesses(mainExitCode) {
}
function startProcess(opts) {
console.log('Starting process', opts.name, opts.command, opts.params, opts.options.cwd);
const proc = spawn(opts.command, opts.params, opts.options);
processes.push(proc);
@ -125,20 +126,25 @@ function startRocketChat() {
}
async function startMicroservices() {
const waitStart = (resolve) => (message) => {
if (message.toString().match('NetworkBroker started successfully')) {
return resolve();
}
};
const startService = (name) => {
return new Promise((resolve) => {
const waitStart = (message) => {
if (message.toString().match('NetworkBroker started successfully')) {
return resolve();
}
};
const cwd =
name === 'ddp-streamer'
? path.resolve(srcDir, '..', '..', 'ee', 'apps', name, 'dist', 'ee', 'apps', name)
: path.resolve(srcDir, 'ee', 'server', 'services', 'dist', 'ee', 'server', 'services', name);
startProcess({
name: `${name} service`,
command: 'node',
params: ['service.js'],
onData: waitStart,
params: [name === 'ddp-streamer' ? 'src/service.js' : 'service.js'],
onData: waitStart(resolve),
options: {
cwd: path.resolve(srcDir, 'ee', 'server', 'services', 'dist', 'ee', 'server', 'services', name),
cwd,
env: {
...appOptions.env,
...process.env,

View File

@ -1,6 +0,0 @@
import '../../startup/broker';
import { api } from '../../../../server/sdk/api';
import { DDPStreamer } from './DDPStreamer';
api.registerService(new DDPStreamer());

View File

@ -1,25 +0,0 @@
import type { ISubscription, IRoom, IUser, ISetting } from '@rocket.chat/core-typings';
import { NotificationsModule } from '../../../../../server/modules/notifications/notifications.module';
import { Stream } from '../Streamer';
import { Collections, getConnection } from '../../mongo';
import { RoomsRaw } from '../../../../../app/models/server/raw/Rooms';
import { SubscriptionsRaw } from '../../../../../app/models/server/raw/Subscriptions';
import { UsersRaw } from '../../../../../app/models/server/raw/Users';
import { SettingsRaw } from '../../../../../app/models/server/raw/Settings';
const notifications = new NotificationsModule(Stream);
getConnection().then((db) => {
const Users = new UsersRaw(db.collection<IUser>(Collections.User));
notifications.configure({
Rooms: new RoomsRaw(db.collection<IRoom>(Collections.Rooms)),
Subscriptions: new SubscriptionsRaw(db.collection<ISubscription>(Collections.Subscriptions), {
Users,
}),
Users,
Settings: new SettingsRaw(db.collection<ISetting>(Collections.Settings)),
});
});
export default notifications;

View File

@ -1,7 +1,7 @@
import { IVoipCallServerConfig, IVoipManagementServerConfig, ServerType, IRegistrationInfo } from '@rocket.chat/core-typings';
import type { IVoipConnectorResult, IManagementServerConnectionStatus } from '@rocket.chat/core-typings';
import { CommandHandler } from '../../services/voip/connector/asterisk/CommandHandler';
import type { CommandHandler } from '../../services/voip/connector/asterisk/CommandHandler';
export interface IVoipService {
getServerConfigData(serverType: ServerType): IVoipCallServerConfig | IVoipManagementServerConfig;

View File

@ -0,0 +1,16 @@
{
"extends": ["@rocket.chat/eslint-config"],
"overrides": [
{
"files": ["**/*.spec.js", "**/*.spec.jsx"],
"env": {
"jest": true
}
}
],
"ignorePatterns": ["**/dist"],
"plugins": ["jest"],
"env": {
"jest/globals": true
}
}

View File

@ -0,0 +1,32 @@
FROM node:14.18.3-alpine
ARG SERVICE
WORKDIR /app
COPY ./packages/core-typings/package.json packages/core-typings/package.json
COPY ./packages/core-typings/dist packages/core-typings/dist
COPY ./packages/rest-typings/package.json packages/rest-typings/package.json
COPY ./packages/rest-typings/dist packages/rest-typings/dist
COPY ./packages/ui-contexts/package.json packages/ui-contexts/package.json
COPY ./packages/ui-contexts/dist packages/ui-contexts/dist
COPY ./ee/apps/${SERVICE}/dist .
COPY ./package.json .
COPY ./yarn.lock .
COPY ./.yarnrc.yml .
COPY ./.yarn/plugins .yarn/plugins
COPY ./.yarn/releases .yarn/releases
COPY ./ee/apps/${SERVICE}/package.json ee/apps/${SERVICE}/package.json
ENV NODE_ENV=production \
PORT=3000
WORKDIR /app/ee/apps/${SERVICE}
RUN yarn workspaces focus --production
EXPOSE 3000 9458
CMD ["node", "src/service.js"]

View File

@ -0,0 +1,50 @@
{
"name": "@rocket.chat/ddp-streamer",
"private": true,
"version": "0.0.1",
"description": "Rocket.Chat DDP-Streamer service",
"scripts": {
"build": "tsc -p tsconfig.json",
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [
"rocketchat"
],
"author": "Rocket.Chat",
"dependencies": {
"@rocket.chat/apps-engine": "^1.31.0",
"@rocket.chat/core-typings": "workspace:^",
"@rocket.chat/emitter": "~0.31.9",
"@rocket.chat/rest-typings": "workspace:^",
"@rocket.chat/string-helpers": "~0.31.9",
"@rocket.chat/ui-contexts": "workspace:^",
"colorette": "^1.3.0",
"ejson": "^2.2.2",
"eventemitter3": "^4.0.7",
"fibers": "^5.0.1",
"jaeger-client": "^3.19.0",
"moleculer": "^0.14.19",
"mongodb": "^3.6.10",
"nats": "^2.4.0",
"pino": "^7.9.2",
"sharp": "^0.30.4",
"uuid": "^7.0.3",
"ws": "^8.5.0"
},
"devDependencies": {
"@rocket.chat/eslint-config": "workspace:^",
"@types/ejson": "^2.1.3",
"@types/meteor": "1.4.81",
"@types/mongodb": "^3.6.20",
"@types/node": "^14.18.12",
"@types/sharp": "^0.30.2",
"@types/uuid": "^8.3.4",
"@types/ws": "^8.5.3",
"pino-pretty": "^7.6.0",
"typescript": "~4.3.5"
},
"main": "./dist/service.js",
"files": [
"/dist"
]
}

View File

@ -3,15 +3,15 @@ import url from 'url';
import WebSocket from 'ws';
import { ListenersModule } from '../../../../server/modules/listeners/listeners.module';
import { StreamerCentral } from '../../../../server/modules/streamer/streamer.module';
import { MeteorService } from '../../../../server/sdk';
import { ServiceClass } from '../../../../server/sdk/types/ServiceClass';
import { ListenersModule } from '../../../../apps/meteor/server/modules/listeners/listeners.module';
import { StreamerCentral } from '../../../../apps/meteor/server/modules/streamer/streamer.module';
import { MeteorService } from '../../../../apps/meteor/server/sdk';
import { ServiceClass } from '../../../../apps/meteor/server/sdk/types/ServiceClass';
import { Client } from './Client';
import { events, server } from './configureServer';
import { DDP_EVENTS } from './constants';
import { Autoupdate } from './lib/Autoupdate';
import notifications from './streams';
import { notifications } from './streams';
const { PORT: port = 4000 } = process.env;

View File

@ -8,9 +8,9 @@ import { DDP_EVENTS } from './constants';
import { Publication } from './Publication';
import { Client } from './Client';
import { IPacket } from './types/IPacket';
import { MeteorService } from '../../../../server/sdk';
import { isMeteorError, MeteorError } from '../../../../server/sdk/errors';
import { Logger } from '../../../../server/lib/logger/Logger';
import { MeteorService } from '../../../../apps/meteor/server/sdk';
import { isMeteorError, MeteorError } from '../../../../apps/meteor/server/sdk/errors';
import { Logger } from '../../../../apps/meteor/server/lib/logger/Logger';
const logger = new Logger('DDP-Streamer');

View File

@ -4,8 +4,8 @@ import type { DDPSubscription, Connection, TransformMessage } from 'meteor/rocke
import { server } from './configureServer';
import { DDP_EVENTS } from './constants';
import { isEmpty } from './lib/utils';
import { Streamer, StreamerCentral } from '../../../../server/modules/streamer/streamer.module';
import { api } from '../../../../server/sdk/api';
import { Streamer, StreamerCentral } from '../../../../apps/meteor/server/modules/streamer/streamer.module';
import { api } from '../../../../apps/meteor/server/sdk/api';
StreamerCentral.on('broadcast', (name, eventName, args) => {
api.broadcast('stream', [name, eventName, args]);

View File

@ -3,10 +3,10 @@ import { EventEmitter } from 'events';
import { UserStatus } from '@rocket.chat/core-typings';
import { DDP_EVENTS, WS_ERRORS } from './constants';
import { Account, Presence, MeteorService } from '../../../../server/sdk';
import { Account, Presence, MeteorService } from '../../../../apps/meteor/server/sdk';
import { Server } from './Server';
import { api } from '../../../../server/sdk/api';
import { MeteorError } from '../../../../server/sdk/errors';
import { api } from '../../../../apps/meteor/server/sdk/api';
import { MeteorError } from '../../../../apps/meteor/server/sdk/errors';
import { Autoupdate } from './lib/Autoupdate';
export const server = new Server();

View File

@ -1,8 +1,8 @@
import { EventEmitter } from 'events';
import { AutoUpdateRecord } from '../../../../../server/sdk/types/IMeteor';
import { AutoUpdateRecord } from '../../../../../apps/meteor/server/sdk/types/IMeteor';
export const Autoupdate = new (class Autoupdate extends EventEmitter {
class AutoupdateSingleton extends EventEmitter {
private versions = new Map<string, Omit<AutoUpdateRecord, '_id'>>();
public updateVersion(record: AutoUpdateRecord): void {
@ -15,4 +15,6 @@ export const Autoupdate = new (class Autoupdate extends EventEmitter {
public getVersions(): Map<string, Omit<AutoUpdateRecord, '_id'>> {
return this.versions;
}
})();
}
export const Autoupdate = new AutoupdateSingleton();

View File

@ -0,0 +1,6 @@
import '../../../../apps/meteor/ee/server/startup/broker';
import { api } from '../../../../apps/meteor/server/sdk/api';
import { DDPStreamer } from './DDPStreamer';
api.registerService(new DDPStreamer());

View File

@ -0,0 +1,23 @@
import type { ISubscription, IRoom, IUser, ISetting } from '@rocket.chat/core-typings';
import { NotificationsModule } from '../../../../apps/meteor/server/modules/notifications/notifications.module';
import { Stream } from './Streamer';
import { Collections, getConnection } from '../../../../apps/meteor/ee/server/services/mongo';
import { RoomsRaw } from '../../../../apps/meteor/app/models/server/raw/Rooms';
import { SubscriptionsRaw } from '../../../../apps/meteor/app/models/server/raw/Subscriptions';
import { UsersRaw } from '../../../../apps/meteor/app/models/server/raw/Users';
import { SettingsRaw } from '../../../../apps/meteor/app/models/server/raw/Settings';
export const notifications = new NotificationsModule(Stream);
getConnection().then((db) => {
const Users = new UsersRaw(db.collection<IUser>(Collections.User));
notifications.configure({
Rooms: new RoomsRaw(db.collection<IRoom>(Collections.Rooms)),
Subscriptions: new SubscriptionsRaw(db.collection<ISubscription>(Collections.Subscriptions), {
Users,
}),
Users,
Settings: new SettingsRaw(db.collection<ISetting>(Collections.Settings)),
});
});

View File

@ -0,0 +1,29 @@
{
"extends": "../../../tsconfig.base.json",
"compilerOptions": {
"target": "es2018",
"lib": ["esnext", "dom"],
"allowJs": true,
"checkJs": false,
"incremental": true,
/* Strict Type-Checking Options */
"noImplicitAny": true,
"strictNullChecks": true,
"strictPropertyInitialization": false,
/* Additional Checks */
"noUnusedLocals": true,
"noUnusedParameters": true,
"noImplicitReturns": false,
"noFallthroughCasesInSwitch": false,
/* Module Resolution Options */
"outDir": "./dist",
"importsNotUsedAsValues": "preserve",
"declaration": false,
"declarationMap": false
},
"include": ["./src/**/*", "../../../apps/meteor/definition", "./definition"],
"exclude": ["./dist", "./ecosystem.config.js"]
}

View File

@ -21,6 +21,8 @@
"workspaces": [
"apps/*",
"packages/*",
"ee/apps/*",
"ee/packages/*",
"apps/meteor/ee/server/services"
],
"repository": {

104
yarn.lock
View File

@ -3638,6 +3638,41 @@ __metadata:
languageName: node
linkType: hard
"@rocket.chat/ddp-streamer@workspace:ee/apps/ddp-streamer":
version: 0.0.0-use.local
resolution: "@rocket.chat/ddp-streamer@workspace:ee/apps/ddp-streamer"
dependencies:
"@rocket.chat/apps-engine": ^1.31.0
"@rocket.chat/core-typings": "workspace:^"
"@rocket.chat/emitter": ~0.31.9
"@rocket.chat/eslint-config": "workspace:^"
"@rocket.chat/rest-typings": "workspace:^"
"@rocket.chat/string-helpers": ~0.31.9
"@rocket.chat/ui-contexts": "workspace:^"
"@types/ejson": ^2.1.3
"@types/meteor": 1.4.81
"@types/mongodb": ^3.6.20
"@types/node": ^14.18.12
"@types/sharp": ^0.30.2
"@types/uuid": ^8.3.4
"@types/ws": ^8.5.3
colorette: ^1.3.0
ejson: ^2.2.2
eventemitter3: ^4.0.7
fibers: ^5.0.1
jaeger-client: ^3.19.0
moleculer: ^0.14.19
mongodb: ^3.6.10
nats: ^2.4.0
pino: ^7.9.2
pino-pretty: ^7.6.0
sharp: ^0.30.4
typescript: ~4.3.5
uuid: ^7.0.3
ws: ^8.5.0
languageName: unknown
linkType: soft
"@rocket.chat/emitter@npm:^0.31.11, @rocket.chat/emitter@npm:~0.31.11, @rocket.chat/emitter@npm:~0.31.9":
version: 0.31.11
resolution: "@rocket.chat/emitter@npm:0.31.11"
@ -6964,6 +6999,15 @@ __metadata:
languageName: node
linkType: hard
"@types/sharp@npm:^0.30.2":
version: 0.30.2
resolution: "@types/sharp@npm:0.30.2"
dependencies:
"@types/node": "*"
checksum: dc6b332c309e1eb62e98b62f92829c4b06c3adb474c1ee8b504eb95e6d43be8804b8d541874d0769160595fdf46f7a7a0fe544a3659482ad0a19ac700944f3a4
languageName: node
linkType: hard
"@types/sinonjs__fake-timers@npm:^6.0.2":
version: 6.0.4
resolution: "@types/sinonjs__fake-timers@npm:6.0.4"
@ -7121,7 +7165,7 @@ __metadata:
languageName: node
linkType: hard
"@types/uuid@npm:^8.3.1":
"@types/uuid@npm:^8.3.1, @types/uuid@npm:^8.3.4":
version: 8.3.4
resolution: "@types/uuid@npm:8.3.4"
checksum: 6f11f3ff70f30210edaa8071422d405e9c1d4e53abbe50fdce365150d3c698fe7bbff65c1e71ae080cbfb8fded860dbb5e174da96fdbbdfcaa3fb3daa474d20f
@ -11252,7 +11296,7 @@ __metadata:
languageName: node
linkType: hard
"color@npm:^4.0.1":
"color@npm:^4.0.1, color@npm:^4.2.3":
version: 4.2.3
resolution: "color@npm:4.2.3"
dependencies:
@ -11262,7 +11306,7 @@ __metadata:
languageName: node
linkType: hard
"colorette@npm:^1.4.0":
"colorette@npm:^1.3.0, colorette@npm:^1.4.0":
version: 1.4.0
resolution: "colorette@npm:1.4.0"
checksum: 01c3c16058b182a4ab4c126a65a75faa4d38a20fa7c845090b25453acec6c371bb2c5dceb0a2338511f17902b9d1a9af0cadd8509c9403894b79311032c256c3
@ -13176,7 +13220,7 @@ __metadata:
languageName: node
linkType: hard
"detect-libc@npm:^2.0.0":
"detect-libc@npm:^2.0.0, detect-libc@npm:^2.0.1":
version: 2.0.1
resolution: "detect-libc@npm:2.0.1"
checksum: ccb05fcabbb555beb544d48080179c18523a343face9ee4e1a86605a8715b4169f94d663c21a03c310ac824592f2ba9a5270218819bb411ad7be578a527593d7
@ -23042,7 +23086,7 @@ __metadata:
languageName: node
linkType: hard
"moleculer@npm:^0.14.20":
"moleculer@npm:^0.14.19, moleculer@npm:^0.14.20":
version: 0.14.20
resolution: "moleculer@npm:0.14.20"
dependencies:
@ -23610,7 +23654,7 @@ __metadata:
languageName: node
linkType: hard
"node-addon-api@npm:^4.2.0":
"node-addon-api@npm:^4.2.0, node-addon-api@npm:^4.3.0":
version: 4.3.0
resolution: "node-addon-api@npm:4.3.0"
dependencies:
@ -25460,7 +25504,7 @@ __metadata:
languageName: node
linkType: hard
"pino-pretty@npm:^7.6.1":
"pino-pretty@npm:^7.6.0, pino-pretty@npm:^7.6.1":
version: 7.6.1
resolution: "pino-pretty@npm:7.6.1"
dependencies:
@ -25490,7 +25534,7 @@ __metadata:
languageName: node
linkType: hard
"pino@npm:^7.10.0":
"pino@npm:^7.10.0, pino@npm:^7.9.2":
version: 7.10.0
resolution: "pino@npm:7.10.0"
dependencies:
@ -26549,6 +26593,29 @@ __metadata:
languageName: node
linkType: hard
"prebuild-install@npm:^7.0.1":
version: 7.1.0
resolution: "prebuild-install@npm:7.1.0"
dependencies:
detect-libc: ^2.0.0
expand-template: ^2.0.3
github-from-package: 0.0.0
minimist: ^1.2.3
mkdirp-classic: ^0.5.3
napi-build-utils: ^1.0.1
node-abi: ^3.3.0
npmlog: ^4.0.1
pump: ^3.0.0
rc: ^1.2.7
simple-get: ^4.0.0
tar-fs: ^2.0.0
tunnel-agent: ^0.6.0
bin:
prebuild-install: bin.js
checksum: 204f2d89c6d6179fa1039036514aa72f7d0b537e421ef72c40840286e318f41489f00f22c6acc725cce6e10d43825b69dcabeaadfc917db781c58cd56fc25f90
languageName: node
linkType: hard
"precond@npm:0.2":
version: 0.2.3
resolution: "precond@npm:0.2.3"
@ -29377,7 +29444,7 @@ __metadata:
languageName: node
linkType: hard
"semver@npm:7.x, semver@npm:^7.2, semver@npm:^7.2.1, semver@npm:^7.3.2, semver@npm:^7.3.4, semver@npm:^7.3.5":
"semver@npm:7.x, semver@npm:^7.2, semver@npm:^7.2.1, semver@npm:^7.3.2, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7":
version: 7.3.7
resolution: "semver@npm:7.3.7"
dependencies:
@ -29625,6 +29692,23 @@ __metadata:
languageName: node
linkType: hard
"sharp@npm:^0.30.4":
version: 0.30.4
resolution: "sharp@npm:0.30.4"
dependencies:
color: ^4.2.3
detect-libc: ^2.0.1
node-addon-api: ^4.3.0
node-gyp: latest
prebuild-install: ^7.0.1
semver: ^7.3.7
simple-get: ^4.0.1
tar-fs: ^2.1.1
tunnel-agent: ^0.6.0
checksum: 80070d8cad5fe20e7bbb2a1cfddda3f7d421f6af8302c05af8307c0b3b1972e6ed2690563e90b2897b4b499b32967d28a15e37f5d196a1f8867d630609052211
languageName: node
linkType: hard
"shebang-command@npm:^1.2.0":
version: 1.2.0
resolution: "shebang-command@npm:1.2.0"
@ -29718,7 +29802,7 @@ __metadata:
languageName: node
linkType: hard
"simple-get@npm:^4.0.0":
"simple-get@npm:^4.0.0, simple-get@npm:^4.0.1":
version: 4.0.1
resolution: "simple-get@npm:4.0.1"
dependencies: