diff --git a/ss-utils/ss-utils-tests.ts b/ss-utils/ss-utils-tests.ts
new file mode 100644
index 0000000000..7527435b6c
--- /dev/null
+++ b/ss-utils/ss-utils-tests.ts
@@ -0,0 +1,41 @@
+///
+///
+
+declare var EventSource : sse.IEventSourceStatic;
+
+declare module sse {
+ interface IEventSourceStatic extends EventTarget {
+ new (url: string, eventSourceInitDict?: IEventSourceInit):IEventSourceStatic;
+ url: string;
+ }
+
+ interface IEventSourceInit {
+ withCredentials?: boolean;
+ }
+}
+
+function test_ssutils() {
+ $.ss.eventReceivers = { "document": document };
+
+ var source = new EventSource("/event-stream?channels=home,work");
+ $(source).handleServerEvents({
+ handlers: {
+ onConnect: function(connect:SSUtilsSSEConnect) {},
+ onHeartbeat: function(msg:SSUtilsSSEHeartbeat, e:MessageEvent){},
+ onJoin: function(msg:SSUtilsSSEJoin) {},
+ onLeave: function(msg:SSUtilsSSELeave) {}
+ },
+ receivers: {
+ tv: {
+ watch: function(){}
+ }
+ }
+ });
+
+ $(document).bindHandlers({
+ announce: function (msg:string) {}
+ })
+ .on('customEvent', function (e, msg, msgEvent) { });
+
+ $.ss.handlers["changeChannel"]("home");
+}
\ No newline at end of file
diff --git a/ss-utils/ss-utils.d.ts b/ss-utils/ss-utils.d.ts
new file mode 100644
index 0000000000..99f4325fdf
--- /dev/null
+++ b/ss-utils/ss-utils.d.ts
@@ -0,0 +1,113 @@
+// Type definitions for ServiceStack Utils v0.0.1
+// Project: https://servicestack.net/
+// Definitions by: Demis Bellot
+// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
+
+///
+
+interface JQuery {
+ setFieldError: (name: string, msg: string) => void;
+ serializeMap: () => { [index: string]: any };
+ applyErrors: (status: ResponseStatus, opt?: SSUtilsApplyErrorsOptions) => JQuery;
+ clearErrors: () => JQuery;
+ bindForm: (opt?: SSUtilsApplyErrorsOptions) => JQuery;
+ applyValues: (values: { [index: string]: string }) => JQuery;
+ bindHandlers: (handlers: { [index: string]: Function }) => JQuery;
+ setActiveLinks: () => JQuery;
+ handleServerEvents: (opt?: SSUtilsHandleServerEventsOptions) => void;
+}
+
+interface SSUtilsValidation {
+ overrideMessages: boolean;
+ messages: { [index: string]: string };
+ errorFilter: (errorMsg: string, errorCode: string, type: string) => void;
+}
+
+interface SSUtilsValidationOptional {
+ overrideMessages?: boolean;
+ messages?: { [index: string]: string };
+ errorFilter?: (errorMsg: string, errorCode: string, type: string) => void;
+}
+
+interface SSUtilsApplyErrorsOptions extends SSUtilsValidationOptional {
+}
+
+interface SSUtilsBindFormOptions {
+ validation?: SSUtilsValidationOptional;
+ validate?: (form: HTMLFormElement) => boolean;
+ onSubmitDisable?: string;
+ complete?: (...args: any[]) => void;
+ error?: (...args: any[]) => void;
+}
+
+interface SSUtilsHandleServerEventsOptions {
+ handlers?: { [index: string]: Function };
+ validate?: (op?: string, target?: string, msg?: string, json?: string) => boolean;
+ heartbeatUrl?: string;
+ heartbeatIntervalMs?: number;
+ unRegisterUrl?: string;
+ receivers?: { [index: string]: any };
+ success?: (selector: string, msg: string, e: any) => void;
+}
+
+interface ResponseStatus {
+ errorCode: string;
+ message: string;
+ stackTrace: string;
+ errors: ResponseError[];
+}
+interface ResponseError {
+ errorCode: string;
+ fieldName: string;
+ message: string;
+}
+
+interface SSUtilsStatic {
+ handlers: { [index: string]: Function };
+ onSubmitDisable: string;
+ validation: SSUtilsValidation;
+ clearAdjacentError: () => void;
+ todate: (s: string) => Date;
+ todfmt: (s: string) => string;
+ dfmt: (d: Date) => string;
+ dfmthm: (d: Date) => string;
+ tfmt12: (d: Date) => string;
+ splitOnFirst: (s: string) => string[];
+ splitOnLast: (s: string) => string[];
+ getSelection: () => string;
+ queryString: (url: string) => { [index: string]: string };
+ createUrl: (route: string, args?: any) => string;
+ humanize: (s: string) => string;
+
+ listenOn: string;
+ eventReceivers: any;
+ reconnectServerEvents: (opt: SSUtilsReconnectServerEventsOptions) => any;
+}
+
+interface SSUtilsReconnectServerEventsOptions {
+ url?: string;
+ onerror?: (...args: any[]) => void;
+ onmessage?: (...args: any[]) => void;
+ errorArgs: any[];
+}
+
+interface JQueryStatic {
+ ss: SSUtilsStatic;
+}
+
+interface SSUtilsSSECommand {
+ userId: string;
+ displayName: string;
+ channels: string;
+ profileUrl: string;
+}
+interface SSUtilsSSEHeartbeat extends SSUtilsSSECommand {}
+interface SSUtilsSSEJoin extends SSUtilsSSECommand {}
+interface SSUtilsSSELeave extends SSUtilsSSECommand {}
+interface SSUtilsSSEConnect extends SSUtilsSSECommand {
+ id: string;
+ unRegisterUrl: string;
+ heartbeatUrl: string;
+ heartbeatIntervalMs: number;
+ idleTimeoutMs: number;
+}