@slack/client
Advanced tools
Comparing version 4.2.2 to 4.3.0
@@ -8,2 +8,2 @@ export { LoggingFunc, LogLevel } from './logger'; | ||
export { RTMClient, RTMClientOptions, RTMCallResult, RTMPlatformError, RTMWebsocketError, RTMCallError, RTMCallResultCallback } from './RTMClient'; | ||
export { IncomingWebhook, IncomingWebhookSendArguments, IncomingWebhookDefaultArguments, IncomingWebhookResultCallback } from './IncomingWebhook'; | ||
export { IncomingWebhook, IncomingWebhookSendArguments, IncomingWebhookDefaultArguments, IncomingWebhookResult, IncomingWebhookResultCallback } from './IncomingWebhook'; |
@@ -121,2 +121,4 @@ /// <reference types="node" /> | ||
}; | ||
export declare type AppsPermissionsResourcesListArguments = TokenOverridable & CursorPaginationEnabled; | ||
export declare type AppsPermissionsScopesListArguments = TokenOverridable & {}; | ||
export declare type AuthRevokeArguments = TokenOverridable & { | ||
@@ -123,0 +125,0 @@ test: boolean; |
@@ -109,3 +109,3 @@ /// <reference types="node" /> | ||
*/ | ||
start(options: methods.RTMStartArguments | methods.RTMConnectArguments): void; | ||
start(options?: methods.RTMStartArguments | methods.RTMConnectArguments): void; | ||
/** | ||
@@ -112,0 +112,0 @@ * End an RTM session. After this method is called no messages will be sent or received unless you call |
@@ -98,26 +98,3 @@ "use strict"; | ||
.on('websocket open').transitionTo('handshaking') | ||
.on('websocket close') | ||
.transitionTo('reconnecting').withCondition(() => this.autoReconnect) | ||
.transitionTo('disconnected').withAction(() => { | ||
// this transition circumvents the 'disconnecting' state (since the websocket is already closed), so we | ||
// need to execute its onExit behavior here. | ||
this.teardownWebsocket(); | ||
}) | ||
.state('handshaking') // a state in which to wait until the 'server hello' event | ||
.on('websocket close') | ||
.transitionTo('reconnecting').withCondition(() => this.autoReconnect) | ||
.withAction((_from, _to, context) => { | ||
this.logger.debug(`reconnecting after unexpected close ${context.eventPayload.reason} ` + | ||
`${context.eventPayload.code} with isMonitoring set to ${this.keepAlive.isMonitoring} ` + | ||
`and recommendReconnect set to ${this.keepAlive.recommendReconnect}`); | ||
}) | ||
.transitionTo('disconnected') | ||
.withAction((_from, _to, context) => { | ||
this.logger.debug(`disconnected after unexpected close ${context.eventPayload.reason} ` + | ||
`${context.eventPayload.code} with isMonitoring set to ${this.keepAlive.isMonitoring} ` + | ||
`and recommendReconnect set to ${this.keepAlive.recommendReconnect}`); | ||
// this transition circumvents the 'disconnecting' state (since the websocket is already closed), | ||
// so we need to execute its onExit behavior here. | ||
this.teardownWebsocket(); | ||
}) | ||
.global() | ||
@@ -129,2 +106,9 @@ .onStateEnter((state) => { | ||
.on('server hello').transitionTo('connected') | ||
.on('websocket close') | ||
.transitionTo('reconnecting').withCondition(() => this.autoReconnect) | ||
.transitionTo('disconnected').withAction(() => { | ||
// this transition circumvents the 'disconnecting' state (since the websocket is already closed), so we need | ||
// to execute its onExit behavior here. | ||
this.teardownWebsocket(); | ||
}) | ||
.on('failure').transitionTo('disconnected') | ||
@@ -131,0 +115,0 @@ .state('connected') |
@@ -78,2 +78,8 @@ import EventEmitter = require('eventemitter3'); | ||
request: Method<methods.AppsPermissionsRequestArguments>; | ||
resources: { | ||
list: Method<methods.AppsPermissionsResourcesListArguments>; | ||
}; | ||
scopes: { | ||
list: Method<methods.TokenOverridable>; | ||
}; | ||
}; | ||
@@ -213,3 +219,3 @@ }; | ||
history: Method<methods.IMHistoryArguments>; | ||
list: Method<methods.IMListArguments>; | ||
list: Method<methods.AppsPermissionsResourcesListArguments>; | ||
mark: Method<methods.IMMarkArguments>; | ||
@@ -350,3 +356,3 @@ open: Method<methods.IMOpenArguments>; | ||
* HTTP headers into the object. | ||
* @param response | ||
* @param response - an http response | ||
*/ | ||
@@ -353,0 +359,0 @@ private buildResult(response); |
@@ -52,2 +52,8 @@ "use strict"; | ||
request: (this.apiCall.bind(this, 'apps.permissions.request')), | ||
resources: { | ||
list: (this.apiCall.bind(this, 'apps.permissions.resources.list')), | ||
}, | ||
scopes: { | ||
list: (this.apiCall.bind(this, 'apps.permissions.scopes.list')), | ||
}, | ||
}, | ||
@@ -352,2 +358,15 @@ }; | ||
}, this.tlsConfig)) | ||
.then((response) => { | ||
const result = this.buildResult(response); | ||
// log warnings in response metadata | ||
if (result.response_metadata !== undefined && result.response_metadata.warnings !== undefined) { | ||
result.response_metadata.warnings.forEach(this.logger.warn); | ||
} | ||
if (!result.ok) { | ||
const error = errors_1.errorWithCode(new Error(`An API error occurred: ${result.error}`), errors_1.ErrorCode.PlatformError); | ||
error.data = result; | ||
throw new pRetry.AbortError(error); | ||
} | ||
return result; | ||
}) | ||
.catch((error) => { | ||
@@ -362,2 +381,11 @@ // Wrap errors in this packages own error types (abstract the implementation details' types) | ||
else if (error.name === 'HTTPError') { | ||
// Special case: retry if 429; | ||
if (error.statusCode === 429) { | ||
const result = this.buildResult(error.response); | ||
const retryAfterMs = result.retryAfter !== undefined ? result.retryAfter : (60 * 1000); | ||
this.emit('rate_limited', retryAfterMs / 1000); | ||
this.logger.info(`API Call failed due to rate limiting. Will retry in ${retryAfterMs / 1000} seconds.`); | ||
// wait and return the result from calling `task` again after the specified number of seconds | ||
return delay(retryAfterMs).then(task); | ||
} | ||
throw httpErrorWithOriginal(error); | ||
@@ -368,25 +396,2 @@ } | ||
} | ||
}) | ||
.then((response) => { | ||
const result = this.buildResult(response); | ||
// log warnings in response metadata | ||
if (result.response_metadata !== undefined && result.response_metadata.warnings !== undefined) { | ||
result.response_metadata.warnings.forEach(this.logger.warn); | ||
} | ||
// handle rate-limiting | ||
if (response.statusCode !== undefined && response.statusCode === 429) { | ||
const retryAfterMs = result.retryAfter !== undefined ? result.retryAfter : (60 * 1000); | ||
// NOTE: the following event could have more information regarding the api call that is being delayed | ||
this.emit('rate_limited', retryAfterMs / 1000); | ||
this.logger.info(`API Call failed due to rate limiting. Will retry in ${retryAfterMs / 1000} seconds.`); | ||
// wait and return the result from calling `task` again after the specified number of seconds | ||
return delay(retryAfterMs).then(task); | ||
} | ||
// For any error in the API response, treat them as irrecoverable by throwing an AbortError to end retries. | ||
if (!result.ok) { | ||
const error = errors_1.errorWithCode(new Error(`An API error occurred: ${result.error}`), errors_1.ErrorCode.PlatformError); | ||
error.data = result; | ||
throw new pRetry.AbortError(error); | ||
} | ||
return result; | ||
}); | ||
@@ -474,3 +479,3 @@ }; | ||
* HTTP headers into the object. | ||
* @param response | ||
* @param response - an http response | ||
*/ | ||
@@ -514,3 +519,3 @@ buildResult(response) { | ||
* A factory to create WebAPIRequestError objects | ||
* @param original | ||
* @param original - original error | ||
*/ | ||
@@ -526,3 +531,3 @@ function requestErrorWithOriginal(original) { | ||
* A factory to create WebAPIReadError objects | ||
* @param original | ||
* @param original - original error | ||
*/ | ||
@@ -538,3 +543,3 @@ function readErrorWithOriginal(original) { | ||
* A factory to create WebAPIHTTPError objects | ||
* @param original | ||
* @param original - original error | ||
*/ | ||
@@ -541,0 +546,0 @@ function httpErrorWithOriginal(original) { |
{ | ||
"name": "@slack/client", | ||
"version": "4.2.2", | ||
"version": "4.3.0", | ||
"description": "Slack Developer Kit - official clients for the Web API, RTM API, and Incoming Webhooks", | ||
@@ -5,0 +5,0 @@ "author": "Slack Technologies, Inc.", |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
180867
3161