From d76f2e240e2c6f42c9fdfeb42bdd33f6e9aebc51 Mon Sep 17 00:00:00 2001 From: Peter Maquiran Date: Wed, 21 Aug 2024 10:40:54 +0100 Subject: [PATCH] fix login to socket --- gabinete-digital-fo.code-workspace | 6 ++++++ .../dexie/dexie-repository.service.ts | 14 +++++++++----- src/app/module/chat/chat.module.ts | 2 +- .../member-list-local-repository.service.ts | 9 +++++++-- ...message-live-signalr-data-source.service.ts | 4 ++++ .../module/chat/domain/chat-service.service.ts | 12 ++++++++++-- .../use-case/listen-send-message.service.ts | 2 -- .../socket-connect-use-case.service.ts | 18 ++++++++++++++++++ .../use-case/sync-all-room-messages.service.ts | 14 +++++++++++--- .../infra/database/dexie/schema/members.ts | 4 ++-- .../chat/infra/socket/signal-r.service.ts | 4 ++-- .../monitoring/opentelemetry/matrix.ts | 9 ++++++++- .../monitoring/opentelemetry/tracer.ts | 9 ++++++++- 13 files changed, 86 insertions(+), 21 deletions(-) create mode 100644 src/app/module/chat/domain/use-case/socket-connect-use-case.service.ts diff --git a/gabinete-digital-fo.code-workspace b/gabinete-digital-fo.code-workspace index 5a212dcbc..092707a98 100644 --- a/gabinete-digital-fo.code-workspace +++ b/gabinete-digital-fo.code-workspace @@ -24,6 +24,12 @@ }, { "path": "../ionic6" + }, + { + "path": "../../../Downloads/opentelemetry-js-main" + }, + { + "path": "../ionic7" } ], "settings": { diff --git a/src/app/infra/repository/dexie/dexie-repository.service.ts b/src/app/infra/repository/dexie/dexie-repository.service.ts index d01988d29..4f0da7125 100644 --- a/src/app/infra/repository/dexie/dexie-repository.service.ts +++ b/src/app/infra/repository/dexie/dexie-repository.service.ts @@ -26,11 +26,13 @@ export class DexieRepository { const id = await this.table.add(dataValidation.data); return ok(id); } catch (error) { - return err(new Error('Failed to insert document: ' + error.message)); + console.log(error) + return err(new Error('Failed to insert document: ' + error)); } } else { Logger.error(`dexie.js failed to insert into ${this.table.name}, invalid data`, { - data: document + data: document, + zodError: dataValidation.error.issues }); return err((dataValidation as unknown as ZodError)) } @@ -42,6 +44,10 @@ export class DexieRepository { const validationResult = schema.safeParse(documents) if(!validationResult.success) { + Logger.error(`dexie.js failed to insert many into ${this.table.name}, invalid data`, { + data: document, + zodError: validationResult.error.issues + }); return err((validationResult as unknown as ZodError)) } @@ -49,9 +55,7 @@ export class DexieRepository { const ids = await this.table.bulkAdd(documents as any); return ok(ids); } catch (error) { - Logger.error(`dexie.js failed to insert many into ${this.table.name}, invalid data`, { - data: document - }); + return err(new Error('Failed to insert multiple documents: ' + error.message)); } } diff --git a/src/app/module/chat/chat.module.ts b/src/app/module/chat/chat.module.ts index 77b889d88..0e49270d0 100644 --- a/src/app/module/chat/chat.module.ts +++ b/src/app/module/chat/chat.module.ts @@ -63,7 +63,7 @@ export class ChatModule { ).subscribe((value)=> { if(value) { // on reconnect - this.ChatServiceService.start(); + this.ChatServiceService.chatSync(); } }); diff --git a/src/app/module/chat/data/repository/member-list-local-repository.service.ts b/src/app/module/chat/data/repository/member-list-local-repository.service.ts index fb03fd6f7..20aaaf31a 100644 --- a/src/app/module/chat/data/repository/member-list-local-repository.service.ts +++ b/src/app/module/chat/data/repository/member-list-local-repository.service.ts @@ -1,9 +1,7 @@ import { Injectable } from '@angular/core'; -import { RoomListItemOutPutDTO, RoomListOutPutDTO } from '../dto/room/roomListOutputDTO'; import { Dexie, EntityTable, liveQuery, Observable } from 'Dexie'; import { z } from 'zod'; import { DexieRepository } from 'src/app/infra/repository/dexie/dexie-repository.service'; -import { RoomTable, RoomTableSchema } from '../../infra/database/dexie/schema/room'; import { chatDatabase } from '../../infra/database/dexie/service'; import { ok } from 'neverthrow'; import { err, Result } from 'neverthrow'; @@ -37,6 +35,13 @@ export class MemberListLocalRepository extends DexieRepository { async addMember(data: MemberTable) { data.$roomIdUserId = data.roomId + data.wxUserId return this.insert(data) + // try { + // data.$roomIdUserId = data.roomId + data.wxUserId + // const result = await chatDatabase.members.add(data) + // return ok(result) + // } catch (e) { + // return err(false) + // } } async updateMemberRole(data: MemberTable) { diff --git a/src/app/module/chat/data/repository/message/message-live-signalr-data-source.service.ts b/src/app/module/chat/data/repository/message/message-live-signalr-data-source.service.ts index cad24eec7..e7f8f025a 100644 --- a/src/app/module/chat/data/repository/message/message-live-signalr-data-source.service.ts +++ b/src/app/module/chat/data/repository/message/message-live-signalr-data-source.service.ts @@ -44,6 +44,10 @@ export class MessageSocketRepositoryService { private socket: SignalRService ) {} + connect() { + return this.socket.establishConnection(); + } + async sendMessage(data: msgObj) { try { diff --git a/src/app/module/chat/domain/chat-service.service.ts b/src/app/module/chat/domain/chat-service.service.ts index 6197cde3e..43a728c2b 100644 --- a/src/app/module/chat/domain/chat-service.service.ts +++ b/src/app/module/chat/domain/chat-service.service.ts @@ -25,6 +25,7 @@ import { SendLocalMessagesUseCaseService } from './use-case/messages-send-offlin import { RemoveMemberUseCaseService } from './use-case/member/-use-case.service' import { AddMemberUseCaseService } from './use-case/member-add-use-case.service' import { UpdateRoomByIdUseCaseService } from './use-case/room-update-by-id-use-case.service' +import { SocketConnectUseCaseService } from './use-case/socket-connect-use-case.service' import { MessageMarkAsReadUseCaseService } from './use-case/message/message-mark-as-read-use-case.service' import { GetMessageAttachmentLocallyUseCaseService } from 'src/app/module/chat/domain/use-case/message-get-attachment-localy-use-case.service'; import { GetRoomListUseCaseService } from 'src/app/module/chat/domain/use-case/room-get-list-use-case.service'; @@ -76,7 +77,8 @@ export class ChatServiceService { private RemoveMemberUseCaseService: RemoveMemberUseCaseService, private MessageReadAtByIdUseCaseService: MessageReadAtByIdUseCaseService, private SendLocalMessagesUseCaseService: SendLocalMessagesUseCaseService, - private MessageMarkAsReadUseCaseService: MessageMarkAsReadUseCaseService + private MessageMarkAsReadUseCaseService: MessageMarkAsReadUseCaseService, + private SocketConnectUseCaseService: SocketConnectUseCaseService ) { this.messageLiveSignalRDataSourceService.getMessageDelete() .pipe() @@ -123,8 +125,14 @@ export class ChatServiceService { } async start() { + await this.chatSync() + this.SocketConnectUseCaseService.execute(); + } + + + async chatSync() { await this.getRoomList(); - this.asyncAllRoomMessage(); + await this.asyncAllRoomMessage(); } removeMemberToRoom(data: UserRemoveListInputDTO) { diff --git a/src/app/module/chat/domain/use-case/listen-send-message.service.ts b/src/app/module/chat/domain/use-case/listen-send-message.service.ts index 8d4564411..b13d457db 100644 --- a/src/app/module/chat/domain/use-case/listen-send-message.service.ts +++ b/src/app/module/chat/domain/use-case/listen-send-message.service.ts @@ -14,10 +14,8 @@ export class ListenSendMessageUseCase { execute({roomId}: {roomId: string}) { - console.log('reciee message') return this.MessageSocketRepositoryService.listenToMessages().pipe( filter((message) => { - console.log(message, roomId) return message?.requestId?.startsWith(InstanceId) && message?.roomId == roomId }), map(message => message) diff --git a/src/app/module/chat/domain/use-case/socket-connect-use-case.service.ts b/src/app/module/chat/domain/use-case/socket-connect-use-case.service.ts new file mode 100644 index 000000000..cf0ece40e --- /dev/null +++ b/src/app/module/chat/domain/use-case/socket-connect-use-case.service.ts @@ -0,0 +1,18 @@ +import { Injectable } from '@angular/core'; +import { MessageSocketRepositoryService } from 'src/app/module/chat/data/repository/message/message-live-signalr-data-source.service'; + +@Injectable({ + providedIn: 'root' +}) +export class SocketConnectUseCaseService { + + constructor( + private MessageSocketRepositoryService: MessageSocketRepositoryService + ) { } + + execute() { + return this.MessageSocketRepositoryService.connect() + } + + +} diff --git a/src/app/module/chat/domain/use-case/sync-all-room-messages.service.ts b/src/app/module/chat/domain/use-case/sync-all-room-messages.service.ts index 5a1196086..f4b3ad8a1 100644 --- a/src/app/module/chat/domain/use-case/sync-all-room-messages.service.ts +++ b/src/app/module/chat/domain/use-case/sync-all-room-messages.service.ts @@ -8,6 +8,7 @@ import { ok } from 'neverthrow'; import { RoomLocalRepository } from '../../data/repository/room-local-repository.service'; import { SessionStore } from 'src/app/store/session.service'; import { Logger } from 'src/app/services/logger/main/service'; +import { XTracerAsync, TracingType } from 'src/app/services/monitoring/opentelemetry/tracer'; @Injectable({ providedIn: 'root' @@ -21,20 +22,27 @@ export class SyncAllRoomMessagesService { private roomLocalDataSourceService: RoomLocalRepository, ) { } - async execute() { + @XTracerAsync({name:'SyncAllRoomMessagesService', module:'chat', bugPrint: true}) + async execute(tracing?: TracingType) { const allRooms = await this.roomLocalDataSourceService.findAll() if(allRooms.isOk()) { if(allRooms.value.length == 0) { - console.log('no room to sync') + tracing.addEvent('no need to sync') } else { - console.log('sync '+ allRooms.value.length) + tracing.addEvent('total sync '+ allRooms.value.length) } + + let n =0 for(const room of allRooms.value) { + const result = await this.messageRemoteDataSourceService.getMessagesFromRoom(room.id) const localResult = await this.messageLocalDataSourceService.getItems(room.id) + tracing.addEvent('async n '+ n) + n++ + if(result.isOk()) { const { addedItems, changedItems, deletedItems } = messageListDetermineChanges(result.value.data, localResult) diff --git a/src/app/module/chat/infra/database/dexie/schema/members.ts b/src/app/module/chat/infra/database/dexie/schema/members.ts index aeb1dcade..5c9f4cb14 100644 --- a/src/app/module/chat/infra/database/dexie/schema/members.ts +++ b/src/app/module/chat/infra/database/dexie/schema/members.ts @@ -3,14 +3,14 @@ import { EntityTable } from 'Dexie'; export const MemberTableSchema = z.object({ $roomIdUserId: z.string().optional(), - id: z.string(), + id: z.string().optional(), // useless roomId: z.string(), wxUserId: z.number(), wxFullName: z.string(), wxeMail: z.string(), userPhoto: z.string().nullable(), joinAt: z.string(), - status: z.string(), + status: z.string().optional(), // useless isAdmin: z.boolean() }) diff --git a/src/app/module/chat/infra/socket/signal-r.service.ts b/src/app/module/chat/infra/socket/signal-r.service.ts index d85ae4824..d690f70f7 100644 --- a/src/app/module/chat/infra/socket/signal-r.service.ts +++ b/src/app/module/chat/infra/socket/signal-r.service.ts @@ -65,10 +65,10 @@ export class SignalRService { } } catch(error) {} - this.establishConnection() + // this.establishConnection() } - private async establishConnection() { + async establishConnection() { // const connection = new SignalRConnection({url:'https://41e3-41-63-166-54.ngrok-free.app/api/v2/chathub'}) const connection = new SignalRConnection({url:'https://gdapi-dev.dyndns.info/stage/api/v2/chathub'}) diff --git a/src/app/services/monitoring/opentelemetry/matrix.ts b/src/app/services/monitoring/opentelemetry/matrix.ts index 8be55bcc7..b8557d8bd 100644 --- a/src/app/services/monitoring/opentelemetry/matrix.ts +++ b/src/app/services/monitoring/opentelemetry/matrix.ts @@ -1,4 +1,4 @@ -import { metrics } from '@opentelemetry/api'; +import { Histogram, metrics } from '@opentelemetry/api'; import { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-http'; import { MeterProvider, PeriodicExportingMetricReader } from '@opentelemetry/sdk-metrics'; import { Subject } from 'rxjs'; @@ -46,3 +46,10 @@ export const RequestCounter = meter.createCounter('post_requests', { export const UseCaseCounter = meter.createCounter('use_case', { description: 'use case counter', }); + + +// Assuming `meter` is your initialized Meter instance +export const useCaseDurationHistogram: Histogram = meter.createHistogram('use_case_duration', { + description: 'Duration of use cases', + unit: 'milliseconds', +}); diff --git a/src/app/services/monitoring/opentelemetry/tracer.ts b/src/app/services/monitoring/opentelemetry/tracer.ts index 7421b6195..9baf4923b 100644 --- a/src/app/services/monitoring/opentelemetry/tracer.ts +++ b/src/app/services/monitoring/opentelemetry/tracer.ts @@ -5,7 +5,7 @@ import { OpentelemetryAgendaProvider, OpentelemetryChatProvider, OpentelemetryIn import { Device, DeviceInfo } from '@capacitor/device'; import { SessionStore } from 'src/app/store/session.service'; import { environment } from 'src/environments/environment'; -import { UseCaseCounter } from './matrix'; +import { UseCaseCounter, useCaseDurationHistogram } from './matrix'; import { openTelemetryLogging } from './logging'; import { SpanStatus, SpanStatusCode @@ -39,6 +39,9 @@ function convertAttributesToString(obj) { const createTracingInstance = ({bugPrint, name, module, autoFinish}): TracingType => { + + const startTime = Date.now(); + const requestId = uuidv4() let _tracerInstance:Tracer @@ -141,6 +144,9 @@ const createTracingInstance = ({bugPrint, name, module, autoFinish}): TracingTyp console.error(name, data) } + const duration = Date.now() - (startTime as unknown as number); + useCaseDurationHistogram.record(duration, { use_case: name }); + finish = true }, hasError:(message: string) => { @@ -165,6 +171,7 @@ export function XTracerAsync({ name, bugPrint, module = null, autoFinish = true, descriptor.value = async function (...args: unknown[]) { + const tracing = createTracingInstance({bugPrint, name, module, autoFinish}) tracing.setAttribute('User', SessionStore?.user?.FullName);