Skip to content

Instantly share code, notes, and snippets.

@micdenny
Forked from KeithGillette/MessageService.ts
Last active January 24, 2018 18:23

Revisions

  1. micdenny revised this gist Jan 24, 2018. 2 changed files with 2 additions and 2 deletions.
    2 changes: 1 addition & 1 deletion MessageService.ts
    Original file line number Diff line number Diff line change
    @@ -21,7 +21,7 @@ export class MessageService {
    this._message$.next({ 'channel': channel, 'content': messageInstance });
    }

    public subscribe<T>(messageClass: { new (...args: any[]): T }): Observable<T> { // Flux: 'subscribe' = 'on'
    public of<T>(messageClass: { new (...args: any[]): T }): Observable<T> { // Flux: 'subscribe' = 'on'
    const channel = messageClass;
    return this._message$.filter((message) => { return message.channel === channel }).map((message) => { return message.content; });
    }
    2 changes: 1 addition & 1 deletion subscribe.ts
    Original file line number Diff line number Diff line change
    @@ -1,5 +1,5 @@
    import * as message from './MessageServiceClasses';

    // assume MessageService is injected & some callback handlers defined to pass in
    this.MessageService.subscribe(message.ProcedureUpdateNameOnClientRequestMessage)
    this.MessageService.of(message.ProcedureUpdateNameOnClientRequestMessage)
    .subscribe(this.updateNameOnClientRequestHandle.bind(this), this._genericErrorHandler.bind(this))
  2. @KeithGillette KeithGillette revised this gist Nov 22, 2016. 1 changed file with 0 additions and 1 deletion.
    1 change: 0 additions & 1 deletion MessageService.ts
    Original file line number Diff line number Diff line change
    @@ -1,6 +1,5 @@
    import * as angular from 'angular';
    import { Observable, Subject, Subscription } from '@reactivex/rxjs';
    import * as domain from '../models';

    export interface Message {
    channel: Function;
  3. @KeithGillette KeithGillette revised this gist Oct 30, 2016. No changes.
  4. @KeithGillette KeithGillette revised this gist Oct 30, 2016. No changes.
  5. @KeithGillette KeithGillette created this gist Oct 30, 2016.
    33 changes: 33 additions & 0 deletions MessageService.ts
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,33 @@
    import * as angular from 'angular';
    import { Observable, Subject, Subscription } from '@reactivex/rxjs';
    import * as domain from '../models';

    export interface Message {
    channel: Function;
    content: any;
    }

    /**
    * @description AngularJS service singleton implementing simple publish/subscribe message bus to provide decoupled communication of commands & events
    */
    export class MessageService {
    private _message$: Subject<Message>

    constructor() {
    this._message$ = new Subject<Message>();
    }

    public publish<T>(messageInstance: T): void { // Flux: 'publish' = 'dispatch', 'channel' = 'action'
    const channel: Function = messageInstance.constructor;
    this._message$.next({ 'channel': channel, 'content': messageInstance });
    }

    public subscribe<T>(messageClass: { new (...args: any[]): T }): Observable<T> { // Flux: 'subscribe' = 'on'
    const channel = messageClass;
    return this._message$.filter((message) => { return message.channel === channel }).map((message) => { return message.content; });
    }

    }

    angular.module('TaskTrainApp')
    .service('MessageService', MessageService);
    33 changes: 33 additions & 0 deletions MessageServiceClasses.ts
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,33 @@
    // Just some sample message classes

    /**
    * @description encapsulation class for messages sent to the MessageService message bus to provide channel type and TypeScript typing
    */
    export class UserNotificationMessage {
    constructor(
    public message: string,
    public notificationType?: NotificationType,
    public options?: any,
    public notifier?: any
    ) { }
    }
    export type NotificationType = 'success' | 'info' | 'warning' | 'danger' | 'error';

    /**
    * @description base class for all DomainModelService UPDATE operations
    */
    abstract class DomainModelUpdateRequestMessage {
    constructor(
    public id: string,
    public domainModelObject: domain.IDomainModel,
    public newValue?: any,
    public oldValue?: any,
    ) { }
    }

    /**
    * @description encapsulation class for messages sent to the MessageService message bus to provide TypeScript typing
    */
    export class ProcedureUpdateNameOnClientRequestMessage extends DomainModelUpdateRequestMessage {
    public domainModelObject: domain.IProcedure;
    }
    4 changes: 4 additions & 0 deletions publish.ts
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,4 @@
    import * as message from './MessageServiceClasses';

    // assume MessageService is injected
    this.MessageService.publish(new message.ProcedureUpdateNameOnClientRequestMessage(this.id, this, newValue, this._name));
    5 changes: 5 additions & 0 deletions subscribe.ts
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,5 @@
    import * as message from './MessageServiceClasses';

    // assume MessageService is injected & some callback handlers defined to pass in
    this.MessageService.subscribe(message.ProcedureUpdateNameOnClientRequestMessage)
    .subscribe(this.updateNameOnClientRequestHandle.bind(this), this._genericErrorHandler.bind(this))