diff --git a/ably/ably-tests.ts b/ably/ably-tests.ts
index dbe82bc054..99de6d6578 100644
--- a/ably/ably-tests.ts
+++ b/ably/ably-tests.ts
@@ -1,8 +1,8 @@
-import * as Ably from 'ably';
+///
const ApiKey = 'appId.keyId:secret';
-const client = Ably.Realtime;
-const restClient = Ably.Rest;
+const client = new Realtime(ApiKey);
+const restClient = new Rest(ApiKey);
// Connection
// Successful connection:
@@ -70,8 +70,8 @@ channel.history({ start: Date.now()-10000, end: Date.now(), limit: 100, directio
// Presence on a channel
// Getting presence:
-channel.presence.get(function(err, presenceSet) {
- presenceSet; // array of PresenceMessages
+channel.presence.get(function(presenceSet) {
+ presenceSet; // array of PresenceMessages
});
// Note that presence#get on a realtime channel does not return a PaginatedResult, as the library maintains a local copy of the presence set.
@@ -86,7 +86,7 @@ channel.presence.update('new status', function(err) {
// my presence data is updated
});
-channel.presence.leave(function(err) {
+channel.presence.leave(null, function(err) {
// I've left the presence set
});
@@ -114,7 +114,7 @@ channel.history({ start: Date.now()-10000, end: Date.now(), limit: 100, directio
// Generate a random 256-bit key for demonstration purposes (in
// practice you need to create one and distribute it to clients yourselves)
-Ably.Realtime.Crypto.generateRandomKey(function(err, key) {
+Realtime.Crypto.generateRandomKey(function(err, key) {
var channel = client.channels.get('channelName', { cipher: { key: key } });
channel.subscribe(function(message) {
@@ -123,7 +123,7 @@ Ably.Realtime.Crypto.generateRandomKey(function(err, key) {
});
channel.publish('name is not encrypted', 'sensitive data is encrypted');
-})
+});
// You can also change the key on an existing channel using setOptions (which takes a callback which is called after the new encryption settings have taken effect):
@@ -133,15 +133,15 @@ channel.setOptions({cipher: {key: ''}}, function() {
// Using the REST API
-var channel = restClient.channels.get('test');
+var restChannel = restClient.channels.get('test');
// Publishing to a channel
// Publish a single message with name and data
-channel.publish('greeting', 'Hello World!');
+restChannel.publish('greeting', 'Hello World!');
// Optionally, you can use a callback to be notified of success or failure
-channel.publish('greeting', 'Hello World!', function(err) {
+restChannel.publish('greeting', 'Hello World!', function(err) {
if(err) {
console.log('publish failed with error ' + err);
} else {
@@ -150,11 +150,11 @@ channel.publish('greeting', 'Hello World!', function(err) {
})
// Publish several messages at once
-channel.publish([{name: 'greeting', data: 'Hello World!'}], function() {});
+restChannel.publish([{name: 'greeting', data: 'Hello World!'}], function() {});
// Querying the History
-channel.history(function(err, messagesPage) {
+restChannel.history(function(err, messagesPage) {
messagesPage; // PaginatedResult
messagesPage.items; // array of Message
messagesPage.items[0].data; // payload for first message
@@ -165,11 +165,11 @@ channel.history(function(err, messagesPage) {
});
// Can optionally take an options param, see https://www.ably.io/documentation/rest-api/#message-history
-channel.history({ start: Date.now()-10000, end: Date.now(), limit: 100, direction: 'forwards' }, function(err, messagesPage) {});
+restChannel.history({ start: Date.now()-10000, end: Date.now(), limit: 100, direction: 'forwards' }, function(err, messagesPage) {});
// Presence on a channel
-channel.presence.get(function(err, presencePage) { // PaginatedResult
+restChannel.presence.get(function(err, presencePage) { // PaginatedResult
presencePage.items; // array of PresenceMessage
presencePage.items[0].data; // payload for first message
presencePage.items.length; // number of messages in the current page of members
@@ -180,7 +180,7 @@ channel.presence.get(function(err, presencePage) { // PaginatedResult
// Querying the Presence History
-channel.presence.history(function(err, messagesPage) { // PaginatedResult
+restChannel.presence.history(function(err, messagesPage) { // PaginatedResult
messagesPage.items; // array of PresenceMessage
messagesPage.items[0].data; // payload for first message
messagesPage.items.length; // number of messages in the current page of history
@@ -190,7 +190,7 @@ channel.presence.history(function(err, messagesPage) { // PaginatedResult
});
// Can optionally take an options param, see https://www.ably.io/documentation/rest-api/#message-history
-channel.history({ start: Date.now()-10000, end: Date.now(), limit: 100, direction: 'forwards' }, function(err, messagesPage) {});
+restChannel.history({ start: Date.now()-10000, end: Date.now(), limit: 100, direction: 'forwards' }, function(err, messagesPage) {});
// Generate Token and Token Request
@@ -203,7 +203,7 @@ client.auth.requestToken(function(err, tokenDetails) {
// see https://www.ably.io/documentation/rest/authentication/#token-details for its properties
// Now we have the token, we can send it to someone who can instantiate a client with it:
- var clientUsingToken = new Ably.Realtime(tokenDetails.token);
+ var clientUsingToken = new Realtime(tokenDetails.token);
});
// requestToken can take two optional params
@@ -225,10 +225,10 @@ client.auth.createTokenRequest({}, {}, function(err, tokenRequest) { });
// Fetching your application's stats
-client.stats(function(err, statsPage) { // statsPage as PaginatedResult
+client.stats({ limit: 50 }, function(err, statsPage) { // statsPage as PaginatedResult
statsPage.items; // array of Stats
- statsPage.items[0].data; // payload for first message
- statsPage.items.length; // number of messages in the current page of history
+ statsPage.items[0].inbound.rest.messages.count; // total messages published over REST
+ statsPage.items.length; // number of stats in the current page of history
statsPage.hasNext(); // true if there are further pages
statsPage.isLast(); // true if this page is the last page
statsPage.next(function(nextPage) {}); // retrieves the next page as PaginatedResult
@@ -236,4 +236,4 @@ client.stats(function(err, statsPage) { // statsPage as PaginatedResult
// Fetching the Ably service time
-client.time(function(err, time) {}); // time is in ms since epoch
+client.time({}, function(err, time) {}); // time is in ms since epoch
diff --git a/ably/index.d.ts b/ably/index.d.ts
index e42b65d199..56a6064290 100644
--- a/ably/index.d.ts
+++ b/ably/index.d.ts
@@ -4,61 +4,61 @@
// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
declare namespace ChannelState {
- export type INITIALIZED = 'initialized';
- export type ATTACHING = 'attaching';
- export type ATTACHED = "attached";
- export type DETACHING = "detaching";
- export type DETACHED = "detached";
- export type SUSPENDED = "suspended";
- export type FAILED = "failed";
+ type INITIALIZED = 'initialized';
+ type ATTACHING = 'attaching';
+ type ATTACHED = "attached";
+ type DETACHING = "detaching";
+ type DETACHED = "detached";
+ type SUSPENDED = "suspended";
+ type FAILED = "failed";
}
type ChannelState = ChannelState.FAILED | ChannelState.INITIALIZED | ChannelState.SUSPENDED | ChannelState.ATTACHED | ChannelState.ATTACHING | ChannelState.DETACHED | ChannelState.DETACHING;
declare namespace ConnectionState {
- export type INITIALIZED = "initialized";
- export type CONNECTING = "connecting";
- export type CONNECTED = "connected";
- export type DISCONNECTED = "disconnected";
- export type SUSPENDED = "suspended";
- export type CLOSING = "closing";
- export type CLOSED = "closed";
- export type FAILED = "failed";
+ type INITIALIZED = "initialized";
+ type CONNECTING = "connecting";
+ type CONNECTED = "connected";
+ type DISCONNECTED = "disconnected";
+ type SUSPENDED = "suspended";
+ type CLOSING = "closing";
+ type CLOSED = "closed";
+ type FAILED = "failed";
}
type ConnectionState = ConnectionState.INITIALIZED | ConnectionState.CONNECTED | ConnectionState.CONNECTING | ConnectionState.DISCONNECTED | ConnectionState.SUSPENDED | ConnectionState.CLOSED | ConnectionState.CLOSING | ConnectionState.FAILED;
declare namespace ConnectionEvent {
- export type INITIALIZED = "initialized";
- export type CONNECTING = "connecting";
- export type CONNECTED = "connected";
- export type DISCONNECTED = "disconnected";
- export type SUSPENDED = "suspended";
- export type CLOSING = "closing";
- export type CLOSED = "closed";
- export type FAILED = "failed";
- export type UPDATE = "update";
+ type INITIALIZED = "initialized";
+ type CONNECTING = "connecting";
+ type CONNECTED = "connected";
+ type DISCONNECTED = "disconnected";
+ type SUSPENDED = "suspended";
+ type CLOSING = "closing";
+ type CLOSED = "closed";
+ type FAILED = "failed";
+ type UPDATE = "update";
}
type ConnectionEvent = ConnectionEvent.INITIALIZED | ConnectionEvent.CONNECTED | ConnectionEvent.CONNECTING | ConnectionEvent.DISCONNECTED | ConnectionEvent.SUSPENDED | ConnectionEvent.CLOSED | ConnectionEvent.CLOSING | ConnectionEvent.FAILED | ConnectionEvent.UPDATE;
declare namespace PresenceAction {
- export type ABSENT = "absent";
- export type PRESENT = "present";
- export type ENTER = "enter";
- export type LEAVE = "leave";
- export type UPDATE = "update";
+ type ABSENT = "absent";
+ type PRESENT = "present";
+ type ENTER = "enter";
+ type LEAVE = "leave";
+ type UPDATE = "update";
}
type PresenceAction = PresenceAction.ABSENT | PresenceAction.PRESENT | PresenceAction.ENTER | PresenceAction.LEAVE | PresenceAction.UPDATE;
declare namespace StatsIntervalGranularity {
- export type MINUTE = "minute";
- export type HOUR = "hour";
- export type DAY = "day";
- export type MONTH = "month";
+ type MINUTE = "minute";
+ type HOUR = "hour";
+ type DAY = "day";
+ type MONTH = "month";
}
type StatsIntervalGranularity = StatsIntervalGranularity.MINUTE | StatsIntervalGranularity.HOUR | StatsIntervalGranularity.DAY | StatsIntervalGranularity.MONTH;
declare namespace HTTPMethods {
- export type POST = "POST";
- export type GET = "GET";
+ type POST = "POST";
+ type GET = "GET";
}
type HTTPMethods = HTTPMethods.GET | HTTPMethods.POST;
@@ -262,7 +262,7 @@ declare interface LogInfo {
/**
* A function to handle each line of log output. If handler is not specified, console.log is used.
**/
- handler?: (...args) => void;
+ handler?: (...args: Array) => void;
}
declare interface ChannelEvent {
@@ -284,14 +284,16 @@ declare interface ConnectionStateChange {
}
// Common Listeners
-type PaginatedResultCallback = (error: ErrorInfo, results: PaginatedResult ) => void;
+type paginatedResultCallback = (error: ErrorInfo, results: PaginatedResult ) => void;
type standardCallback = (error: ErrorInfo, results: any) => void;
type messageCallback = (message: T) => void;
type errorCallback = (error: ErrorInfo) => void;
type channelEventCallback = (channelEvent: ChannelEvent, changeStateChange: ChannelStateChange) => void;
type connectionEventCallback = (connectionEvent: ConnectionEvent, connectionStateChange: ConnectionStateChange) => void;
type timeCallback = (error: ErrorInfo, time: number) => void;
-
+type realtimePresenceGetCallback = (error: ErrorInfo, messages: Array) => void;
+type tokenDetailsCallback = (error: ErrorInfo, Results: TokenDetails) => void
+type tokenRequestCallback = (error: ErrorInfo, Results: TokenRequest) => void
// Internal Classes
declare class EventEmitter {
@@ -301,58 +303,59 @@ declare class EventEmitter {
}
// Classes
-export declare class Auth {
+declare class Auth {
clientId: string;
- authorize: (tokenParams?: TokenParams, authOptions?: AuthOptions, callback?: (error: ErrorInfo, Results: TokenDetails) => void) => void;
- createTokenRequest: (tokenParams?: TokenParams, authOptions?: AuthOptions, callback?: (error: ErrorInfo, Results: TokenRequest) => void) => void;
- requestToken: (TokenParams?: TokenParams, authOptions?: AuthOptions, callback?: (error: ErrorInfo, Results: TokenDetails) => void) => void;
+ authorize: (tokenParams?: TokenParams | tokenDetailsCallback, authOptions?: AuthOptions | tokenDetailsCallback, callback?: tokenDetailsCallback) => void;
+ createTokenRequest: (tokenParams?: TokenParams | tokenRequestCallback, authOptions?: AuthOptions | tokenRequestCallback, callback?: tokenRequestCallback) => void;
+ requestToken: (TokenParams?: TokenParams | tokenDetailsCallback, authOptions?: AuthOptions | tokenDetailsCallback, callback?: tokenDetailsCallback) => void;
}
-export declare class Presence {
- get: (params: RestPresenceParams, callback: PaginatedResultCallback) => void;
- history: (params: RestPresenceHistoryParams, callback: PaginatedResultCallback) => void;
+declare class Presence {
+ get: (params: RestPresenceParams | paginatedResultCallback, callback?: paginatedResultCallback) => void;
+ history: (params: RestPresenceHistoryParams | paginatedResultCallback, callback?: paginatedResultCallback) => void;
}
-export declare class RealtimePresence {
+declare class RealtimePresence {
syncComplete: () => boolean;
- get: (Params: RealtimePresenceParams, callback?: (error: ErrorInfo, messages: Array) => void) => void;
- history: (ParamsOrCallback: RealtimePresenceHistoryParams | PaginatedResultCallback, callback?: PaginatedResultCallback) => void;
+ get: (Params: realtimePresenceGetCallback | RealtimePresenceParams, callback?: realtimePresenceGetCallback) => void;
+ history: (ParamsOrCallback: RealtimePresenceHistoryParams | paginatedResultCallback, callback?: paginatedResultCallback) => void;
subscribe: (presenceOrCallback: PresenceAction | messageCallback, listener?: messageCallback) => void;
unsubscribe: (presence?: PresenceAction, listener?: messageCallback) => void;
- enter: (data: any, callback?: errorCallback) => void;
- update: (data: any, callback?: errorCallback) => void;
- leave: (data: any, callback?: errorCallback) => void;
- enterClient: (clientId: string, data: any, callback?: errorCallback) => void;
- updateClient: (clientId: string, data: any, callback?: errorCallback) => void;
- leaveClient: (clientId: string, data: any, callback?: errorCallback) => void;
+ enter: (data?: errorCallback | any, callback?: errorCallback) => void;
+ update: (data?: errorCallback | any, callback?: errorCallback) => void;
+ leave: (data?: errorCallback | any, callback?: errorCallback) => void;
+ enterClient: (clientId: string, data?: errorCallback | any, callback?: errorCallback) => void;
+ updateClient: (clientId: string, data?: errorCallback | any, callback?: errorCallback) => void;
+ leaveClient: (clientId: string, data?: errorCallback | any, callback?: errorCallback) => void;
}
-export declare class Channel {
+declare class Channel {
name: string;
presence: Presence;
- history: (paramsOrCallback?: RestPresenceHistoryParams | PaginatedResultCallback, callback?: PaginatedResultCallback) => void;
+ history: (paramsOrCallback?: RestPresenceHistoryParams | paginatedResultCallback, callback?: paginatedResultCallback) => void;
publish: (messagesOrName: any, messagedataOrCallback?: errorCallback | any, callback?: errorCallback) => void;
}
-export declare class RealtimeChannel extends EventEmitter {
+declare class RealtimeChannel extends EventEmitter {
name: string;
errorReason: ErrorInfo;
state: ChannelState;
presence: RealtimePresence;
attach: (callback?: standardCallback) => void;
detach:(callback?: standardCallback) => void;
- history: (paramsOrCallback?: RealtimePresenceHistoryParams | PaginatedResultCallback, callback?: PaginatedResultCallback) => void;
+ history: (paramsOrCallback?: RealtimePresenceHistoryParams | paginatedResultCallback, callback?: paginatedResultCallback) => void;
subscribe: (eventOrCallback: messageCallback | string, listener?: messageCallback) => void;
unsubscribe: (eventOrCallback?: messageCallback | string, listener?: messageCallback) => void;
publish: (messagesOrName: any, messageDataOrCallback?: errorCallback | any, callback?: errorCallback) => void;
+ setOptions: (options: Object, callback?: errorCallback) => void;
}
-export declare class Channels {
+declare class Channels {
get: (name: string, channelOptions?: ChannelOptions) => T;
release: (name: string) => void;
}
-export declare class Message {
+declare class Message {
constructor();
fromEncoded: (JsonObject: string, channelOptions: ChannelOptions) => Message;
fromEncodedArray: (JsonArray: string, channelOptions: ChannelOptions) => Array;
@@ -366,7 +369,7 @@ export declare class Message {
timestamp: number;
}
-export declare class PresenceMessage {
+declare class PresenceMessage {
fromEncoded: (JsonObject: any, channelOptions?: ChannelOptions) => PresenceMessage;
fromEncodedArray: (JsonArray: Array, channelOptions?: ChannelOptions) => Array;
action: PresenceAction;
@@ -378,29 +381,35 @@ export declare class PresenceMessage {
timestamp: number;
}
-export declare class Rest {
+declare interface Crypto {
+ generateRandomKey: (callback: (error: ErrorInfo, key: string) => void) => void;
+}
+
+declare class Rest {
constructor(options: ClientOptions | string);
+ static Crypto: Crypto;
auth: Auth;
channels: Channels;
request: (method: string, path: string, params?: any, body?: Array | any, headers?: any, callback?: (error: ErrorInfo, response: HttpPaginatedResponse) => void) => void;
- stats: (paramsOrCallback?: PaginatedResultCallback | any, callback?: PaginatedResultCallback) => void;
- time: (paramsOrCallback?: timeCallback | any, callback?: timeCallback) => void;
+ stats: (paramsOrCallback?: paginatedResultCallback | any, callback?: paginatedResultCallback) => void;
+ time: (paramsOrCallback?: timeCallback | Object, callback?: timeCallback) => void;
}
-export declare class Realtime {
+declare class Realtime {
constructor(options: ClientOptions | string);
+ static Crypto: Crypto;
auth: Auth;
channels: Channels;
clientId: string;
connection: Connection;
request: (method: string, path: string, params?: any, body?: Array | any, headers?: any, callback?: (error: ErrorInfo, response: HttpPaginatedResponse) => void) => void;
- stats: (paramsOrCallback?: PaginatedResultCallback | any, callback?: PaginatedResultCallback) => void;
+ stats: (paramsOrCallback?: paginatedResultCallback | any, callback?: paginatedResultCallback) => void;
close: () => void;
connect: () => void;
time: (paramsOrCallback?: timeCallback | any, callback?: timeCallback) => void;
}
-export declare class Connection extends EventEmitter {
+declare class Connection extends EventEmitter {
errorReason: ErrorInfo;
id: string;
key: string;
@@ -412,7 +421,7 @@ export declare class Connection extends EventEmitter {
ping: (callback?: (error: ErrorInfo, responseTime: number ) => void ) => void;
}
-export declare class Stats {
+declare class Stats {
all: StatsMessageTypes;
apiRequests: StatsRequestCount;
channels: StatsResourceCount;
@@ -424,16 +433,16 @@ export declare class Stats {
tokenRequests: StatsRequestCount;
}
-export declare class PaginatedResult {
+declare class PaginatedResult {
items: Array;
- first: (results: PaginatedResultCallback) => void;
- next: (results: PaginatedResultCallback) => void;
- current: (results: PaginatedResultCallback) => void;
+ first: (results: paginatedResultCallback) => void;
+ next: (results: paginatedResultCallback) => void;
+ current: (results: paginatedResultCallback) => void;
hasNext: () => boolean;
isLast: () => boolean;
}
-export declare class HttpPaginatedResponse extends PaginatedResult {
+declare class HttpPaginatedResponse extends PaginatedResult {
items: Array;
statusCode: number;
success: boolean;
diff --git a/ably/tslint.json b/ably/tslint.json
new file mode 100644
index 0000000000..377cc837d4
--- /dev/null
+++ b/ably/tslint.json
@@ -0,0 +1 @@
+{ "extends": "../tslint.json" }