Comparing version 1.10.1 to 1.11.0
@@ -18,2 +18,6 @@ "use strict"; | ||
const logWs = debug_1.debug('xumm-sdk:payload:websocket'); | ||
const maxSocketConnectAttempts = 30; | ||
const socketConnectAttemptSecondsDelay = 2; | ||
const socketKeepaliveSendSeconds = 2; | ||
const socketKeepaliveTimeoutSeconds = 10; | ||
class Payload { | ||
@@ -73,3 +77,2 @@ constructor(MetaObject) { | ||
subscribe(payload, callback) { | ||
var _a, _b; | ||
return __awaiter(this, void 0, void 0, function* () { | ||
@@ -80,54 +83,106 @@ const callbackPromise = new utils_1.DeferredPromise(); | ||
const _u = 'undefined'; // For globalThis.mockedWebSocket (leave note for Deno gen!) | ||
const socket = typeof ((_a = globalThis) === null || _a === void 0 ? void 0 : _a.MockedWebSocket) !== _u && typeof jest !== _u | ||
? new ((_b = globalThis) === null || _b === void 0 ? void 0 : _b.MockedWebSocket)('ws://xumm.local') | ||
: new websocket_1.w3cwebsocket(this.Meta.endpoint.replace(/^http/, 'ws') + '/sign/' + payloadDetails.meta.uuid); | ||
let socket; | ||
let keepAlivePing; | ||
let keepAliveReinstateTimer; | ||
let reconnectAttempts = 0; | ||
callbackPromise.promise.then(() => { | ||
clearTimeout(keepAlivePing); | ||
clearTimeout(keepAliveReinstateTimer); | ||
socket.close(); | ||
}); | ||
socket.onopen = () => { | ||
logWs(`Payload ${payloadDetails.meta.uuid}: Subscription active (WebSocket opened)`); | ||
}; | ||
socket.onmessage = (MessageEvent) => __awaiter(this, void 0, void 0, function* () { | ||
const m = MessageEvent.data; | ||
let json = undefined; | ||
try { | ||
json = JSON.parse(m.toString()); | ||
if ((json === null || json === void 0 ? void 0 : json.signed) || (json === null || json === void 0 ? void 0 : json.expired)) { | ||
// The payload has been signed or expired, update the referenced payload | ||
const updatedPayloadDetails = yield this.resolvePayload(payload); | ||
Object.assign(payloadDetails, Object.assign({}, updatedPayloadDetails)); | ||
} | ||
} | ||
catch (e) { | ||
// Do nothing | ||
logWs(`Payload ${payloadDetails.meta.uuid}: Received message, unable to parse as JSON`, e); | ||
} | ||
if (json && callback && typeof json.devapp_fetched === 'undefined') { | ||
const connect = () => { | ||
var _a, _b; | ||
socket = typeof ((_a = globalThis) === null || _a === void 0 ? void 0 : _a.MockedWebSocket) !== _u && typeof jest !== _u | ||
? new ((_b = globalThis) === null || _b === void 0 ? void 0 : _b.MockedWebSocket)('ws://xumm.local') | ||
: new websocket_1.w3cwebsocket(this.Meta.endpoint.replace(/^http/, 'ws') + '/sign/' + payloadDetails.meta.uuid); | ||
socket.onopen = () => { | ||
console.log(`Payload ${payloadDetails.meta.uuid}: subscription active (WebSocket opened)`); | ||
keepAlivePing = setInterval(() => { | ||
logWs('Send keepalive'); | ||
socket.send('{"ping":true}'); | ||
}, socketKeepaliveSendSeconds * 1000); | ||
}; | ||
socket.onmessage = (MessageEvent) => __awaiter(this, void 0, void 0, function* () { | ||
reconnectAttempts = 0; | ||
const m = MessageEvent.data; | ||
let json = undefined; | ||
try { | ||
// log(`Payload ${payload}`, json) | ||
const callbackResult = yield callback({ | ||
uuid: payloadDetails.meta.uuid, | ||
data: json, | ||
resolve(resolveData) { | ||
return __awaiter(this, void 0, void 0, function* () { | ||
yield callbackPromise.resolve(resolveData || undefined); | ||
}); | ||
}, | ||
payload: payloadDetails | ||
}); | ||
if (callbackResult !== undefined) { | ||
callbackPromise.resolve(callbackResult); | ||
json = JSON.parse(m.toString()); | ||
if ((json === null || json === void 0 ? void 0 : json.message) && json.message === 'Right back at you!') { | ||
// Keepalive responses | ||
logWs('Keepalive response'); | ||
clearTimeout(keepAliveReinstateTimer); | ||
keepAliveReinstateTimer = setTimeout(() => { | ||
console.log(`WebSocket for ${payloadDetails.meta.uuid} ` + | ||
`keepalive response timeout, assume dead... (Reconnect)`); | ||
socket.close(1002, 'Assume dead'); | ||
}, socketKeepaliveTimeoutSeconds * 1000); | ||
return; | ||
} | ||
if ((json === null || json === void 0 ? void 0 : json.signed) || (json === null || json === void 0 ? void 0 : json.expired)) { | ||
// The payload has been signed or expired, update the referenced payload | ||
const updatedPayloadDetails = yield this.resolvePayload(payload); | ||
Object.assign(payloadDetails, Object.assign({}, updatedPayloadDetails)); | ||
} | ||
} | ||
catch (e) { | ||
// Do nothing | ||
logWs(`Payload ${payloadDetails.meta.uuid}: Callback exception`, e); | ||
// This one emit for devs to know about this problem | ||
console.log(`Payload ${payloadDetails.meta.uuid}: Callback exception: ${e.message}`); | ||
logWs(`Payload ${payloadDetails.meta.uuid}: Received message, unable to parse as JSON`, e); | ||
} | ||
} | ||
}); | ||
socket.onclose = (_e) => { | ||
logWs(`Payload ${payloadDetails.meta.uuid}: Subscription ended (WebSocket closed)`); | ||
if (json && callback && typeof json.devapp_fetched === 'undefined') { | ||
try { | ||
// log(`Payload ${payload}`, json) | ||
const callbackResult = yield callback({ | ||
uuid: payloadDetails.meta.uuid, | ||
data: json, | ||
resolve(resolveData) { | ||
return __awaiter(this, void 0, void 0, function* () { | ||
yield callbackPromise.resolve(resolveData || undefined); | ||
}); | ||
}, | ||
payload: payloadDetails | ||
}); | ||
if (callbackResult !== undefined) { | ||
callbackPromise.resolve(callbackResult); | ||
} | ||
} | ||
catch (e) { | ||
// Do nothing | ||
logWs(`Payload ${payloadDetails.meta.uuid}: Callback exception`, e); | ||
// This one emit for devs to know about this problem | ||
console.log(`Payload ${payloadDetails.meta.uuid}: Callback exception: ${e.message}`); | ||
} | ||
} | ||
}); | ||
socket.onclose = (_e) => { | ||
logWs('Closed [code]', _e.code); | ||
logWs('Closed [reason]', _e.reason); | ||
logWs('Closed [wasClean]', _e.wasClean); | ||
clearInterval(keepAlivePing); | ||
clearTimeout(keepAliveReinstateTimer); | ||
// Reconnect | ||
if (_e.code > 1000 || _e.wasClean === false) { | ||
logWs('Unhealthy disconnect, reconnecting...', _e.code); | ||
if (reconnectAttempts < maxSocketConnectAttempts) { | ||
if (reconnectAttempts === 0) { | ||
console.log(`WebSocket for ${payloadDetails.meta.uuid} lost, reconnecting...`); | ||
} | ||
setTimeout(() => { | ||
reconnectAttempts++; | ||
logWs('# Reconnect'); | ||
socket = connect(); | ||
}, socketConnectAttemptSecondsDelay * 1000); | ||
} | ||
else { | ||
console.log(`WebSocket for ${payloadDetails.meta.uuid} exceeded reconnect timeouts, give up`); | ||
} | ||
} | ||
else { | ||
// Socket closed on purpose (?) | ||
} | ||
logWs(`Payload ${payloadDetails.meta.uuid}: Subscription ended (WebSocket closed)`); | ||
}; | ||
return socket; | ||
}; | ||
socket = connect(); | ||
return { | ||
@@ -134,0 +189,0 @@ payload: payloadDetails, |
{ | ||
"name": "xumm-sdk", | ||
"version": "1.10.1", | ||
"version": "1.11.0", | ||
"description": "Interact with the Xumm Developer API", | ||
@@ -5,0 +5,0 @@ "main": "dist/src/index.js", |
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
315531
6292