From 473fc38457ec906819eb3b28236aea6daca81bf1 Mon Sep 17 00:00:00 2001 From: boufni95 Date: Mon, 10 Mar 2025 22:28:57 +0000 Subject: [PATCH] serialize classes --- src/services/storage/serializationHelpers.ts | 87 ++++++++++++++++++++ src/services/storage/storageInterface.ts | 12 ++- src/services/storage/storageProcessor.ts | 8 +- 3 files changed, 103 insertions(+), 4 deletions(-) create mode 100644 src/services/storage/serializationHelpers.ts diff --git a/src/services/storage/serializationHelpers.ts b/src/services/storage/serializationHelpers.ts new file mode 100644 index 00000000..446d1878 --- /dev/null +++ b/src/services/storage/serializationHelpers.ts @@ -0,0 +1,87 @@ +import { FindOperator, LessThan, MoreThan, LessThanOrEqual, MoreThanOrEqual, Equal, Like, ILike, Between, In, Any, IsNull, Not, FindOptionsWhere } from 'typeorm'; +export type WhereCondition = FindOptionsWhere | FindOptionsWhere[] + +type SerializedFindOperator = { + _type: 'FindOperator' + type: string + value: any +} + +export function serializeFindOperator(operator: FindOperator): SerializedFindOperator { + return { + _type: 'FindOperator', + type: operator['type'], + value: operator['value'], + }; +} + +export function deserializeFindOperator(serialized: SerializedFindOperator): FindOperator { + switch (serialized.type) { + case 'lessThan': + return LessThan(serialized.value); + case 'moreThan': + return MoreThan(serialized.value); + case 'lessThanOrEqual': + return LessThanOrEqual(serialized.value); + case 'moreThanOrEqual': + return MoreThanOrEqual(serialized.value); + case 'equal': + return Equal(serialized.value); + case 'like': + return Like(serialized.value); + case 'ilike': + return ILike(serialized.value); + case 'between': + return Between(serialized.value[0], serialized.value[1]); + case 'in': + return In(serialized.value); + case 'any': + return Any(serialized.value); + case 'isNull': + return IsNull(); + case 'not': + return Not(deserializeFindOperator(serialized.value)); + default: + throw new Error(`Unknown FindOperator type: ${serialized.type}`); + } +} + +export function serializeRequest(r: object): T { + if (!r || typeof r !== 'object') { + return r; + } + + if (r instanceof FindOperator) { + return serializeFindOperator(r) as any; + } + + if (Array.isArray(r)) { + return r.map(item => serializeRequest(item)) as any; + } + + const result: any = {}; + for (const [key, value] of Object.entries(r)) { + result[key] = serializeRequest(value); + } + return result; +} + +export function deserializeRequest(r: object): T { + if (!r || typeof r !== 'object') { + return r; + } + + if (Array.isArray(r)) { + return r.map(item => deserializeRequest(item)) as any; + } + + if (r && typeof r === 'object' && (r as any)._type === 'FindOperator') { + return deserializeFindOperator(r as any) as any; + } + + const result: any = {}; + for (const [key, value] of Object.entries(r)) { + result[key] = deserializeRequest(value); + } + return result; +} \ No newline at end of file diff --git a/src/services/storage/storageInterface.ts b/src/services/storage/storageInterface.ts index 52177386..9a491c16 100644 --- a/src/services/storage/storageInterface.ts +++ b/src/services/storage/storageInterface.ts @@ -10,9 +10,9 @@ import { IncrementOperation, DecrementOperation, SumOperation, - WhereCondition } from './storageProcessor.js'; import { PickKeysByType } from 'typeorm/common/PickKeysByType.js'; +import { serializeRequest, WhereCondition } from './serializationHelpers.js'; export type TX = (txId: string) => Promise @@ -147,10 +147,18 @@ export class StorageInterface extends EventEmitter { resolve(response.data); } this.once(op.opId, responseHandler) - this.process.send(op) + this.process.send(this.serializeOperation(op)) }) } + private serializeOperation(operation: IStorageOperation): IStorageOperation { + const serialized = { ...operation }; + if ('q' in serialized) { + (serialized as any).q = serializeRequest((serialized as any).q); + } + return serialized; + } + private checkConnected() { if (!this.isConnected) { throw new Error('Storage processor is not connected'); diff --git a/src/services/storage/storageProcessor.ts b/src/services/storage/storageProcessor.ts index 7994ca6b..a6c68573 100644 --- a/src/services/storage/storageProcessor.ts +++ b/src/services/storage/storageProcessor.ts @@ -1,11 +1,12 @@ -import { DataSource, EntityManager, DeepPartial, FindOptionsWhere, FindOptionsOrder } from 'typeorm'; +import { DataSource, EntityManager, DeepPartial, FindOptionsWhere, FindOptionsOrder, FindOperator } from 'typeorm'; import NewDB, { DbSettings, MainDbEntities, MainDbNames, newMetricsDb } from './db.js'; import { PubLogger, getLogger } from '../helpers/logger.js'; import { allMetricsMigrations, allMigrations } from './migrations/runner.js'; import transactionsQueue from './transactionsQueue.js'; import { PickKeysByType } from 'typeorm/common/PickKeysByType'; +import { deserializeRequest, WhereCondition } from './serializationHelpers.js'; + -export type WhereCondition = FindOptionsWhere | FindOptionsWhere[] export type QueryOptions = { where?: WhereCondition order?: FindOptionsOrder @@ -154,6 +155,9 @@ class StorageProcessor { private async handleOperation(operation: StorageOperation) { try { const opId = operation.opId; + if ((operation as any).q) { + (operation as any).q = deserializeRequest((operation as any).q) + } switch (operation.type) { case 'connect': return this.handleConnect(operation);