Skip to content

Commit

Permalink
Support multiple event handlers. Issue #32.
Browse files Browse the repository at this point in the history
  • Loading branch information
adamhartford committed Apr 2, 2016
1 parent 1292d3d commit e1db43e
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 11 deletions.
20 changes: 15 additions & 5 deletions SwiftR/SwiftR.swift
Original file line number Diff line number Diff line change
Expand Up @@ -357,10 +357,14 @@ public class SignalR: NSObject, SwiftRWebDelegate {
} else if let data: AnyObject = json["data"] {
received?(data)
} else if let hubName = json["hub"] as? String {
let method = json["method"] as! String
let callbackID = json["id"] as? String
let method = json["method"] as? String
let arguments: AnyObject? = json["arguments"]
let hub = hubs[hubName]
hub?.handlers[method]?(arguments)

if let method = method, callbackID = callbackID, handlers = hub?.handlers[method], handler = handlers[callbackID] {
handler(arguments)
}
}
}

Expand Down Expand Up @@ -426,7 +430,7 @@ public class SignalR: NSObject, SwiftRWebDelegate {

public class Hub {
let name: String
var handlers: [String: AnyObject? -> ()] = [:]
var handlers: [String: [String: AnyObject? -> ()]] = [:]
var invokeHandlers: [String: (result: AnyObject?, error: AnyObject?) -> ()] = [:]

public let connection: SignalR!
Expand All @@ -437,14 +441,20 @@ public class Hub {
}

public func on(method: String, parameters: [String]? = nil, callback: AnyObject? -> ()) {
handlers[method] = callback
let callbackID = NSUUID().UUIDString

if handlers[method] == nil {
handlers[method] = [:]
}

handlers[method]?[callbackID] = callback

var p = "null"
if let params = parameters {
p = "['" + params.joinWithSeparator("','") + "']"
}

connection.runJavaScript("addHandler('\(name)', '\(method)', \(p))")
connection.runJavaScript("addHandler('\(callbackID)', '\(name)', '\(method)', \(p))")
}

public func invoke(method: String, arguments: [AnyObject]?, callback: ((result: AnyObject?, error: AnyObject?) -> ())? = nil) {
Expand Down
14 changes: 8 additions & 6 deletions SwiftR/Web/SwiftR.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@ window.swiftR = {
connection: null,
hubs: {},
transport: 'auto',
headers: {}
headers: {},
messages: {}
};

$(function() {
Expand Down Expand Up @@ -59,13 +60,13 @@ function start() {
});
}

function addHandler(hubName, method, parameters) {
function addHandler(id, hubName, method, parameters) {
var hub = ensureHub(hubName);

hub.on(method, function() {
var args = arguments;
var o = {};

if (parameters) {
for (var i in parameters) {
o[parameters[i]] = args[i];
Expand All @@ -75,6 +76,7 @@ function addHandler(hubName, method, parameters) {
}

postMessage({
id: id,
hub: hub.hubName,
method: method,
arguments: o
Expand All @@ -84,7 +86,7 @@ function addHandler(hubName, method, parameters) {

function postMessage(msg) {
var id = Math.random().toString(36).slice(2, 10);
swiftR[id] = JSON.stringify(msg);
swiftR.messages[id] = JSON.stringify(msg);

if (window.webkit) {
webkit.messageHandlers.interOp.postMessage(id);
Expand Down Expand Up @@ -112,7 +114,7 @@ function processError(error) {
}

function readMessage(id) {
var msg = swiftR[id];
delete swiftR[id];
var msg = swiftR.messages[id];
delete swiftR.messages[id];
return msg;
}

0 comments on commit e1db43e

Please sign in to comment.