@ -1,7 +1,7 @@
/* jquery.signalR.core.js */
/*global window:false */
/ * !
* ASP . NET SignalR JavaScript Library v1 . 1. 2
* ASP . NET SignalR JavaScript Library v1 . 1. 3
* http : //signalr.net/
*
* Copyright Microsoft Open Technologies , Inc . All rights reserved .
@ -457,7 +457,7 @@
// Timeout to designate when to force the connection into reconnecting converted to milliseconds
keepAliveData . timeout = res . KeepAliveTimeout * 1000 ;
// Timeout to designate when to warn the developer that the connection may be dead or is hang ing.
// Timeout to designate when to warn the developer that the connection may be dead or is not respond ing.
keepAliveData . timeoutWarning = keepAliveData . timeout * connection . keepAliveWarnAt ;
// Instantiate the frequency in which we check the keep alive. It must be short in order to not miss/pick up any changes
@ -880,7 +880,7 @@
// so just hack around it on the client for now.
return ;
}
$ ( connection ) . triggerHandler ( events . onError , [ errData ]) ;
$ ( connection ) . triggerHandler ( events . onError , [ errData , data ]) ;
}
} ) ;
} ,
@ -1803,9 +1803,7 @@
"use strict" ;
// we use a global id for tracking callbacks so the server doesn't have to send extra info like hub name
var callbackId = 0 ,
callbacks = { } ,
eventNamespace = ".hubProxy" ;
var eventNamespace = ".hubProxy" ;
function makeEventName ( event ) {
return event + eventNamespace ;
@ -1839,6 +1837,28 @@
return false ;
}
function clearInvocationCallbacks ( connection , error ) {
/// <param name="connection" type="hubConnection" />
var callbacks = connection . _ . invocationCallbacks ,
callback ;
connection . log ( "Clearing hub invocation callbacks with error: " + error ) ;
// Reset the callback cache now as we have a local var referencing it
connection . _ . invocationCallbackId = 0 ;
delete connection . _ . invocationCallbacks ;
connection . _ . invocationCallbacks = { } ;
// Loop over the callbacks and invoke them.
// We do this using a local var reference and *after* we've cleared the cache
// so that if a fail callback itself tries to invoke another method we don't
// end up with its callback in the list we're looping over.
for ( var callbackId in callbacks ) {
callback = callbacks [ callbackId ] ;
callback . method . call ( callback . scope , { E : error } ) ;
}
}
// hubProxy
function hubProxy ( hubConnection , hubName ) {
/// <summary>
@ -1929,9 +1949,10 @@
/// <param name="methodName" type="String">The name of the server hub method.</param>
var self = this ,
connection = self . connection ,
args = $ . makeArray ( arguments ) . slice ( 1 ) ,
argValues = map ( args , getArgValue ) ,
data = { H : self . hubName , M : methodName , A : argValues , I : c allbackId } ,
data = { H : self . hubName , M : methodName , A : argValues , I : c onnection. _ . invocationC allbackId } ,
d = $ . Deferred ( ) ,
callback = function ( minResult ) {
var result = self . _maximizeHubResponse ( minResult ) ;
@ -1942,7 +1963,7 @@
if ( result . Error ) {
// Server hub method threw an exception, log it & reject the deferred
if ( result . StackTrace ) {
self. connection. log ( result . Error + "\n" + result . StackTrace ) ;
connection. log ( result . Error + "\n" + result . StackTrace ) ;
}
d . rejectWith ( self , [ result . Error ] ) ;
} else {
@ -1951,14 +1972,14 @@
}
} ;
c allbacks[ c allbackId. toString ( ) ] = { scope : self , method : callback } ;
c allbackId += 1 ;
c onnection. _ . invocationC allbacks[ c onnection. _ . invocationC allbackId. toString ( ) ] = { scope : self , method : callback } ;
c onnection. _ . invocationC allbackId += 1 ;
if ( ! $ . isEmptyObject ( self . state ) ) {
data . S = self . state ;
}
self. connection. send ( window . JSON . stringify ( data ) ) ;
connection. send ( window . JSON . stringify ( data ) ) ;
return d . promise ( ) ;
} ,
@ -1999,10 +2020,10 @@
hubConnection . fn . init = function ( url , options ) {
var settings = {
qs : null ,
logging : false ,
useDefaultPath : true
} ,
qs : null ,
logging : false ,
useDefaultPath : true
} ,
connection = this ;
$ . extend ( settings , options ) ;
@ -2013,6 +2034,9 @@
// Object to store hub proxies for this connection
connection . proxies = { } ;
connection . _ . invocationCallbackId = 0 ;
connection . _ . invocationCallbacks = { } ;
// Wire up the received handler
connection . received ( function ( minData ) {
var data , proxy , dataCallbackId , callback , hubName , eventName ;
@ -2023,11 +2047,11 @@
if ( typeof ( minData . I ) !== "undefined" ) {
// We received the return value from a server method invocation, look up callback by id and call it
dataCallbackId = minData . I . toString ( ) ;
callback = c allbacks[ dataCallbackId ] ;
callback = c onnection. _ . invocationC allbacks[ dataCallbackId ] ;
if ( callback ) {
// Delete the callback from the proxy
c allbacks[ dataCallbackId ] = null ;
delete c allbacks[ dataCallbackId ] ;
c onnection. _ . invocationC allbacks[ dataCallbackId ] = null ;
delete c onnection. _ . invocationC allbacks[ dataCallbackId ] ;
// Invoke the callback
callback . method . call ( callback . scope , minData ) ;
@ -2050,6 +2074,52 @@
$ ( proxy ) . triggerHandler ( makeEventName ( eventName ) , [ data . Args ] ) ;
}
} ) ;
connection . error ( function ( errData , origData ) {
var data , callbackId , callback ;
if ( connection . transport && connection . transport . name === "webSockets" ) {
// WebSockets connections have all callbacks removed on reconnect instead
// as WebSockets sends are fire & forget
return ;
}
if ( ! origData ) {
// No original data passed so this is not a send error
return ;
}
try {
data = window . JSON . parse ( origData ) ;
if ( ! data . I ) {
// The original data doesn't have a callback ID so not a send error
return ;
}
} catch ( e ) {
// The original data is not a JSON payload so this is not a send error
return ;
}
callbackId = data . I ;
callback = connection . _ . invocationCallbacks [ callbackId ] ;
// Invoke the callback with an error to reject the promise
callback . method . call ( callback . scope , { E : errData } ) ;
// Delete the callback
connection . _ . invocationCallbacks [ callbackId ] = null ;
delete connection . _ . invocationCallbacks [ callbackId ] ;
} ) ;
connection . reconnecting ( function ( ) {
if ( connection . transport && connection . transport . name === "webSockets" ) {
clearInvocationCallbacks ( connection , "Connection started reconnecting before invocation result was received." ) ;
}
} ) ;
connection . disconnected ( function ( ) {
clearInvocationCallbacks ( connection , "Connection was disconnected before invocation result was received." ) ;
} ) ;
} ;
hubConnection . fn . _maximizeClientHubInvocation = function ( minClientHubInvocation ) {
@ -2119,5 +2189,5 @@
/*global window:false */
/// <reference path="jquery.signalR.core.js" />
( function ( $ ) {
$ . signalR . version = "1.1. 2 ";
$ . signalR . version = "1.1. 3 ";
} ( window . jQuery ) ) ;