diff --git a/sockjs-client/sockjs-client-tests.ts b/sockjs-client/sockjs-client-tests.ts
new file mode 100644
index 000000000..53199ad0d
--- /dev/null
+++ b/sockjs-client/sockjs-client-tests.ts
@@ -0,0 +1,48 @@
+///
+
+import * as SockJS from 'sockjs-client';
+import BaseEvent = __SockJSClient.BaseEvent;
+import SockJSClass = __SockJSClient.SockJSClass;
+
+let sockJs: SockJSClass;
+
+sockJs = new SockJS('url');
+sockJs = SockJS('url');
+sockJs = SockJS('url', null, {
+ server: '1233445',
+ sessionId: 23,
+ transports: 'websocket'
+});
+sockJs = SockJS('url', null, {
+ sessionId: () => 'SID',
+ transports: ['websocket', 'eventsource']
+});
+
+let listener = (e: BaseEvent) => e;
+let listenerObj = {
+ handleEvent: (e: BaseEvent) => e
+};
+
+sockJs.addEventListener('onopen', listener);
+sockJs.addEventListener('onclose', listener, true);
+sockJs.addEventListener('onopen', listenerObj);
+sockJs.addEventListener('onclose', listenerObj, true);
+
+sockJs.removeEventListener('onopen', listener);
+sockJs.removeEventListener('onclose', listener, true);
+sockJs.removeEventListener('onopen', listenerObj);
+sockJs.removeEventListener('onclose', listenerObj, true);
+
+sockJs.onopen = e => console.log(e);
+sockJs.onmessage = e => console.log(e.data);
+sockJs.onclose = e => console.log(e.code, e.reason, e.wasClean);
+
+let testStates = SockJS.CONNECTING !== -1 && SockJS.OPEN !== -1 &&
+ SockJS.CLOSING !== -1 && SockJS.CLOSED !== -1;
+
+sockJs.send('send');
+sockJs.send({x: 1});
+
+sockJs.close(100, 'reason');
+sockJs.close(200);
+sockJs.close();
diff --git a/sockjs-client/sockjs-client.d.ts b/sockjs-client/sockjs-client.d.ts
new file mode 100644
index 000000000..322f82139
--- /dev/null
+++ b/sockjs-client/sockjs-client.d.ts
@@ -0,0 +1,65 @@
+// Type definitions for sockjs-client 1.0.3
+// Project: https://github.com/sockjs/sockjs-client
+// Definitions by: Emil Ivanov , Alexander Rusakov
+// Definitions: https://github.com/borisyankov/DefinitelyTyped
+
+declare namespace __SockJSClient {
+ interface BaseEvent {
+ type: string;
+ }
+
+ interface OpenEvent extends BaseEvent {}
+
+ interface CloseEvent extends BaseEvent {
+ code: number;
+ reason: string;
+ wasClean: boolean;
+ }
+
+ interface MessageEvent extends BaseEvent {
+ data: string;
+ }
+
+ interface SessionGenerator {
+ (): string;
+ }
+
+ interface Options {
+ server?: string;
+ sessionId?: number | SessionGenerator;
+ transports?: string | string[]
+ }
+
+ enum State {
+ CONNECTING = 0, OPEN, CLOSING, CLOSED
+ }
+
+ interface SockJSClass extends EventTarget {
+ readyState: State;
+ protocol: string;
+ url: string;
+ onopen: (e: OpenEvent) => any;
+ onclose: (e: CloseEvent) => any;
+ onmessage: (e: MessageEvent) => any;
+ send(data: any): void;
+ close(code?: number, reason?: string): void;
+ }
+}
+
+declare module 'sockjs-client' {
+ import SockJSClass = __SockJSClient.SockJSClass;
+ import Options = __SockJSClient.Options;
+ import State = __SockJSClient.State;
+
+ var SockJS: {
+ new(url: string, _reserved?: any, options?: Options): SockJSClass;
+ (url: string, _reserved?: any, options?: Options): SockJSClass;
+ prototype: SockJSClass;
+ CONNECTING: State;
+ OPEN: State;
+ CLOSING: State;
+ CLOSED: State;
+ };
+
+ export = SockJS;
+}