WebModule Message.js を作成しました。いわゆるメッセージパッシングです。
これは、Postal.js をリファクタリングし、名前を変更したものです。
Postal.js で14個ほどあったメソッドが、Message.js ではわずか2個(new Message, Message#post)に集約されました。KISS ですね。
Message over WorkerThread も実装しているため、UI Thread ⇔ UI Thread と UI Thread ⇔ Worker Thread のメッセージングをシームレスかつシンプルに実装できます。
// Postal.js の API function Postal() { // @help: Postal // @desc: Message delivery utility (Observer pattern implementation). this["_receiver"] = {}; // Object: receiver hash table. { id: receiver, ... } } Postal["repository"] = "https://github.com/uupaa/Postal.js"; Postal["prototype"] = { "constructor": Postal, "id": _id, // Postal#id(receiver:ReceiverObject):ReceiverIDString "register": register, // Postal#register(receiver:ReceiverObject):this "unregister": unregister, // Postal#unregister(receiver:ReceiverObject = undefined):this "to": to, // Postal#to(receiver:ReceiverObject = undefined):Envelope "omit": omit, // Postal#omit(receiver:ReceiverObject):Envelope "send": send, // Postal#send(message:String, param:Mix = undefined, ...):Object "post": post // Postal#post(message:String, param:Mix = undefined, ...):Object }; function Envelope(hash, // @arg receiverHashTableObject: registered receiver. { id: object, ... } to) { // @arg StringArray: delivery id. ["id", ...] this["_receiver"] = hash; // Object: receiver hash table. { id: receiver, ... } this["_to"] = to; // StringArray: ["id", ...] } Envelope["prototype"] = { "constructor": Envelope, "to": to, // Envelope#to(receiver:ReceiverObject):Envelope "omit": omit, // Envelope#omit(receiver:ReceiverObject):Envelope "list": list, // Envelope#list():ReceiverIDStringArray "send": send, // Envelope#send(message:String, param:Mix = undefined, ...):Object "post": post // Envelope#post(message:String, param:Mix = undefined, ...):Object };
// Message.js の API function Message(address, // @arg Object - to address. { name: Object, ... } method) { // @arg String = "inbox" - callback method name. // @desc: MessagePassing implementation. this._address = address; this._method = method || "inbox"; //{@dev $valid($type(address, "Object"), Message, "address"); $valid($type(method, "String|omit"), Message, "method"); for (var name in address) { $valid($type(address[name][this._method], "Function"), Message, "address"); // object has not method. } //}@dev } Message["repository"] = "https://github.com/uupaa/Message.js"; // GitHub repository URL. http://git.io/Help Message["prototype"] = { "constructor": Message, // new Message(address:Object, method:String = "inbox") "post": Message_post // Message#post(data:Object, callback:Function = null):void };