From 21dcfa0a96ce9c425b7e58bb0dcc35e8127d8c1c Mon Sep 17 00:00:00 2001 From: Carlos Amaro Date: Thu, 16 Jan 2025 18:27:55 +0000 Subject: [PATCH] fix(satp-hermes): when a db is not provided it will create a repository, remote db is not required anymore Signed-off-by: Carlos Amaro --- package.json | 6 +- .../gateway-config.json | 22 ++++++- .../src/main/typescript/blo/dispatcher.ts | 8 ++- .../core/crash-management/server-service.ts | 5 ++ .../src/main/typescript/core/session-utils.ts | 8 ++- .../src/main/typescript/gol/crash-manager.ts | 8 ++- .../src/main/typescript/gol/satp-manager.ts | 8 ++- .../src/main/typescript/logging.ts | 62 +++++++++++-------- .../typescript/plugin-satp-hermes-gateway.ts | 34 ++++++---- .../repository/interfaces/repository.ts | 2 + .../repository/knex-local-log-repository.ts | 12 ++++ .../integration/gateway-init-startup.test.ts | 5 +- .../SATPGatewayRunner-instantiation.test.ts | 5 +- .../src/test/typescript/unit/services.test.ts | 3 +- yarn.lock | 48 +++++++++++++- 15 files changed, 180 insertions(+), 56 deletions(-) diff --git a/package.json b/package.json index f91eb166bc..b4a9b4a4d3 100644 --- a/package.json +++ b/package.json @@ -335,5 +335,9 @@ "built": false } }, - "packageManager": "yarn@4.3.1" + "packageManager": "yarn@4.3.1", + "dependencies": { + "deasync": "^0.1.30", + "deasync-promise": "^1.0.1" + } } diff --git a/packages/cactus-plugin-satp-hermes/gateway-config.json b/packages/cactus-plugin-satp-hermes/gateway-config.json index 4406dc5289..1ffbe06635 100644 --- a/packages/cactus-plugin-satp-hermes/gateway-config.json +++ b/packages/cactus-plugin-satp-hermes/gateway-config.json @@ -23,5 +23,25 @@ "logLevel": "DEBUG", "counterPartyGateways": [], "environment": "development", - "enableOpenAPI": true + "enableOpenAPI": true, + "knexLocalConfig": { + "client": "sqlite3", + "connection": { + "filename": "${knex_dir}/.dev.client-123e4567-e89b-12d3-a456-426614174000.sqlite3" + }, + "migrations": { + "directory": "./packages/cactus-plugin-satp-hermes/src/knex/migrations" + }, + "useNullAsDefault": true + }, + "knexRemoteConfig": { + "client": "sqlite3", + "connection": { + "filename": "./packages/cactus-plugin-satp-hermes/src/knex/.dev.server-123e4567-e89b-12d3-a456-426614174000.sqlite3" + }, + "migrations": { + "directory": "./packages/cactus-plugin-satp-hermes/src/knex/migrations" + }, + "useNullAsDefault": true + } } diff --git a/packages/cactus-plugin-satp-hermes/src/main/typescript/blo/dispatcher.ts b/packages/cactus-plugin-satp-hermes/src/main/typescript/blo/dispatcher.ts index 9526c0408e..be31bcd10b 100644 --- a/packages/cactus-plugin-satp-hermes/src/main/typescript/blo/dispatcher.ts +++ b/packages/cactus-plugin-satp-hermes/src/main/typescript/blo/dispatcher.ts @@ -45,8 +45,9 @@ export interface BLODispatcherOptions { signer: JsObjectSigner; bridgesManager: SATPBridgesManager; pubKey: string; + defaultRepository: boolean; localRepository: ILocalLogRepository; - remoteRepository: IRemoteLogRepository; + remoteRepository?: IRemoteLogRepository; } export class BLODispatcher { @@ -60,8 +61,9 @@ export class BLODispatcher { private manager: SATPManager; private orchestrator: GatewayOrchestrator; private bridgeManager: SATPBridgesManager; + private defaultRepository: boolean; private localRepository: ILocalLogRepository; - private remoteRepository: IRemoteLogRepository; + private remoteRepository: IRemoteLogRepository | undefined; constructor(public readonly options: BLODispatcherOptions) { const fnTag = `${BLODispatcher.CLASS_NAME}#constructor()`; @@ -78,6 +80,7 @@ export class BLODispatcher { this.orchestrator = options.orchestrator; const signer = options.signer; const ourGateway = this.orchestrator.ourGateway; + this.defaultRepository = options.defaultRepository; this.localRepository = options.localRepository; this.remoteRepository = options.remoteRepository; @@ -91,6 +94,7 @@ export class BLODispatcher { bridgeManager: this.bridgeManager, orchestrator: this.orchestrator, pubKey: options.pubKey, + defaultRepository: this.defaultRepository, localRepository: this.localRepository, remoteRepository: this.remoteRepository, }; diff --git a/packages/cactus-plugin-satp-hermes/src/main/typescript/core/crash-management/server-service.ts b/packages/cactus-plugin-satp-hermes/src/main/typescript/core/crash-management/server-service.ts index dc491caa1d..52db952143 100644 --- a/packages/cactus-plugin-satp-hermes/src/main/typescript/core/crash-management/server-service.ts +++ b/packages/cactus-plugin-satp-hermes/src/main/typescript/core/crash-management/server-service.ts @@ -23,6 +23,7 @@ import { Type } from "../../generated/proto/cacti/satp/v02/common/session_pb"; export class CrashRecoveryServerService { constructor( private readonly bridgesManager: SATPBridgesManager, + private readonly defaultRepository: boolean, private readonly logRepository: ILocalLogRepository, private readonly sessions: Map, private readonly signer: JsObjectSigner, @@ -56,6 +57,10 @@ export class CrashRecoveryServerService { throw new SignatureVerificationError(fnTag); } + if (this.defaultRepository && !this.logRepository.getCreated()) { + this.logRepository.createKnex(); + } + const recoveredLogs = await this.logRepository.fetchLogsFromSequence( req.sessionId, req.sequenceNumber, diff --git a/packages/cactus-plugin-satp-hermes/src/main/typescript/core/session-utils.ts b/packages/cactus-plugin-satp-hermes/src/main/typescript/core/session-utils.ts index 7b341fa767..ce5264ad69 100644 --- a/packages/cactus-plugin-satp-hermes/src/main/typescript/core/session-utils.ts +++ b/packages/cactus-plugin-satp-hermes/src/main/typescript/core/session-utils.ts @@ -2,6 +2,7 @@ import { create, isMessage } from "@bufbuild/protobuf"; import { AssetSchema, CredentialProfile, + Error as SATPError, LockType, MessageType, SignatureAlgorithm, @@ -703,7 +704,12 @@ export function setError( } sessionData.state = State.ERROR; - sessionData.errorCode = error.getSATPErrorType(); + + try { + sessionData.errorCode = error.getSATPErrorType(); + } catch (e) { + sessionData.errorCode = SATPError.UNSPECIFIED; + } sessionData.phaseError = stageMessage; } diff --git a/packages/cactus-plugin-satp-hermes/src/main/typescript/gol/crash-manager.ts b/packages/cactus-plugin-satp-hermes/src/main/typescript/gol/crash-manager.ts index 4be91833f2..ed205cb201 100644 --- a/packages/cactus-plugin-satp-hermes/src/main/typescript/gol/crash-manager.ts +++ b/packages/cactus-plugin-satp-hermes/src/main/typescript/gol/crash-manager.ts @@ -39,8 +39,9 @@ import { verifySignature } from "../gateway-utils"; export interface ICrashRecoveryManagerOptions { logLevel?: LogLevelDesc; + defaultRepository: boolean; localRepository: ILocalLogRepository; - remoteRepository: IRemoteLogRepository; + remoteRepository?: IRemoteLogRepository; instanceId: string; bridgeConfig: SATPBridgesManager; orchestrator: GatewayOrchestrator; @@ -55,8 +56,9 @@ export class CrashManager { public sessions: Map; private crashRecoveryHandler: CrashRecoveryHandler; private factory: RollbackStrategyFactory; + private defaultRepository: boolean; public localRepository: ILocalLogRepository; - public remoteRepository: IRemoteLogRepository; + public remoteRepository: IRemoteLogRepository | undefined; private crashScheduler?: Job; private isSchedulerPaused = false; private crashRecoveryServerService: CrashRecoveryServerService; @@ -76,6 +78,7 @@ export class CrashManager { this.log.info(`Instantiated ${this.className} OK`); this.instanceId = options.instanceId; this.sessions = new Map(); + this.defaultRepository = options.defaultRepository; this.localRepository = options.localRepository; this.remoteRepository = options.remoteRepository; this.signer = options.signer; @@ -87,6 +90,7 @@ export class CrashManager { this.crashRecoveryServerService = new CrashRecoveryServerService( this.bridgesManager, + this.defaultRepository, this.localRepository, this.sessions, this.signer, diff --git a/packages/cactus-plugin-satp-hermes/src/main/typescript/gol/satp-manager.ts b/packages/cactus-plugin-satp-hermes/src/main/typescript/gol/satp-manager.ts index eda6545092..a3b469cb3a 100644 --- a/packages/cactus-plugin-satp-hermes/src/main/typescript/gol/satp-manager.ts +++ b/packages/cactus-plugin-satp-hermes/src/main/typescript/gol/satp-manager.ts @@ -92,8 +92,9 @@ export interface ISATPManagerOptions { supportedDLTs: SupportedChain[]; bridgeManager: SATPBridgesManager; orchestrator: GatewayOrchestrator; + defaultRepository: boolean; localRepository: ILocalLogRepository; - remoteRepository: IRemoteLogRepository; + remoteRepository?: IRemoteLogRepository; } export class SATPManager { @@ -118,8 +119,9 @@ export class SATPManager { private readonly orchestrator: GatewayOrchestrator; private gatewaysPubKeys: Map = new Map(); + private defaultRepository: boolean; private localRepository: ILocalLogRepository; - private remoteRepository: IRemoteLogRepository; + private remoteRepository: IRemoteLogRepository | undefined; private readonly dbLogger: SATPLogger; constructor(public readonly options: ISATPManagerOptions) { @@ -138,6 +140,7 @@ export class SATPManager { this.orchestrator = options.orchestrator; this._pubKey = options.pubKey; this.loadPubKeys(this.orchestrator.getCounterPartyGateways()); + this.defaultRepository = options.defaultRepository; this.localRepository = options.localRepository; this.remoteRepository = options.remoteRepository; @@ -150,6 +153,7 @@ export class SATPManager { ]; const satpLoggerConfig: ISATPLoggerConfig = { + defaultRepository: this.defaultRepository, localRepository: this.localRepository, remoteRepository: this.remoteRepository, signer: this.signer, diff --git a/packages/cactus-plugin-satp-hermes/src/main/typescript/logging.ts b/packages/cactus-plugin-satp-hermes/src/main/typescript/logging.ts index d7dcf6f65e..3b21dae76d 100644 --- a/packages/cactus-plugin-satp-hermes/src/main/typescript/logging.ts +++ b/packages/cactus-plugin-satp-hermes/src/main/typescript/logging.ts @@ -22,20 +22,23 @@ interface SATPLogEntry { } export interface ISATPLoggerConfig { + defaultRepository: boolean; localRepository: ILocalLogRepository; - remoteRepository: IRemoteLogRepository; + remoteRepository?: IRemoteLogRepository; signer: JsObjectSigner; pubKey: string; } export class SATPLogger { + private defaultRepository: boolean = true; public localRepository: ILocalLogRepository; - public remoteRepository: IRemoteLogRepository; + public remoteRepository: IRemoteLogRepository | undefined; private signer: JsObjectSigner; private pubKey: string; private readonly log: Logger; constructor(config: ISATPLoggerConfig) { + this.defaultRepository = config.defaultRepository; this.localRepository = config.localRepository; this.remoteRepository = config.remoteRepository; this.signer = config.signer; @@ -136,38 +139,47 @@ export class SATPLogger { const fnTag = `SATPLogger#storeInDatabase()`; this.log.info(`${fnTag} - Storing log entry with key: ${localLog.key}`); + if (this.defaultRepository && !this.localRepository.getCreated()) { + this.log.debug( + `${fnTag} - Default configuration detected. Creating local repository.`, + ); + await this.localRepository.createKnex(); + } + await this.localRepository.create(localLog); } private async storeRemoteLog(key: string, hash: string): Promise { const fnTag = `SATPLogger#storeRemoteLog()`; - this.log.info( - `${fnTag} - Storing remote log with key: ${key} and hash: ${hash}`, - ); + if (!!this.remoteRepository) { + this.log.info( + `${fnTag} - Storing remote log with key: ${key} and hash: ${hash}`, + ); - const remoteLog: RemoteLog = { - key: key, - hash: hash, - signature: "", - signerPubKey: this.pubKey, - }; + const remoteLog: RemoteLog = { + key: key, + hash: hash, + signature: "", + signerPubKey: this.pubKey, + }; - remoteLog.signature = bufArray2HexStr( - sign(this.signer, safeStableStringify(remoteLog)), - ); + remoteLog.signature = bufArray2HexStr( + sign(this.signer, safeStableStringify(remoteLog)), + ); - this.log.debug(`${fnTag} - Generated signature: ${remoteLog.signature}`); - const response = await this.remoteRepository.create(remoteLog); + this.log.debug(`${fnTag} - Generated signature: ${remoteLog.signature}`); + const response = await this.remoteRepository.create(remoteLog); - if (response.status < 200 || response.status > 299) { - this.log.error( - `${fnTag} - Failed to store remote log. Response status: ${response.status}`, - ); - throw new Error( - `${fnTag} - Got response ${response.status} when logging to remote`, - ); - } + if (response.status < 200 || response.status > 299) { + this.log.error( + `${fnTag} - Failed to store remote log. Response status: ${response.status}`, + ); + throw new Error( + `${fnTag} - Got response ${response.status} when logging to remote`, + ); + } - this.log.info(`${fnTag} - Successfully stored remote log.`); + this.log.info(`${fnTag} - Successfully stored remote log.`); + } } } diff --git a/packages/cactus-plugin-satp-hermes/src/main/typescript/plugin-satp-hermes-gateway.ts b/packages/cactus-plugin-satp-hermes/src/main/typescript/plugin-satp-hermes-gateway.ts index 750937d53a..401ac1eacf 100644 --- a/packages/cactus-plugin-satp-hermes/src/main/typescript/plugin-satp-hermes-gateway.ts +++ b/packages/cactus-plugin-satp-hermes/src/main/typescript/plugin-satp-hermes-gateway.ts @@ -65,7 +65,6 @@ import cors from "cors"; import * as OAS from "../json/openapi-blo-bundled.json"; import { knexLocalInstance } from "../../knex/knexfile"; -import { knexRemoteInstance } from "../../knex/knexfile-remote"; export class SATPGateway implements IPluginWebService, ICactusPlugin { // todo more checks; example port from config is between 3000 and 9000 @@ -100,6 +99,8 @@ export class SATPGateway implements IPluginWebService, ICactusPlugin { private signer: JsObjectSigner; private _pubKey: string; + // Flag to create a db repository when not given + public defaultRepository: boolean = true; public localRepository?: ILocalLogRepository; public remoteRepository?: IRemoteLogRepository; private readonly shutdownHooks: ShutdownHook[]; @@ -117,10 +118,23 @@ export class SATPGateway implements IPluginWebService, ICactusPlugin { }; this.logger = LoggerProvider.getOrCreate(logOptions); this.logger.info("Initializing Gateway Coordinator"); - this.localRepository = new LocalLogRepository(this.config.knexLocalConfig); - this.remoteRepository = new RemoteLogRepository( - this.config.knexRemoteConfig, - ); + + if (this.config.knexLocalConfig) { + this.defaultRepository = false; + this.localRepository = new LocalLogRepository( + this.config.knexLocalConfig, + ); + } else { + this.localRepository = new LocalLogRepository(knexLocalInstance.default); + } + + if (this.config.knexRemoteConfig) { + this.remoteRepository = new RemoteLogRepository( + this.config.knexRemoteConfig, + ); + } else { + this.logger.warn("Remote repository is not defined"); + } if (this.config.keyPair == undefined) { throw new Error("Key pair is undefined"); @@ -176,6 +190,7 @@ export class SATPGateway implements IPluginWebService, ICactusPlugin { signer: this.signer, bridgesManager: this.bridgesManager, pubKey: this.pubKey, + defaultRepository: this.defaultRepository, localRepository: this.localRepository, remoteRepository: this.remoteRepository, }; @@ -197,6 +212,7 @@ export class SATPGateway implements IPluginWebService, ICactusPlugin { logLevel: this.config.logLevel, bridgeConfig: this.bridgesManager, orchestrator: this.gatewayOrchestrator, + defaultRepository: this.defaultRepository, localRepository: this.localRepository, remoteRepository: this.remoteRepository, signer: this.signer, @@ -408,14 +424,6 @@ export class SATPGateway implements IPluginWebService, ICactusPlugin { pluginOptions.bridgesConfig = []; } - if (!pluginOptions.knexLocalConfig) { - pluginOptions.knexLocalConfig = knexLocalInstance.default; - } - - if (!pluginOptions.knexRemoteConfig) { - pluginOptions.knexRemoteConfig = knexRemoteInstance.default; - } - if (!pluginOptions.enableCrashManager) { pluginOptions.enableCrashManager = false; } diff --git a/packages/cactus-plugin-satp-hermes/src/main/typescript/repository/interfaces/repository.ts b/packages/cactus-plugin-satp-hermes/src/main/typescript/repository/interfaces/repository.ts index 5a723f5cc7..2162ba5c78 100644 --- a/packages/cactus-plugin-satp-hermes/src/main/typescript/repository/interfaces/repository.ts +++ b/packages/cactus-plugin-satp-hermes/src/main/typescript/repository/interfaces/repository.ts @@ -21,6 +21,8 @@ export interface ILocalLogRepository extends IRepository { ): Promise; destroy(): any; reset(): any; + createKnex(): any; + getCreated(): boolean; } export interface IRemoteLogRepository extends IRepository { diff --git a/packages/cactus-plugin-satp-hermes/src/main/typescript/repository/knex-local-log-repository.ts b/packages/cactus-plugin-satp-hermes/src/main/typescript/repository/knex-local-log-repository.ts index 62b6e27db3..3314a4594e 100644 --- a/packages/cactus-plugin-satp-hermes/src/main/typescript/repository/knex-local-log-repository.ts +++ b/packages/cactus-plugin-satp-hermes/src/main/typescript/repository/knex-local-log-repository.ts @@ -6,6 +6,7 @@ import knexFile from "../knex/knexfile"; export class KnexLocalLogRepository implements ILocalLogRepository { readonly database: Knex; + private created: boolean = false; public constructor(config: Knex.Config | undefined) { const envName = process.env.ENVIRONMENT || "development"; @@ -13,6 +14,10 @@ export class KnexLocalLogRepository implements ILocalLogRepository { this.database = knex(config || configFile); } + public getCreated(): boolean { + return this.created; + } + getLogsTable(): Knex.QueryBuilder { return this.database("logs"); } @@ -62,6 +67,13 @@ export class KnexLocalLogRepository implements ILocalLogRepository { .andWhere("sequenceNumber", ">", sequenceNumber); } + async createKnex() { + if (!this.created) { + await this.database.migrate.latest(); + this.created = true; + } + } + async reset() { await this.database.migrate.rollback(); await this.database.migrate.latest(); diff --git a/packages/cactus-plugin-satp-hermes/src/test/typescript/integration/gateway-init-startup.test.ts b/packages/cactus-plugin-satp-hermes/src/test/typescript/integration/gateway-init-startup.test.ts index 38ce10aae1..f4144ae786 100644 --- a/packages/cactus-plugin-satp-hermes/src/test/typescript/integration/gateway-init-startup.test.ts +++ b/packages/cactus-plugin-satp-hermes/src/test/typescript/integration/gateway-init-startup.test.ts @@ -69,10 +69,7 @@ beforeAll(async () => { describe("SATPGateway initialization", () => { it("should initiate gateway with default config", async () => { - const options: SATPGatewayConfig = { - knexLocalConfig: knexClientConnection, - knexRemoteConfig: knexSourceRemoteConnection, - }; + const options: SATPGatewayConfig = {}; const gateway = await factory.create(options); expect(gateway).toBeInstanceOf(SATPGateway); diff --git a/packages/cactus-plugin-satp-hermes/src/test/typescript/unit/SATPGatewayRunner-instantiation.test.ts b/packages/cactus-plugin-satp-hermes/src/test/typescript/unit/SATPGatewayRunner-instantiation.test.ts index 7d88a46375..2e346abb66 100644 --- a/packages/cactus-plugin-satp-hermes/src/test/typescript/unit/SATPGatewayRunner-instantiation.test.ts +++ b/packages/cactus-plugin-satp-hermes/src/test/typescript/unit/SATPGatewayRunner-instantiation.test.ts @@ -11,10 +11,9 @@ import { DEFAULT_PORT_GATEWAY_SERVER, } from "../../../main/typescript/core/constants"; -const testCase = "Instantiate SATP Gateway Runner"; const logLevel: LogLevelDesc = "TRACE"; -describe(testCase, () => { +describe("Instantiate SATP Gateway Runner", () => { let gatewayRunner: SATPGatewayRunner; const gatewayRunnerOptions: ISATPGatewayRunnerConstructorOptions = { @@ -38,7 +37,7 @@ describe(testCase, () => { await pruneDockerAllIfGithubAction({ logLevel }); }); - test(testCase, async () => { + test("Instantiate SATP Gateway Runner", async () => { gatewayRunner = new SATPGatewayRunner(gatewayRunnerOptions); await gatewayRunner.start(); diff --git a/packages/cactus-plugin-satp-hermes/src/test/typescript/unit/services.test.ts b/packages/cactus-plugin-satp-hermes/src/test/typescript/unit/services.test.ts index d613e10295..568bb81e1b 100644 --- a/packages/cactus-plugin-satp-hermes/src/test/typescript/unit/services.test.ts +++ b/packages/cactus-plugin-satp-hermes/src/test/typescript/unit/services.test.ts @@ -158,6 +158,7 @@ beforeAll(async () => { localRepository = new LocalLogRepository(knexClientConnection); remoteRepository = new RemoteLogRepository(knexSourceRemoteConnection); dbLogger = new SATPLogger({ + defaultRepository: false, localRepository, remoteRepository, signer, @@ -230,7 +231,7 @@ afterAll(async () => { for (const service of services) { await service.dbLogger.localRepository.destroy(); - await service.dbLogger.remoteRepository.destroy(); + await service.dbLogger.remoteRepository!.destroy(); } if (knexInstanceClient) { diff --git a/yarn.lock b/yarn.lock index 0cc4f97c28..2f961c4f79 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9707,6 +9707,8 @@ __metadata: "@redocly/openapi-core": "npm:1.15.0" "@types/adm-zip": "npm:0.5.0" "@types/benchmark": "npm:2.1.5" + "@types/deasync": "npm:^0" + "@types/deasync-promise": "npm:^1" "@types/debug": "npm:4.1.12" "@types/fs-extra": "npm:11.0.4" "@types/jest": "npm:29.5.3" @@ -9726,6 +9728,8 @@ __metadata: cross-env: "npm:7.0.3" crypto-browserify: "npm:3.12.0" cspell: "npm:8.10.4" + deasync: "npm:^0.1.30" + deasync-promise: "npm:^1.0.1" debug: "npm:4.3.5" del: "npm:7.1.0" del-cli: "npm:5.1.0" @@ -15394,6 +15398,20 @@ __metadata: languageName: node linkType: hard +"@types/deasync-promise@npm:^1": + version: 1.0.2 + resolution: "@types/deasync-promise@npm:1.0.2" + checksum: 10/976453a85053d9e7918b3b3d6a1e70890a15dd16ecfe53b35dd12f76a8f42513955e936e02784707bf47bfdd3d6903a1da68b4099d39f0f0d1baee58d03232d6 + languageName: node + linkType: hard + +"@types/deasync@npm:^0": + version: 0.1.5 + resolution: "@types/deasync@npm:0.1.5" + checksum: 10/5a8fec89572abc6fbcce7b4f5b5357ba58b2d6d6860b640eb452eb9e87a8d44f787a40450e456b6e2d7fa12cf52bac2ab0d2f9be431dd51bd40584e316ffaa2c + languageName: node + linkType: hard + "@types/debug@npm:4.1.12, @types/debug@npm:^4.1.7": version: 4.1.12 resolution: "@types/debug@npm:4.1.12" @@ -19911,7 +19929,7 @@ __metadata: languageName: node linkType: hard -"bindings@npm:^1.3.1": +"bindings@npm:^1.3.1, bindings@npm:^1.5.0": version: 1.5.0 resolution: "bindings@npm:1.5.0" dependencies: @@ -23761,6 +23779,25 @@ __metadata: languageName: node linkType: hard +"deasync-promise@npm:^1.0.1": + version: 1.0.1 + resolution: "deasync-promise@npm:1.0.1" + dependencies: + deasync: "npm:^0.1.7" + checksum: 10/e2c29c5a4974e7090725ce3e11a02dd9f0143e8743ad2190ba38f4c84be3d9c8cb4eca26dfc0b4b8b3fe9edda4a16c8c308cea92138213ef59f6923816633590 + languageName: node + linkType: hard + +"deasync@npm:^0.1.30, deasync@npm:^0.1.7": + version: 0.1.30 + resolution: "deasync@npm:0.1.30" + dependencies: + bindings: "npm:^1.5.0" + node-addon-api: "npm:^1.7.1" + checksum: 10/5cb55096b89181c7305284a3eed5df3eb7a47563bb17f85ca7c22df185fb8837ea19a463dafd127dd912fdad9edbb068a1ae3d48d890ba2cfdc80d3fb654a11f + languageName: node + linkType: hard + "debounce-fn@npm:^4.0.0": version: 4.0.0 resolution: "debounce-fn@npm:4.0.0" @@ -38672,6 +38709,15 @@ __metadata: languageName: node linkType: hard +"node-addon-api@npm:^1.7.1": + version: 1.7.2 + resolution: "node-addon-api@npm:1.7.2" + dependencies: + node-gyp: "npm:latest" + checksum: 10/6bf8217a8cd8148f4bbfd319b46d33587e9fb2e63e3c856ded67a76715167f7a6b17e1d9b8bbf3b8508befeb6a4adb10d92b8998ed5c19ca8448343f4cea11d6 + languageName: node + linkType: hard + "node-addon-api@npm:^2.0.0": version: 2.0.2 resolution: "node-addon-api@npm:2.0.2"