/** * @author Martin Karkowski * @email m.karkowski@zema.de * @create date 2018-05-22 01:13:13 * @modify date 2020-09-01 17:04:38 * @desc [description] */ /** Clear the Screen */ declare const process: any; import { inject, injectable } from 'inversify'; import { Builder } from '../../mod-Assembly-Builder/src/Container-Builder.FileLoader'; import * as PUBSUB from '../assembly/manual-assembly'; /** Trigger Loading the Modules */ Builder.load(); Builder.on('loaded', () => { /** Define a Class containing an observable @see attribute_01 */ @injectable() class TestClass implements PUBSUB.ContainsSharedObservables { path: string = ''; observables: Map>; shareConfig: { [id: string]: PUBSUB.ShareConfig }; initObservables(): void { /** Set a Value */ this.attribute_01.value = 0; } /** * Defining the Attribute as observable * * @type {PUBSUB.Observable} * @memberof TestClass */ @inject(PUBSUB.TYPES.Observable) public attribute_01: PUBSUB.Observable; /** * Creates an instance of TestClass. * @memberof TestClass */ constructor() { /** Set a Values - That must be done during the construction */ this.observables = new Map>(); this.shareConfig = {}; this.shareConfig.attribute_01 = { useAutoPathForPublishing: true, useAutoPathForSubscribing: true, }; } } /** Create a Definition for the Builder */ const _definition = [{ selector: 'Test', type: TestClass }]; /** Add the Definition to the Builder */ Builder.instance.addElements(_definition); /** Generate an Object of the Test-Class */ const _test = Builder.instance.container.get("Test"); let _counter = 0; /** Subscribe tot the attribute */ _test.attribute_01.subscribe((_num, _sender, _topic) => { console.log('Calling Subscription of', _topic, ' the ' + _counter + '\'th time. Value changed to:', _num); _counter++; }, 'sync'); _test.path = 'test'; /** Set the value to trigger the execution of the Subscription */ console.log('Changing Value to 1337'); _test.attribute_01.value = 1337; console.log('Adding Setter'); /** Define a specialized Setter */ _test.attribute_01.setter = (value) => { console.log('In Setter of the attribute_01'); /** The value should be limeted to Min 0 or Max 100 */ if (value > 100) { return 100; } if (value < 0) { return 0; } return value; } /** Setting the Attribute to change the Value and trigger the setter and subscription */ console.log('Changing Value to 133123'); _test.attribute_01.setContent(133123); console.log('Reading after setter', _test.attribute_01.getContent()); /** Get the underlying Publish-and-Subscribe System */ const _pubSub = Builder.instance.container.get(PUBSUB.TYPES.PubSubSystem); const _sub = _pubSub.createSubscription('test.attribute_01.value.done', content => { console.log(content); }) /** Publish data to change the Attribute */ _pubSub.createSubscription(_test.shareConfig.attribute_01.publishToPath as string, (value) => console.log('Channel "test.path.to.publish" received', value)); console.log('plublish 1336 on', _test.shareConfig.attribute_01.publishToPath as string) _pubSub.createPublisher(_test.shareConfig.attribute_01.subscribeToPath as string).publishData(1336); /** Publish data to change the Attribute */ console.log(_test.shareConfig.attribute_01.subscribeToPath, 'EXTERNALLY') _pubSub.createPublisher(_test.shareConfig.attribute_01.subscribeToPath as string).publishData(12, 'ME'); });