@triniwiz/nativescript-socketio
Version:
Socket.IO for nativescript
376 lines • 13.8 kB
JavaScript
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