diff --git a/src/socketio.android.ts b/src/socketio.android.ts index ecd871e..bf50fc2 100644 --- a/src/socketio.android.ts +++ b/src/socketio.android.ts @@ -32,15 +32,37 @@ export class SocketIO extends Common { } } 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.engineio.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) { + opts.transports = transports; + } } else { opts[key] = options[key]; } } this.socket = io.socket.client.IO.socket(args[0], opts); + this.socket.io().on(io.socket.client.Manager.EVENT_TRANSPORT, new io.socket.emitter.Emitter.Listener({ + call(transportArgs) { + let transports = transportArgs[0]; + if (transports) { + transports.on(io.socket.engineio.client.Transport.EVENT_REQUEST_HEADERS, new io.socket.emitter.Emitter.Listener({ + call(requestArgs) { + const cookies = options['cookie']; + if (cookies) { + const headers = requestArgs[0]; + const list = new java.util.ArrayList(); + list.add(cookies); + headers.put('Cookie', list); + } + } + })); + } + } + })); break; } diff --git a/src/socketio.d.ts b/src/socketio.d.ts index 7c7dd4e..48c4eb0 100644 --- a/src/socketio.d.ts +++ b/src/socketio.d.ts @@ -1 +1,17 @@ -export * from './socketio.android'; +import { Common } from './socketio.common'; +export declare class SocketIO extends Common { + protected socket: any; + constructor(...args: any[]); + connect(): void; + disconnect(): void; + readonly connected: boolean; + on(event: string, callback: (...payload: any[]) => void): () => void; + once(event: string, callback: (...payload: any[]) => void): () => void; + off(event: string): void; + emit(event: string, ...payload: any[]): void; + joinNamespace(nsp: string): SocketIO; + leaveNamespace(): void; +} +export declare function serialize(data: any): any; +export declare function deserialize(data: any): any; +export declare function connect(uri: string, options?: any): SocketIO; diff --git a/src/socketio.ios.ts b/src/socketio.ios.ts index 5a29c2b..38f6084 100644 --- a/src/socketio.ios.ts +++ b/src/socketio.ios.ts @@ -1,7 +1,9 @@ import { Common } from './socketio.common'; declare var SocketManager: any, NSURLComponents: any, NSURL: any, NSArray: any, - NSDictionary: any, NSNull: any, SocketIOStatus: any; + NSDictionary: any, NSNull: any, SocketIOStatus: any, NSHTTPCookie: any, NSHTTPCookieSecure: any, + NSHTTPCookiePath: any, NSHTTPCookieDomain: any, NSHTTPCookieExpires: any, + NSHTTPCookieMaximumAge: any, NSHTTPCookieName: any, NSHTTPCookieValue: any; export class SocketIO extends Common { protected socket: any; @@ -62,6 +64,64 @@ export class SocketIO extends Common { } } else if (key === 'debug' && obj[key]) { opts['log'] = true; + } else if (key === 'cookie') { + const cookie = obj[key] as string; + const properties = {}; + properties[NSHTTPCookiePath] = '/'; + properties[NSHTTPCookieDomain] = (urlComponent.scheme || '') + '://' + (urlComponent.host || ''); + cookie.split(';').forEach((item, index) => { + if (item.trim() === 'Secure') { + properties[NSHTTPCookieSecure] = true; + } else if (item.trim() === 'HttpOnly') { + + } else { + const keyVal = item.trim(); + if (item.indexOf('=') > -1) { + const keyValItems = keyVal.split('='); + const key = keyValItems[0]; + const val = keyValItems[1]; + if (index === 0) { + properties[NSHTTPCookieName] = key; + properties[NSHTTPCookieValue] = val; + } else { + switch (key) { + case 'path': + case 'Path': + properties[NSHTTPCookiePath] = val; + break; + case 'domain': + case 'Domain': + properties[NSHTTPCookieDomain] = val; + break; + case 'expires': + case 'Expires': + properties[NSHTTPCookieExpires] = val; + break; + case 'max-age': + case 'Max-Age': + properties[NSHTTPCookieMaximumAge] = val; + break; + default: + + } + } + } + } + }); + const props = NSDictionary.dictionaryWithDictionary(properties); + const native_cookie = NSHTTPCookie.cookieWithProperties(props); + if (native_cookie) { + opts['cookies'] = NSArray.arrayWithObject(native_cookie); + } + } else if (key === 'transports') { + const transports = obj[key]; + if (Array.isArray(transports) && transports.length === 1) { + if (transports.indexOf(['websocket']) > -1) { + opts['forceWebsockets'] = true; + } else if (transports.indexOf(['polling']) > -1) { + opts['forcePolling'] = true; + } + } } else { opts[key] = serialize(obj[key]); }