Fix services connectivity (#6193)

Signed-off-by: Andrey Sobolev <haiodo@gmail.com>
This commit is contained in:
Andrey Sobolev 2024-07-31 02:12:03 +07:00 committed by GitHub
parent 3969fb0dd8
commit 824defc6e3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
21 changed files with 54 additions and 119 deletions

View File

@ -19,6 +19,7 @@
"_phase:docker-staging": "rushx docker:staging",
"bundle": "mkdir -p bundle && esbuild src/index.ts --bundle --platform=node > bundle/bundle.js",
"docker:build": "../../../common/scripts/docker_build.sh hardcoreeng/calendar",
"docker:tbuild": "docker build -t hardcoreeng/calendar . --platform=linux/amd64 && ../../../common/scripts/docker_tag_push.sh hardcoreeng/calendar",
"docker:staging": "../../../common/scripts/docker_tag.sh hardcoreeng/calendar staging",
"docker:push": "../../../common/scripts/docker_tag.sh hardcoreeng/calendar",
"run-local": "cross-env ts-node src/index.ts",
@ -63,6 +64,7 @@
"@hcengineering/setting": "^0.6.17",
"@hcengineering/text": "^0.6.5",
"@hcengineering/server-client": "^0.6.0",
"@hcengineering/server-token": "^0.6.11",
"dotenv": "~16.0.0",
"cors": "^2.8.5",
"express": "^4.19.2",

View File

@ -1,21 +0,0 @@
//
// Copyright © 2023 Hardcore Engineering Inc.
//
// Licensed under the Eclipse Public License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. You may
// obtain a copy of the License at https://www.eclipse.org/legal/epl-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//
// See the License for the specific language governing permissions and
// limitations under the License.
//
import { encode as jwtEncode, decode as jwtDecode } from 'jwt-simple'
import config from './config'
export const encode = (data: any): string => jwtEncode(data, config.Secret)
export const decode = (data: string): any => jwtDecode(data, config.Secret)

View File

@ -18,12 +18,12 @@ import { decode64 } from './base64'
import { CalendarClient } from './calendar'
import { CalendarController } from './calendarController'
import config from './config'
import { decode } from './jwt'
import { createServer, listen } from './server'
import { closeDB, getDB } from './storage'
import { type Endpoint, type State } from './types'
import { setMetadata } from '@hcengineering/platform'
import serverClient from '@hcengineering/server-client'
import serverToken, { decodeToken } from '@hcengineering/server-token'
const extractToken = (header: IncomingHttpHeaders): any => {
try {
@ -36,6 +36,7 @@ const extractToken = (header: IncomingHttpHeaders): any => {
export const main = async (): Promise<void> => {
setMetadata(serverClient.metadata.Endpoint, config.AccountsURL)
setMetadata(serverClient.metadata.UserAgent, config.ServiceID)
setMetadata(serverToken.metadata.Secret, config.Secret)
const db = await getDB()
const calendarController = CalendarController.getCalendarController(db)
@ -54,9 +55,9 @@ export const main = async (): Promise<void> => {
}
const redirectURL = req.query.redirectURL as string
const { email, workspace } = decode(token)
const userId = await calendarController.getUserId(email, workspace)
const url = CalendarClient.getAutUrl(redirectURL, workspace, userId, token)
const { email, workspace } = decodeToken(token)
const userId = await calendarController.getUserId(email, workspace.name)
const url = CalendarClient.getAutUrl(redirectURL, workspace.name, userId, token)
res.send(url)
} catch (err) {
console.log('signin error', err)
@ -93,8 +94,8 @@ export const main = async (): Promise<void> => {
const value = req.query.value as string
const { workspace } = decode(token)
await calendarController.signout(workspace, value)
const { workspace } = decodeToken(token)
await calendarController.signout(workspace.name, value)
} catch (err) {
console.log('signout error', err)
}

View File

@ -33,9 +33,9 @@ import { Collection, type Db } from 'mongodb'
import { CalendarClient } from './calendar'
import { getClient } from './client'
import config from './config'
import { encode } from './jwt'
import { SyncHistory, type ProjectCredentials, type User } from './types'
import { CalendarController } from './calendarController'
import { generateToken } from '@hcengineering/server-token'
export class WorkspaceClient {
private readonly txHandlers: ((...tx: Tx[]) => Promise<void>)[] = []
@ -157,10 +157,7 @@ export class WorkspaceClient {
}
private async initClient (workspace: string): Promise<Client> {
const token = encode({
email: config.SystemEmail,
workspace
})
const token = generateToken(config.SystemEmail, { name: workspace, productId: '' })
const client = await getClient(token)
client.notify = (...tx: Tx[]) => {
void this.txHandler(...tx)

View File

@ -19,6 +19,7 @@
"_phase:docker-staging": "rushx docker:staging",
"bundle": "mkdir -p bundle && esbuild src/index.ts --bundle --platform=node > bundle/bundle.js",
"docker:build": "../../../common/scripts/docker_build.sh hardcoreeng/gmail",
"docker:tbuild": "docker build -t hardcoreeng/gmail . --platform=linux/amd64 && ../../../common/scripts/docker_tag_push.sh hardcoreeng/gmail",
"docker:staging": "../../../common/scripts/docker_tag.sh hardcoreeng/gmail staging",
"docker:push": "../../../common/scripts/docker_tag.sh hardcoreeng/gmail",
"run-local": "cross-env ts-node src/index.ts",
@ -59,6 +60,7 @@
"@hcengineering/contact": "^0.6.24",
"@hcengineering/core": "^0.6.32",
"@hcengineering/gmail": "^0.6.22",
"@hcengineering/server-token": "^0.6.11",
"@hcengineering/platform": "^0.6.11",
"@hcengineering/setting": "^0.6.17",
"@hcengineering/server-client": "^0.6.0",

View File

@ -19,5 +19,6 @@ import { createClient, getTransactorEndpoint } from '@hcengineering/server-clien
export async function getClient (token: string): Promise<Client> {
const endpoint = await getTransactorEndpoint(token)
return await createClient(token, endpoint)
console.log('connecting to', endpoint)
return await createClient(endpoint, token)
}

View File

@ -111,7 +111,7 @@ export class GmailController {
res = await WorkspaceClient.create(this.credentials, this.mongo, workspace)
this.workspaces.set(workspace, res)
} catch (err) {
console.error(`Couldn't create workspace worker for ${workspace}, reason: ${JSON.stringify(err)}`)
console.error(`Couldn't create workspace worker for ${workspace}, reason: `, err)
throw err
}
}

View File

@ -1,22 +0,0 @@
//
// Copyright © 2020, 2021 Anticrm Platform Contributors.
// Copyright © 2021 Hardcore Engineering Inc.
//
// Licensed under the Eclipse Public License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. You may
// obtain a copy of the License at https://www.eclipse.org/legal/epl-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//
// See the License for the specific language governing permissions and
// limitations under the License.
//
import { encode as jwtEncode, decode as jwtDecode } from 'jwt-simple'
import config from './config'
export const encode = (data: any): string => jwtEncode(data, config.Secret)
export const decode = (data: string): any => jwtDecode(data, config.Secret)

View File

@ -16,11 +16,11 @@
import { setMetadata } from '@hcengineering/platform'
import serverClient from '@hcengineering/server-client'
import serverToken, { decodeToken } from '@hcengineering/server-token'
import { type IncomingHttpHeaders } from 'http'
import { decode64 } from './base64'
import config from './config'
import { GmailController } from './gmailController'
import { decode } from './jwt'
import { createServer, listen } from './server'
import { closeDB, getDB } from './storage'
import { type Endpoint, type State } from './types'
@ -36,6 +36,7 @@ const extractToken = (header: IncomingHttpHeaders): any => {
export const main = async (): Promise<void> => {
setMetadata(serverClient.metadata.Endpoint, config.AccountsURL)
setMetadata(serverClient.metadata.UserAgent, config.ServiceID)
setMetadata(serverToken.metadata.Secret, config.Secret)
const db = await getDB()
const gmailController = GmailController.getGmailController(db)
await gmailController.startAll()
@ -53,8 +54,8 @@ export const main = async (): Promise<void> => {
}
const redirectURL = req.query.redirectURL as string
const { email, workspace } = decode(token)
const gmail = await gmailController.getGmailClient(email, workspace, token)
const { email, workspace } = decodeToken(token)
const gmail = await gmailController.getGmailClient(email, workspace.name, token)
const url = gmail.getAutUrl(redirectURL)
res.send(url)
} catch (err) {
@ -86,8 +87,8 @@ export const main = async (): Promise<void> => {
return
}
const { email, workspace } = decode(token)
await gmailController.signout(workspace, email)
const { email, workspace } = decodeToken(token)
await gmailController.signout(workspace.name, email)
} catch (err) {
console.log('signout error', JSON.stringify(err))
}

View File

@ -28,12 +28,12 @@ import core, {
type TxUpdateDoc
} from '@hcengineering/core'
import gmailP, { type NewMessage } from '@hcengineering/gmail'
import { generateToken } from '@hcengineering/server-token'
import { type Db } from 'mongodb'
import { getClient } from './client'
import config from './config'
import { GmailClient } from './gmail'
import { encode } from './jwt'
import { type ProjectCredentials, type User, type Channel } from './types'
import { type Channel, type ProjectCredentials, type User } from './types'
export class WorkspaceClient {
private messageSubscribed: boolean = false
@ -106,10 +106,8 @@ export class WorkspaceClient {
}
private async initClient (workspace: string): Promise<Client> {
const token = encode({
email: config.SystemEmail,
workspace
})
const token = generateToken(config.SystemEmail, { name: workspace, productId: '' })
console.log('token', token, workspace)
const client = await getClient(token)
client.notify = (...tx: Tx[]) => {
void this.txHandler(...tx)

View File

@ -19,6 +19,7 @@
"_phase:docker-staging": "rushx docker:staging",
"bundle": "mkdir -p bundle && esbuild src/index.ts --bundle --platform=node > bundle/bundle.js",
"docker:build": "../../common/scripts/docker_build.sh hardcoreeng/love .",
"docker:tbuild": "docker build -t hardcoreeng/love . --platform=linux/amd64 && ../../common/scripts/docker_tag_push.sh hardcoreeng/love",
"docker:staging": "../../common/scripts/docker_tag.sh hardcoreeng/love staging",
"docker:push": "../../common/scripts/docker_tag.sh hardcoreeng/love",
"run-local": "cross-env ts-node src/index.ts",
@ -62,6 +63,7 @@
"@hcengineering/client-resources": "^0.6.27",
"@hcengineering/platform": "^0.6.11",
"@hcengineering/server-client": "^0.6.0",
"@hcengineering/server-token": "^0.6.11",
"ws": "^8.18.0",
"livekit-server-sdk": "^2.0.10",
"jwt-simple": "^0.5.6",

View File

@ -1,21 +0,0 @@
//
// Copyright © 2023 Hardcore Engineering Inc.
//
// Licensed under the Eclipse Public License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. You may
// obtain a copy of the License at https://www.eclipse.org/legal/epl-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//
// See the License for the specific language governing permissions and
// limitations under the License.
//
import { encode as jwtEncode, decode as jwtDecode } from 'jwt-simple'
import config from './config'
export const encode = (data: any): string => jwtEncode(data, config.Secret)
export const decode = (data: string): any => jwtDecode(data, config.Secret)

View File

@ -13,11 +13,12 @@
// limitations under the License.
//
import { MeasureMetricsContext, WorkspaceId, getWorkspaceId, newMetrics, toWorkspaceString } from '@hcengineering/core'
import { MeasureMetricsContext, WorkspaceId, newMetrics, toWorkspaceString } from '@hcengineering/core'
import { setMetadata } from '@hcengineering/platform'
import serverClient from '@hcengineering/server-client'
import { StorageConfig, StorageConfiguration } from '@hcengineering/server-core'
import { buildStorageFromConfig, storageConfigFromEnv } from '@hcengineering/server-storage'
import serverToken, { decodeToken } from '@hcengineering/server-token'
import cors from 'cors'
import express from 'express'
import { IncomingHttpHeaders } from 'http'
@ -32,7 +33,6 @@ import {
} from 'livekit-server-sdk'
import { v4 as uuid } from 'uuid'
import config from './config'
import { decode } from './jwt'
import { WorkspaceClient } from './workspaceClient'
const extractToken = (header: IncomingHttpHeaders): any => {
@ -46,6 +46,7 @@ const extractToken = (header: IncomingHttpHeaders): any => {
export const main = async (): Promise<void> => {
setMetadata(serverClient.metadata.Endpoint, config.AccountsURL)
setMetadata(serverClient.metadata.UserAgent, config.ServiceID)
setMetadata(serverToken.metadata.Secret, config.Secret)
const storageConfigs: StorageConfiguration = storageConfigFromEnv()
const ctx = new MeasureMetricsContext('love', {}, {}, newMetrics())
@ -120,14 +121,13 @@ export const main = async (): Promise<void> => {
const roomName = req.body.roomName
const room = req.body.room
const { workspace, productId } = decode(token)
const workspaceId = getWorkspaceId(workspace, productId)
const { workspace } = decodeToken(token)
try {
const dateStr = new Date().toISOString().replace('T', '_').slice(0, 19)
const name = `${room}_${dateStr}.mp4`
const id = await startRecord(storageConfig, egressClient, roomClient, roomName, workspaceId)
dataByUUID.set(id, { name, workspace, workspaceId })
const id = await startRecord(storageConfig, egressClient, roomClient, roomName, workspace)
dataByUUID.set(id, { name, workspace: workspace.name, workspaceId: workspace })
res.send()
} catch (e) {
console.error(e)
@ -144,7 +144,7 @@ export const main = async (): Promise<void> => {
return
}
// just check token
decode(token)
decodeToken(token)
await roomClient.updateRoomMetadata(req.body.roomName, JSON.stringify({ recording: false }))
void stopEgress(egressClient, req.body.roomName)
res.send()

View File

@ -15,9 +15,9 @@
import core, { Client, Ref, TxOperations, type Blob } from '@hcengineering/core'
import drive, { createFile } from '@hcengineering/drive'
import love from '@hcengineering/love'
import { generateToken } from '@hcengineering/server-token'
import { getClient } from './client'
import config from './config'
import { encode } from './jwt'
export class WorkspaceClient {
private client!: TxOperations
@ -35,10 +35,7 @@ export class WorkspaceClient {
}
private async initClient (workspace: string): Promise<Client> {
const token = encode({
email: config.SystemEmail,
workspace
})
const token = generateToken(config.SystemEmail, { name: workspace, productId: '' })
const client = await getClient(token)
this.client = new TxOperations(client, core.account.System)
return this.client

View File

@ -19,6 +19,7 @@
"_phase:docker-staging": "rushx docker:staging",
"bundle": "mkdir -p bundle && esbuild src/index.ts --bundle --platform=node --keep-names > bundle/bundle.js",
"docker:build": "cross-env DOCKER_EXTRA=--platform=linux/amd64 ../../../common/scripts/docker_build.sh hardcoreeng/sign",
"docker:tbuild": "docker build -t hardcoreeng/sign . --platform=linux/amd64 && ../../../common/scripts/docker_tag_push.sh hardcoreeng/sign",
"docker:staging": "../../../common/scripts/docker_tag.sh hardcoreeng/sign staging",
"docker:push": "../../../common/scripts/docker_tag.sh hardcoreeng/sign",
"run-local": "cross-env ts-node src/index.ts",

View File

@ -55,7 +55,7 @@ export class SignController {
productId: ''
})
const endpoint = await getTransactorEndpoint(token)
const connection = await createClient(token, endpoint)
const connection = await createClient(endpoint, token)
console.log(`Platform client has been created (workspace: ${workspace})`)

View File

@ -19,6 +19,7 @@
"_phase:docker-staging": "rushx docker:staging",
"bundle": "mkdir -p bundle && esbuild src/index.ts --bundle --platform=node > bundle/bundle.js",
"docker:build": "../../../common/scripts/docker_build.sh hardcoreeng/telegram",
"docker:tbuild": "docker build -t hardcoreeng/telegram . --platform=linux/amd64 && ../../../common/scripts/docker_tag_push.sh hardcoreeng/telegram",
"docker:staging": "../../../common/scripts/docker_tag.sh hardcoreeng/telegram staging",
"docker:push": "../../../common/scripts/docker_tag.sh hardcoreeng/telegram",
"run-local": "cross-env ts-node src/index.ts",
@ -63,6 +64,7 @@
"@hcengineering/platform": "^0.6.11",
"@hcengineering/setting": "^0.6.17",
"@hcengineering/telegram": "^0.6.21",
"@hcengineering/server-token": "^0.6.11",
"@hcengineering/server-client": "^0.6.0",
"big-integer": "^1.6.51",
"dotenv": "~16.0.0",

View File

@ -1,6 +0,0 @@
import { encode as jwtEncode, decode as jwtDecode } from 'jwt-simple'
import config from './config'
export const encode = (data: any): string => jwtEncode(data, config.Secret)
export const decode = (data: string): any => jwtDecode(data, config.Secret)

View File

@ -1,16 +1,16 @@
import { IncomingHttpHeaders } from 'http'
import { decode } from './jwt'
import { PlatformWorker } from './platform'
import { createServer, Handler, listen } from './server'
import { telegram } from './telegram'
import { setMetadata } from '@hcengineering/platform'
import serverClient from '@hcengineering/server-client'
import serverToken, { decodeToken, type Token } from '@hcengineering/server-token'
import config from './config'
const extractToken = (header: IncomingHttpHeaders): any => {
const extractToken = (header: IncomingHttpHeaders): Token | undefined => {
try {
return decode(header.authorization?.slice(7) ?? '')
return decodeToken(header.authorization?.slice(7) ?? '')
} catch {
return undefined
}
@ -19,6 +19,7 @@ const extractToken = (header: IncomingHttpHeaders): any => {
export const main = async (): Promise<void> => {
setMetadata(serverClient.metadata.Endpoint, config.AccountsURL)
setMetadata(serverClient.metadata.UserAgent, config.ServiceID)
setMetadata(serverToken.metadata.Secret, config.Secret)
const platformWorker = await PlatformWorker.create()
const endpoints: Array<[string, Handler]> = [
@ -41,7 +42,7 @@ export const main = async (): Promise<void> => {
const existingRec = await platformWorker.getUserRecord({
phone,
workspace
workspace: workspace.name
})
if (existingRec !== undefined) {
@ -79,7 +80,7 @@ export const main = async (): Promise<void> => {
const existingRec = await platformWorker.getUserRecord({
phone,
workspace
workspace: workspace.name
})
if (existingRec !== undefined) {
@ -102,7 +103,7 @@ export const main = async (): Promise<void> => {
if (conn !== undefined) {
await platformWorker.addUser({
email,
workspace,
workspace: workspace.name,
phone,
conn
})
@ -134,7 +135,7 @@ export const main = async (): Promise<void> => {
const existingRec = await platformWorker.getUserRecord({
phone,
workspace
workspace: workspace.name
})
if (existingRec !== undefined) {
@ -156,7 +157,7 @@ export const main = async (): Promise<void> => {
if (conn !== undefined) {
await platformWorker.addUser({
email,
workspace,
workspace: workspace.name,
phone,
conn
})
@ -177,7 +178,7 @@ export const main = async (): Promise<void> => {
}
const { email, workspace } = token
await platformWorker.removeUser({ email, workspace })
await platformWorker.removeUser({ email, workspace: workspace.name })
res.send()
}

View File

@ -117,7 +117,7 @@ export async function createPlatformClient (token: string): Promise<Client> {
})
const endpoint = await getTransactorEndpoint(token)
const connection = await createClient(token, endpoint)
const connection = await createClient(endpoint, token)
return connection
}

View File

@ -24,9 +24,9 @@ import core, {
TxRemoveDoc,
TxUpdateDoc
} from '@hcengineering/core'
import { generateToken } from '@hcengineering/server-token'
import settingP from '@hcengineering/setting'
import telegramP, { NewTelegramMessage } from '@hcengineering/telegram'
import { encode } from 'jwt-simple'
import type { Collection } from 'mongodb'
import fetch from 'node-fetch'
import { Api } from 'telegram'
@ -155,7 +155,7 @@ export class WorkspaceWorker {
lastMsgStorage: Collection<LastMsgRecord>,
channelsStorage: Collection<WorkspaceChannel>
): Promise<WorkspaceWorker> {
const token = encode({ email: config.SystemEmail, workspace }, config.Secret)
const token = generateToken(config.SystemEmail, { name: workspace, productId: '' })
const client = await createPlatformClient(token)
const worker = new WorkspaceWorker(client, token, workspace, userStorage, lastMsgStorage, channelsStorage)