UNPKG

@triniwiz/nativescript-socketio

Version:
376 lines 13.8 kB
import { Common } from './common'; import { Utils } from '@nativescript/core'; export class SocketIO extends Common { /* io.socket.client.Socket; */ constructor(...args) { super(); switch (args.length) { case 2: { let opts = io.socket.client.SocketOptionBuilder.builder(); opts.setMultiplex(true); const options = args[1]; const keys = Object.keys(options); const headers = new java.util.HashMap(); for (let key of keys) { if (key === 'query') { const query = options[key]; if (typeof query === 'object') { const queryKeys = Object.keys(query); const uri = android.net.Uri.parse(args[0]); const uriBuilder = uri.buildUpon(); for (let queryKey of queryKeys) { const value = `${query[queryKey]}`; uriBuilder.appendQueryParameter(queryKey, value); } opts.setQuery(uriBuilder.build().getQuery()); } else if (typeof query === 'string') { opts.setQuery(query); } } else if (key === 'debug' && options[key]) { // co.fitcom.fancylogger.FancyLogger.reset(new co.fitcom.fancylogger.FancyLogger()); java.util.logging.Logger.getLogger(io.socket.client.Socket.class.getName()).setLevel(java.util.logging.Level.FINEST); java.util.logging.Logger.getLogger(io.socket.client.Manager.class.getName()).setLevel(java.util.logging.Level.FINEST); } else if (key === 'transports' && options[key]) { const transports = options[key]; if (Array.isArray(transports) && transports.length > 0) { const array = Array.create('java.lang.String', transports.length); transports.forEach((item, index) => { array[index] = item; }); opts.setTransports(array); } } else if (key === 'auth') { const authMap = new java.util.HashMap(); for (const [auth_key, auth_value] of Object.entries(options[key])) { authMap.put(auth_key, auth_value); this.auth_payload[auth_key] = auth_value; } if (!authMap.isEmpty()) opts.setAuth(authMap); } else if (key === 'cookie') { const cookie = options['cookie']; let cookies; if (cookie && typeof cookie === 'string') { cookies = cookie.split(';'); } if (cookies) { const list = new java.util.ArrayList(java.util.Arrays.asList(cookies)); headers.put('Cookie', list); } } else if (key === 'extraHeaders') { const extraHeaders = options['extraHeaders']; const keys = Object.keys(extraHeaders); keys.forEach((key) => { const value = extraHeaders[key]; const list = new java.util.ArrayList(); list.add(value); headers.put(key, list); }); if (!headers.isEmpty()) opts.setExtraHeaders(headers); } else if (opts['set' + key[0].toUpperCase() + key.substring(1)]) { opts['set' + key[0].toUpperCase() + key.substring(1)](Utils.dataSerialize(options[key])); // for example transforms to setPath(options[path]) } } if (!headers.isEmpty()) { opts.setExtraHeaders(headers); } this.socket = io.socket.client.IO.socket(args[0], opts.build()); break; } case 3: { this.socket = args.pop(); break; } default: { let opts = io.socket.client.SocketOptionBuilder.builder(); opts.setMultiplex(true); this.socket = io.socket.client.IO.socket(args[0], opts.build()); break; } } } connect() { if (!this.connected) { this.socket.connect(); } } disconnect() { this.socket.disconnect(); } get connected() { return this.socket && this.socket.connected(); } on(event, callback) { const listener = new io.socket.emitter.Emitter.Listener({ call(args) { let payload = Array.prototype.slice.call(args); let ack = payload.pop(); if (ack && !(ack.getClass().getName().indexOf('io.socket.client.Socket') === 0 && ack.call)) { payload.push(ack); ack = null; } payload = payload.map(deserialize); if (ack) { const _ack = function () { let _args = Array.prototype.slice.call(arguments); ack.call(_args.map(serialize)); }; payload.push(_ack); } callback.apply(null, payload); }, }); let isManager = false; let eventName = event; switch (event) { case 'connect': case 'connecting': eventName = io.socket.client.Socket.EVENT_CONNECT; break; case 'disconnect': eventName = io.socket.client.Socket.EVENT_DISCONNECT; break; case 'error': eventName = io.socket.client.Socket.EVENT_CONNECT_ERROR; break; case 'ping': case 'pong': isManager = true; // eventName = io.socket.client.Manager.EVENT_PACKET; break; case 'reconnect': isManager = true; eventName = io.socket.client.Manager.EVENT_RECONNECT; break; case 'reconnectAttempt': isManager = true; eventName = io.socket.client.Manager.EVENT_RECONNECT_ATTEMPT; break; case 'statusChange': case 'websocketUpgrade': isManager = true; // eventName = io.socket.client.Manager.EVENT_PACKET; break; default: // noop break; } if (isManager) { // @ts-ignore this.socket.io().on(eventName, listener); } else { // @ts-ignore this.socket.on(eventName, listener); } return () => { if (isManager) { // @ts-ignore this.socket.io().off(event, listener); } else { // @ts-ignore this.socket.off(event, listener); } }; } once(event, callback) { const listener = new io.socket.emitter.Emitter.Listener({ call(args) { let payload = Array.prototype.slice.call(args); let ack = payload.pop(); if (ack && !(ack.getClass().getName().indexOf('io.socket.client.Socket') === 0 && ack.call)) { payload.push(ack); ack = null; } payload = payload.map(deserialize); if (ack) { const _ack = function () { let _args = Array.prototype.slice.call(arguments); ack.call(_args.map(serialize)); }; payload.push(_ack); } callback.apply(null, payload); }, }); let eventName = event; let isManager = false; switch (event) { case 'connect': case 'connecting': eventName = io.socket.client.Socket.EVENT_CONNECT; break; case 'disconnect': eventName = io.socket.client.Socket.EVENT_DISCONNECT; break; case 'error': eventName = io.socket.client.Socket.EVENT_CONNECT_ERROR; break; case 'ping': case 'pong': isManager = true; // eventName = io.socket.client.Manager.EVENT_PACKET; break; case 'reconnect': isManager = true; eventName = io.socket.client.Manager.EVENT_RECONNECT; break; case 'reconnectAttempt': isManager = true; eventName = io.socket.client.Manager.EVENT_RECONNECT_ATTEMPT; break; case 'statusChange': case 'websocketUpgrade': isManager = true; // eventName = io.socket.client.Manager.EVENT_PACKET; break; default: // noop break; } if (isManager) { // @ts-ignore this.socket.io().once(eventName, listener); } else { // @ts-ignore this.socket.once(eventName, listener); } return () => { if (isManager) { // @ts-ignore this.socket.io().off(event, listener); } else { // @ts-ignore this.socket.off(event, listener); } }; } off(event) { // @ts-ignore this.socket.off(event); } emit(event, ...payload) { if (!event) { throw Error('Emit Failed: No Event argument'); } // Check for ack callback let ack = payload.pop(); // Remove ack if final argument is not a function if (ack && typeof ack !== 'function') { payload.push(ack); ack = null; } // Serialize Emit const final = payload.map(serialize); if (ack) { final.push(new io.socket.client.Ack({ call: function (args) { args = Array.prototype.slice.call(args); ack.apply(null, args.map(deserialize)); }, })); } // Emit this.socket.emit(event, final); } joinNamespace(nsp) { const manager = this.socket.io(); const socket = manager.socket(nsp); const namespaceSocket = new SocketIO(null, null, socket); if (this.socket.connected()) { // Only join if currently connected. Otherwise just configure to join on connect. // This mirrors IOS behavior namespaceSocket.connect(); } return namespaceSocket; } leaveNamespace() { if (this.socket) { this.socket.disconnect(); } } } export function serialize(data) { let store; switch (typeof data) { case 'string': case 'boolean': case 'number': { return data; } case 'object': { if (!data) { return null; } if (data instanceof Date) { return data.toJSON(); } if (Array.isArray(data)) { store = new org.json.JSONArray(); data.forEach((item) => store.put(serialize(item))); return store; } store = new org.json.JSONObject(); Object.keys(data).forEach((key) => store.put(key, serialize(data[key]))); return store; } default: return null; } } export function deserialize(data) { if (data === null || typeof data !== 'object') { return data; } let store; switch (data.getClass().getName()) { case 'java.lang.String': { return String(data); } case 'java.lang.Boolean': { return String(data) === 'true'; } case 'java.lang.Integer': case 'java.lang.Long': case 'java.lang.Double': case 'java.lang.Short': { return Number(data); } case 'org.json.JSONArray': { store = []; for (let j = 0; j < data.length(); j++) { store[j] = deserialize(data.get(j)); } break; } case 'org.json.JSONObject': { store = {}; let i = data.keys(); while (i.hasNext()) { let key = i.next(); store[key] = deserialize(data.get(key)); } break; } default: store = null; } return store; } export function connect(uri, options) { let socketio = new SocketIO(uri, options || {}); socketio.connect(); return socketio; } //# sourceMappingURL=index.android.js.map