From 2cd0ff596f9e845c0f42c4846c12f27fe2777edb Mon Sep 17 00:00:00 2001 From: Martin Karkowski Date: Tue, 1 Feb 2022 12:59:27 +0100 Subject: [PATCH] Using deepEqual in observables. --- contribute/VERSION | 2 +- .../InstanceManager/InstanceManager.ts | 4 ++-- lib/helpers/getSubject.ts | 3 --- lib/helpers/index.browser.ts | 3 +++ lib/helpers/objectMethods.ts | 16 +++++++++++++++- lib/module/BaseModule.ts | 4 ++-- lib/module/GenericWrapper.injectable.ts | 2 +- lib/module/GenericWrapper.ts | 2 +- lib/module/index.ts | 1 - lib/observables/nopeObservable.ts | 7 ++++--- lib/types/nope/nopeInstanceManager.interface.ts | 4 ++-- package.json | 2 +- 12 files changed, 32 insertions(+), 18 deletions(-) diff --git a/contribute/VERSION b/contribute/VERSION index c678b02..ace256e 100644 --- a/contribute/VERSION +++ b/contribute/VERSION @@ -1 +1 @@ -1.0.18 \ No newline at end of file +1.0.21 \ No newline at end of file diff --git a/lib/dispatcher/InstanceManager/InstanceManager.ts b/lib/dispatcher/InstanceManager/InstanceManager.ts index 96851ff..76bf7d3 100644 --- a/lib/dispatcher/InstanceManager/InstanceManager.ts +++ b/lib/dispatcher/InstanceManager/InstanceManager.ts @@ -31,12 +31,12 @@ import { INopeRpcManager, INopeStatusInfo, TValidAsssignmentChecker, - ValidSelectorFunction + ValidSelectorFunction, } from "../../types/nope"; import { INopeInstanceManager, TConstructorCallback, - TGenerateWrapperCallback + TGenerateWrapperCallback, } from "../../types/nope/nopeInstanceManager.interface"; import { NopeConnectivityManager } from "../ConnectivityManager"; import { NopeRpcManager } from "../RpcManager/NopeRpcManager"; diff --git a/lib/helpers/getSubject.ts b/lib/helpers/getSubject.ts index 0eea26f..b4daf9c 100644 --- a/lib/helpers/getSubject.ts +++ b/lib/helpers/getSubject.ts @@ -1,9 +1,6 @@ /** * @author Martin Karkowski * @email m.karkowski@zema.de - * @create date 2021-11-13 14:13:06 - * @modify date 2021-11-13 14:13:06 - * @desc [description] */ import { BehaviorSubject, ReplaySubject, Subject } from "rxjs"; diff --git a/lib/helpers/index.browser.ts b/lib/helpers/index.browser.ts index b9ae6f5..a1d6ee4 100644 --- a/lib/helpers/index.browser.ts +++ b/lib/helpers/index.browser.ts @@ -5,6 +5,7 @@ import * as arrays from "./arrayMethods"; import * as async from "./async"; +import * as subject from "./getSubject"; import * as ids from "./idMethods"; import * as json from "./jsonMethods"; import * as schema from "./jsonSchemaMethods"; @@ -18,6 +19,7 @@ import * as strings from "./stringMethods"; export * from "./arrayMethods"; export * from "./async"; +export * from "./getSubject"; export * from "./idMethods"; export * from "./jsonMethods"; export * from "./jsonSchemaMethods"; @@ -41,4 +43,5 @@ export { strings, pathes, runtime, + subject, }; diff --git a/lib/helpers/objectMethods.ts b/lib/helpers/objectMethods.ts index e7139b0..fad0e6d 100644 --- a/lib/helpers/objectMethods.ts +++ b/lib/helpers/objectMethods.ts @@ -7,6 +7,7 @@ */ export const SPLITCHAR = "/"; +import { deepEqual as _deepEqual } from "assert"; const _sentinel = new Object(); @@ -510,7 +511,20 @@ export function deepClone(obj: T): T { } } -// export const deepEqual: (a: any, b: any) => boolean = require('deep-equal'); +/** + * Compares deep a and b (using assert) + * @param a Object A + * @param b Object B + * @returns The Result + */ +export function deepEqual(a: T, b: T): boolean { + try { + _deepEqual(a, b); + return true; + } catch (e) { + return false; + } +} /** * Function to adapt the Object and only return a specific amount of elements. diff --git a/lib/module/BaseModule.ts b/lib/module/BaseModule.ts index 3c485bd..71d3cef 100644 --- a/lib/module/BaseModule.ts +++ b/lib/module/BaseModule.ts @@ -10,7 +10,7 @@ import { getPropertyPath, isEmitterPathCorrect, isMethodPathCorrect, - isPropertyPathCorrect + isPropertyPathCorrect, } from "../helpers/dispatcherPathes"; import { deepClone } from "../helpers/objectMethods"; import { getNopeLogger } from "../logger/getLogger"; @@ -21,7 +21,7 @@ import { IFunctionOptions, INopeModule, INopeModuleDescription, - IVersion + IVersion, } from "../types/nope/nopeModule.interface"; import { INopeObservable } from "../types/nope/nopeObservable.interface"; diff --git a/lib/module/GenericWrapper.injectable.ts b/lib/module/GenericWrapper.injectable.ts index 799d5ec..f131bb9 100644 --- a/lib/module/GenericWrapper.injectable.ts +++ b/lib/module/GenericWrapper.injectable.ts @@ -7,7 +7,7 @@ import { inject, injectable } from "inversify"; import { INopeCore } from "../index.browser"; import { DISPATCHER_INSTANCE, - OBSERVABLE_FACTORY + OBSERVABLE_FACTORY, } from "../symbols/identifiers"; import { INopeObservable } from "../types/nope/nopeObservable.interface"; import { NopeGenericWrapper } from "./GenericWrapper"; diff --git a/lib/module/GenericWrapper.ts b/lib/module/GenericWrapper.ts index 5e0af44..2547acf 100644 --- a/lib/module/GenericWrapper.ts +++ b/lib/module/GenericWrapper.ts @@ -11,7 +11,7 @@ import { INopeDispatcher } from "../types/nope/nopeDispatcher.interface"; import { IEventOptions, IFunctionOptions, - INopeModuleDescription + INopeModuleDescription, } from "../types/nope/nopeModule.interface"; import { INopeObservable } from "../types/nope/nopeObservable.interface"; import { INopePromise } from "../types/nope/nopePromise.interface"; diff --git a/lib/module/index.ts b/lib/module/index.ts index 1cc731d..388d503 100644 --- a/lib/module/index.ts +++ b/lib/module/index.ts @@ -8,4 +8,3 @@ export { NopeBaseModule } from "./BaseModule"; export { InjectableNopeBaseModule } from "./BaseModule.injectable"; export { NopeGenericWrapper } from "./GenericWrapper"; export { InjectableNopeGenericWrapper } from "./GenericWrapper.injectable"; - diff --git a/lib/observables/nopeObservable.ts b/lib/observables/nopeObservable.ts index a5a0665..06a0386 100644 --- a/lib/observables/nopeObservable.ts +++ b/lib/observables/nopeObservable.ts @@ -7,6 +7,7 @@ import { BehaviorSubject } from "rxjs"; import { NopeEventEmitter } from "../eventEmitter/nopeEventEmitter"; import { TSubjectOptions } from "../helpers/getSubject"; import { generateId } from "../helpers/idMethods"; +import { deepEqual } from "../helpers/objectMethods"; import { getNopeLogger } from "../logger/getLogger"; import { IEventAdditionalData, @@ -15,7 +16,7 @@ import { INopeObserver, INopePartialObserver, INopeSubscriptionOptions, - IObservableType + IObservableType, } from "../types/nope/index"; const logger = getNopeLogger("obervable"); @@ -79,10 +80,10 @@ export class NopeObservable< const valueToPublish = this.getContent(); - /** Publish the Data */ + // Publish the Data, but only if they are different (deeply) if ( !this.disablePublishing && - (options.forced || this._emitter.value?.value !== valueToPublish) + (options.forced || !deepEqual(this._emitter.value?.value, valueToPublish)) ) { return this._publish(valueToPublish, options); } diff --git a/lib/types/nope/nopeInstanceManager.interface.ts b/lib/types/nope/nopeInstanceManager.interface.ts index 524ccff..72f4c0f 100644 --- a/lib/types/nope/nopeInstanceManager.interface.ts +++ b/lib/types/nope/nopeInstanceManager.interface.ts @@ -9,13 +9,13 @@ import { INopeCore, INopeModule } from "."; import { IAvailableInstancesMsg, - IInstanceCreationMsg + IInstanceCreationMsg, } from "./nopeCommunication.interface"; import { INopeStatusInfo } from "./nopeConnectivityManager.interface"; import { IMapBasedMergeData } from "./nopeHelpers.interface"; import { IGenericNopeModule, - INopeModuleDescription + INopeModuleDescription, } from "./nopeModule.interface"; import { INopeObservable } from "./nopeObservable.interface"; import { ValidSelectorFunction } from "./nopeRpcManager.interface"; diff --git a/package.json b/package.json index 57261cc..b6d865b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "nope", - "version": "1.0.18", + "version": "1.0.21", "description": "NoPE Runtime for Nodejs. For Browser-Support please use nope-browser", "files": [ "dist-nodejs/**/*",