@zoom/rivet
Version:
Zoom Rivet is a comprehensive toolkit built to help developers quickly integrate and manage server-side applications within the Zoom ecosystem. This tool currently supports Node.js, offering core functionalities like authentication, API wrappers, and even
1,568 lines (1,551 loc) • 138 kB
TypeScript
import { LambdaFunctionURLResult, LambdaFunctionURLHandler } from 'aws-lambda';
import { AxiosResponse } from 'axios';
import { Server } from 'node:http';
import { ServerOptions } from 'node:https';
import { ReadStream } from 'node:fs';
type AllKeysOf<T> = T extends any ? keyof T : never;
type AllPropsOptional<T, True, False> = Exclude<{
[P in keyof T]: undefined extends T[P] ? True : False;
}[keyof T], undefined> extends True ? True : False;
type Constructor<T> = new (...args: any[]) => T;
type ExactlyOneOf<T extends any[]> = {
[K in keyof T]: T[K] & ProhibitKeys<Exclude<AllKeysOf<T[number]>, keyof T[K]>>;
}[number];
type MaybeArray<T> = T | T[];
type MaybePromise<T> = T | Promise<T>;
type ProhibitKeys<K extends keyof any> = {
[P in K]?: never;
};
type StringIndexed<V = any> = Record<string, V>;
/**
* {@link StateStore} defines methods for generating and verifying OAuth state.
*
* This interface is implemented internally for the default state store; however,
* it can also be implemented and passed to an OAuth client as well.
*/
interface StateStore {
/**
* Generate a new state string, which is directly appended to the OAuth `state` parameter.
*/
generateState(): MaybePromise<string>;
/**
* Verify that the state received during OAuth callback is valid and not forged.
*
* If state verification fails, {@link OAuthStateVerificationFailedError} should be thrown.
*
* @param state The state parameter that was received during OAuth callback
*/
verifyState(state: string): MaybePromise<void>;
}
/**
* Guard if an object implements the {@link StateStore} interface — most notably,
* `generateState()` and `verifyState(state: string)`.
*/
declare const isStateStore: (obj: unknown) => obj is StateStore;
interface TokenStore<Token> {
getLatestToken(): MaybePromise<Token | null | undefined>;
storeToken(token: Token): MaybePromise<void>;
}
interface RivetError<ErrorCode extends string = string> extends Error {
readonly errorCode: ErrorCode;
}
declare const isCoreError: <K extends "ApiResponseError" | "AwsReceiverRequestError" | "ClientCredentialsRawResponseError" | "S2SRawResponseError" | "CommonHttpRequestError" | "ReceiverInconsistentStateError" | "ReceiverOAuthFlowError" | "HTTPReceiverConstructionError" | "HTTPReceiverPortNotNumberError" | "HTTPReceiverRequestError" | "OAuthInstallerNotInitializedError" | "OAuthTokenDoesNotExistError" | "OAuthTokenFetchFailedError" | "OAuthTokenRawResponseError" | "OAuthTokenRefreshFailedError" | "OAuthStateVerificationFailedError" | "ProductClientConstructionError">(obj: unknown, key?: K | undefined) => obj is RivetError<{
readonly ApiResponseError: "zoom_rivet_api_response_error";
readonly AwsReceiverRequestError: "zoom_rivet_aws_receiver_request_error";
readonly ClientCredentialsRawResponseError: "zoom_rivet_client_credentials_raw_response_error";
readonly S2SRawResponseError: "zoom_rivet_s2s_raw_response_error";
readonly CommonHttpRequestError: "zoom_rivet_common_http_request_error";
readonly ReceiverInconsistentStateError: "zoom_rivet_receiver_inconsistent_state_error";
readonly ReceiverOAuthFlowError: "zoom_rivet_receiver_oauth_flow_error";
readonly HTTPReceiverConstructionError: "zoom_rivet_http_receiver_construction_error";
readonly HTTPReceiverPortNotNumberError: "zoom_rivet_http_receiver_port_not_number_error";
readonly HTTPReceiverRequestError: "zoom_rivet_http_receiver_request_error";
readonly OAuthInstallerNotInitializedError: "zoom_rivet_oauth_installer_not_initialized_error";
readonly OAuthTokenDoesNotExistError: "zoom_rivet_oauth_does_not_exist_error";
readonly OAuthTokenFetchFailedError: "zoom_rivet_oauth_token_fetch_failed_error";
readonly OAuthTokenRawResponseError: "zoom_rivet_oauth_token_raw_response_error";
readonly OAuthTokenRefreshFailedError: "zoom_rivet_oauth_token_refresh_failed_error";
readonly OAuthStateVerificationFailedError: "zoom_rivet_oauth_state_verification_failed_error";
readonly ProductClientConstructionError: "zoom_rivet_product_client_construction_error";
}[K]>;
declare const ApiResponseError: Constructor<Error>;
declare const AwsReceiverRequestError: Constructor<Error>;
declare const ClientCredentialsRawResponseError: Constructor<Error>;
declare const S2SRawResponseError: Constructor<Error>;
declare const CommonHttpRequestError: Constructor<Error>;
declare const ReceiverInconsistentStateError: Constructor<Error>;
declare const ReceiverOAuthFlowError: Constructor<Error>;
declare const HTTPReceiverConstructionError: Constructor<Error>;
declare const HTTPReceiverPortNotNumberError: Constructor<Error>;
declare const HTTPReceiverRequestError: Constructor<Error>;
declare const OAuthInstallerNotInitializedError: Constructor<Error>;
declare const OAuthTokenDoesNotExistError: Constructor<Error>;
declare const OAuthTokenFetchFailedError: Constructor<Error>;
declare const OAuthTokenRawResponseError: Constructor<Error>;
declare const OAuthTokenRefreshFailedError: Constructor<Error>;
declare const OAuthStateVerificationFailedError: Constructor<Error>;
declare const ProductClientConstructionError: Constructor<Error>;
declare enum LogLevel {
ERROR = "error",
WARN = "warn",
INFO = "info",
DEBUG = "debug"
}
interface Logger {
/**
* Output debug message
* @param msg any data to be logged
*/
debug(...msg: unknown[]): void;
/**
* Output info message
* @param msg any data to be logged
*/
info(...msg: unknown[]): void;
/**
* Output warn message
* @param msg any data to be logged
*/
warn(...msg: unknown[]): void;
/**
* Output error message
* @param msg any data to be logged
*/
error(...msg: unknown[]): void;
/**
* Disables all logging below the given level
* @param level as a string, 'error' | 'warn' | 'info' | 'debug'
*/
setLevel(level: LogLevel): void;
/**
* Return the current LogLevel.
*/
getLevel(): LogLevel;
/**
* Name the instance so that it can be filtered when many loggers are sending output
* to the same destination.
* @param name as a string
*/
setName(name: string): void;
}
declare class ConsoleLogger implements Logger {
private level;
private name;
private static labels;
private static severity;
constructor();
getLevel(): LogLevel;
setLevel(level: LogLevel): void;
setName(name: string): void;
debug(...msg: unknown[]): void;
info(...msg: unknown[]): void;
warn(...msg: unknown[]): void;
error(...msg: unknown[]): void;
private static isMoreOrEqualSevere;
}
interface AuthOptions<Token> {
clientId: string;
clientSecret: string;
tokenStore?: TokenStore<Token> | undefined;
logger?: Logger;
}
type OAuthGrantType = "authorization_code" | "client_credentials" | "refresh_token" | "account_credentials";
interface BaseOAuthRequest {
grant_type: OAuthGrantType;
}
interface OAuthAuthorizationCodeRequest extends BaseOAuthRequest {
code: string;
grant_type: "authorization_code";
redirect_uri?: string;
}
interface OAuthRefreshTokenRequest extends BaseOAuthRequest {
grant_type: "refresh_token";
refresh_token: string;
}
interface S2SAuthTokenRequest extends BaseOAuthRequest {
grant_type: "account_credentials";
account_id: string;
}
type OAuthRequest = OAuthAuthorizationCodeRequest | OAuthRefreshTokenRequest | S2SAuthTokenRequest;
/**
* {@link Auth} is the base implementation of authentication for Zoom's APIs.
*
* It only requires a `clientId` and `tokenStore`, as these options are shared across
* all authentication implementations, namely OAuth and server-to-server auth (client
* credentials, JWT, and server-to-server OAuth.)
*/
declare abstract class Auth<Token = unknown> {
protected readonly clientId: string;
protected readonly clientSecret: string;
protected readonly tokenStore: TokenStore<Token>;
protected readonly logger: Logger | undefined;
constructor({ clientId, clientSecret, tokenStore, logger }: AuthOptions<Token>);
protected getBasicAuthorization(): string;
abstract getToken(): MaybePromise<string>;
protected isAlmostExpired(isoTime: string): boolean;
protected makeOAuthTokenRequest<T extends OAuthGrantType>(grantType: T, payload?: Omit<Extract<OAuthRequest, {
grant_type: T;
}>, "grant_type">): Promise<AxiosResponse>;
}
interface S2SAuthToken {
accessToken: string;
expirationTimeIso: string;
scopes: string[];
}
interface S2SAuthOptions {
accountId: string;
}
declare class S2SAuth extends Auth<S2SAuthToken> {
private accountId;
constructor({ accountId, ...restOptions }: AuthOptions<S2SAuthToken> & S2SAuthOptions);
private assertRawToken;
private fetchAccessToken;
getToken(): Promise<string>;
private mapAccessToken;
}
interface Event<Type extends string> {
event: Type;
}
type EventKeys<T> = T extends Event<infer U> ? U : never;
type EventPayload<T, K> = Extract<T, {
event: K;
}>;
type EventListenerFn<Events, EventName extends EventKeys<Events>, ReturnType = MaybePromise<void>> = (payload: EventPayload<Events, EventName>) => ReturnType;
type EventListenerPredicateFn<Events, EventName extends EventKeys<Events>> = EventListenerFn<Events, EventName, MaybePromise<boolean>>;
type ContextListener<Events, EventName extends EventKeys<Events>, Context> = (_: EventPayload<Events, EventName> & Context) => MaybePromise<void>;
type GenericEventManager = EventManager<any, any>;
declare class EventManager<Endpoints, Events> {
protected endpoints: Endpoints;
constructor(endpoints: Endpoints);
private appendListener;
filteredEvent<EventName extends EventKeys<Events>>(eventName: EventName, predicate: EventListenerPredicateFn<Events, EventName>, listener: EventListenerFn<Events, EventName>): void;
emit<EventName extends EventKeys<Events>>(eventName: EventName, payload: EventPayload<Events, EventName>): Promise<void>;
event<EventName extends EventKeys<Events>>(eventName: EventName, listener: EventListenerFn<Events, EventName>): void;
protected withContext<EventName extends EventKeys<Events>, Context>(): ContextListener<Events, EventName, Context>;
}
interface HttpReceiverOptions extends Partial<SecureServerOptions> {
endpoints?: MaybeArray<string> | undefined;
port?: number | string | undefined;
webhooksSecretToken: string;
logger?: Logger;
logLevel?: LogLevel;
}
type SecureServerOptions = {
[K in (typeof secureServerOptionKeys)[number]]: ServerOptions[K];
};
declare const secureServerOptionKeys: (keyof ServerOptions)[];
declare class HttpReceiver implements Receiver {
private eventEmitter?;
private interactiveAuth?;
private server?;
private logger;
constructor(options: HttpReceiverOptions);
canInstall(): true;
private getServerCreator;
private hasEndpoint;
private hasSecureOptions;
init({ eventEmitter, interactiveAuth }: ReceiverInitOptions): void;
start(port?: number | string): Promise<Server>;
stop(): Promise<void>;
private writeTemporaryRedirect;
private writeResponse;
}
interface BaseResponse<Data = unknown> {
data?: Data | undefined;
statusCode: number;
trackingId?: string | undefined;
}
interface BuildEndpointOptions<PathSchema> {
method: HttpMethod;
baseUrlOverride?: string | undefined;
urlPathBuilder: (params: PathSchema) => string;
requestMimeType?: RequestMimeType;
}
interface WebEndpointOptions {
auth: Auth;
baseUrl?: string | undefined;
doubleEncodeUrl?: boolean | undefined;
timeout?: number | undefined;
}
type EndpointArguments<PathSchema extends StringIndexed | NoParams, BodySchema extends StringIndexed | NoParams, QuerySchema extends StringIndexed | NoParams> = (PathSchema extends NoParams ? object : AllPropsOptional<PathSchema, "t", "f"> extends "t" ? {
path?: PathSchema;
} : {
path: PathSchema;
}) & (BodySchema extends NoParams ? object : AllPropsOptional<BodySchema, "t", "f"> extends "t" ? {
body?: BodySchema;
} : {
body: BodySchema;
}) & (QuerySchema extends NoParams ? object : AllPropsOptional<QuerySchema, "t", "f"> extends "t" ? {
query?: QuerySchema;
} : {
query: QuerySchema;
});
type HttpMethod = "GET" | "POST" | "PUT" | "PATCH" | "DELETE";
type NoParams = "_NO_PARAMS_";
type RequestMimeType = "application/json" | "multipart/form-data";
declare class WebEndpoints {
constructor(options: WebEndpointOptions);
protected buildEndpoint<PathSchema extends StringIndexed | NoParams, BodySchema extends StringIndexed | NoParams, QuerySchema extends StringIndexed | NoParams, ResponseData = unknown>({ method, baseUrlOverride, urlPathBuilder, requestMimeType }: BuildEndpointOptions<PathSchema>): (_: EndpointArguments<PathSchema, BodySchema, QuerySchema>) => Promise<BaseResponse<ResponseData>>;
private buildUserAgent;
private getHeaders;
private getRequestBody;
private isOk;
private isZoomResponseError;
private makeRequest;
}
type CommonClientOptions<A extends Auth, R extends Receiver> = GetAuthOptions<A> & ExtractInstallerOptions<A, R> & {
disableReceiver?: boolean | undefined;
logger?: Logger | undefined;
logLevel?: LogLevel | undefined;
};
interface ClientReceiverOptions<R extends Receiver> {
receiver: R;
}
type ClientConstructorOptions<A extends Auth, O extends CommonClientOptions<A, R>, R extends Receiver> = IsReceiverDisabled<O> extends true ? O : O & (ClientReceiverOptions<R> | HttpReceiverOptions);
type ExtractInstallerOptions<A extends Auth, R extends Receiver> = A extends InteractiveAuth ? [
ReturnType<R["canInstall"]>
] extends [true] ? WideInstallerOptions : object : object;
type ExtractAuthTokenType<A> = A extends Auth<infer T> ? T : never;
type GenericClientOptions = CommonClientOptions<any, any>;
type GetAuthOptions<A extends Auth> = AuthOptions<ExtractAuthTokenType<A>> & (A extends S2SAuth ? S2SAuthOptions : object);
type IsReceiverDisabled<O extends Pick<GenericClientOptions, "disableReceiver">> = [
O["disableReceiver"]
] extends [true] ? true : false;
type WideInstallerOptions = {
installerOptions: InstallerOptions;
};
declare abstract class ProductClient<AuthType extends Auth, EndpointsType extends WebEndpoints, EventProcessorType extends GenericEventManager, OptionsType extends CommonClientOptions<AuthType, ReceiverType>, ReceiverType extends Receiver> {
private readonly auth;
readonly endpoints: EndpointsType;
readonly webEventConsumer: EventProcessorType;
private readonly receiver?;
constructor(options: ClientConstructorOptions<AuthType, OptionsType, ReceiverType>);
protected abstract initAuth(options: OptionsType): AuthType;
protected abstract initEndpoints(auth: AuthType, options: OptionsType): EndpointsType;
protected abstract initEventProcessor(endpoints: EndpointsType, options: OptionsType): EventProcessorType;
private initDefaultReceiver;
start(this: IsReceiverDisabled<OptionsType> extends true ? never : this): Promise<ReturnType<ReceiverType["start"]>>;
}
interface InstallerOptions {
directInstall?: boolean | undefined;
installPath?: string | undefined;
redirectUri: string;
redirectUriPath?: string | undefined;
stateStore: StateStore | string;
}
/**
* {@link InteractiveAuth}, an extension of {@link Auth}, is designed for use cases where authentication
* is initiated server-side, but requires manual authorization from a user, by redirecting the user to Zoom.
*
* In addition to all required fields from {@link AuthOptions}, this class requires a `redirectUri`, as this
* value is appended to the authorization URL when the user is redirected to Zoom and subsequently redirected
* back to an endpoint on this server.
*
* @see {@link https://developers.zoom.us/docs/integrations/oauth/ | OAuth - Zoom Developers}
*/
declare abstract class InteractiveAuth<Token = unknown> extends Auth<Token> {
installerOptions?: ReturnType<typeof this.setInstallerOptions>;
getAuthorizationUrl(): Promise<string>;
getFullRedirectUri(): string;
setInstallerOptions({ directInstall, installPath, redirectUri, redirectUriPath, stateStore }: InstallerOptions): {
directInstall: boolean;
installPath: string;
redirectUri: string;
redirectUriPath: string;
stateStore: StateStore;
};
}
declare enum StatusCode {
OK = 200,
TEMPORARY_REDIRECT = 302,
BAD_REQUEST = 400,
NOT_FOUND = 404,
METHOD_NOT_ALLOWED = 405,
INTERNAL_SERVER_ERROR = 500
}
interface ReceiverInitOptions {
eventEmitter: GenericEventManager;
interactiveAuth?: InteractiveAuth | undefined;
}
interface Receiver {
canInstall(): true | false;
init(options: ReceiverInitOptions): void;
start(...args: any[]): MaybePromise<unknown>;
stop(...args: any[]): MaybePromise<unknown>;
}
interface AwsLambdaReceiverOptions {
webhooksSecretToken: string;
}
declare class AwsLambdaReceiver implements Receiver {
private eventEmitter?;
private readonly webhooksSecretToken;
constructor({ webhooksSecretToken }: AwsLambdaReceiverOptions);
buildResponse(statusCode: StatusCode, body: object): LambdaFunctionURLResult;
canInstall(): false;
init({ eventEmitter }: ReceiverInitOptions): void;
start(): LambdaFunctionURLHandler;
stop(): Promise<void>;
}
/**
* Credentials for access token & refresh token, which are used to access Zoom's APIs.
*
* As access token is short-lived (usually a single hour), its expiration time is checked
* first. If it's possible to use the access token, it's used; however, if it has expired
* or is close to expiring, the refresh token should be used to generate a new access token
* before the API call is made. Refresh tokens are generally valid for 90 days.
*
* If neither the access token nor the refresh token is available, {@link OAuthTokenRefreshFailedError}
* shall be thrown, informing the developer that neither value can be used, and the user must re-authorize.
* It's likely that this error will be rare, but it _can_ be thrown.
*/
interface OAuthToken {
accessToken: string;
expirationTimeIso: string;
refreshToken: string;
scopes: string[];
}
declare class OAuth extends InteractiveAuth<OAuthToken> {
private assertResponseAccessToken;
private fetchAccessToken;
getToken(): Promise<string>;
initRedirectCode(code: string): Promise<void>;
private mapOAuthToken;
private refreshAccessToken;
}
type ChatChannelsPerformOperationsOnChannelsRequestBody = {
method: "archive" | "unarchive";
channel_ids: string[];
};
type ChatChannelsPerformOperationsOnChannelsResponse = {
failed_channels?: {
channel_id?: string;
reason?: string;
error_code?: string;
}[];
};
type ChatChannelsGetChannelPathParams = {
channelId: string;
};
type ChatChannelsGetChannelResponse = {
channel_settings?: {
add_member_permissions?: 1 | 2;
new_members_can_see_previous_messages_files?: boolean;
posting_permissions?: 1 | 2 | 3;
mention_all_permissions?: 1 | 2 | 3;
allow_to_add_external_users?: 0 | 1 | 2 | 3;
};
id?: string;
jid?: string;
name?: string;
type?: 0 | 1 | 2 | 3 | 4 | 5;
channel_url?: string;
};
type ChatChannelsDeleteChannelPathParams = {
channelId: string;
};
type ChatChannelsUpdateChannelPathParams = {
channelId: string;
};
type ChatChannelsUpdateChannelRequestBody = {
name?: string;
channel_settings?: {
add_member_permissions?: 1 | 2;
new_members_can_see_previous_messages_files?: boolean;
posting_permissions?: 1 | 2 | 3;
mention_all_permissions?: 1 | 2 | 3;
designated_posting_members?: ({
user_id?: string;
} | {
member_id?: string;
})[];
};
type?: 1 | 2 | 3 | 5;
};
type ChatChannelsListChannelMembersPathParams = {
channelId: string;
};
type ChatChannelsListChannelMembersQueryParams = {
next_page_token?: string;
page_size?: number;
};
type ChatChannelsListChannelMembersResponse = {
members?: {
email?: string;
first_name?: string;
id?: string;
member_id?: string;
last_name?: string;
name?: string;
role?: "admin" | "owner" | "member";
is_external?: boolean;
}[];
next_page_token?: string;
page_size?: number;
total_records?: number;
};
type ChatChannelsInviteChannelMembersPathParams = {
channelId: string;
};
type ChatChannelsInviteChannelMembersRequestBody = {
members?: {
email: string;
}[];
};
type ChatChannelsInviteChannelMembersResponse = {
added_at?: string;
ids?: string;
member_ids?: string;
};
type ChatChannelsBatchRemoveMembersFromChannelPathParams = {
channelId: string;
};
type ChatChannelsBatchRemoveMembersFromChannelQueryParams = {
member_ids: string;
user_ids: string;
};
type ChatChannelsListChannelMembersGroupsPathParams = {
channelId: string;
};
type ChatChannelsListChannelMembersGroupsResponse = {
groups: {
group_id: string;
group_name: string;
}[];
channel_id: string;
};
type ChatChannelsInviteChannelMembersGroupsPathParams = {
channelId: string;
};
type ChatChannelsInviteChannelMembersGroupsRequestBody = {
groups?: {
group_id: string;
}[];
};
type ChatChannelsInviteChannelMembersGroupsResponse = {
added_at: string;
groups: {
group_id: string;
group_name: string;
}[];
};
type ChatChannelsRemoveMemberGroupPathParams = {
channelId: string;
groupId: string;
};
type ChatChannelsJoinChannelPathParams = {
channelId: string;
};
type ChatChannelsJoinChannelResponse = {
added_at?: string;
id?: string;
member_id?: string;
};
type ChatChannelsLeaveChannelPathParams = {
channelId: string;
};
type ChatChannelsRemoveMemberPathParams = {
channelId: string;
identifier: string;
};
type ChatChannelsListUsersChannelsPathParams = {
userId: string;
};
type ChatChannelsListUsersChannelsQueryParams = {
page_size?: number;
next_page_token?: string;
};
type ChatChannelsListUsersChannelsResponse = {
channels?: {
channel_settings?: {
add_member_permissions?: 1 | 2;
new_members_can_see_previous_messages_files?: boolean;
posting_permissions?: 1 | 2 | 3;
mention_all_permissions?: 1 | 2 | 3;
allow_to_add_external_users?: 0 | 1 | 2 | 3;
};
id?: string;
jid?: string;
name?: string;
type?: 0 | 1 | 2 | 3 | 4 | 5;
channel_url?: string;
}[];
next_page_token?: string;
page_size?: number;
total_records?: number;
};
type ChatChannelsCreateChannelPathParams = {
userId: string;
};
type ChatChannelsCreateChannelRequestBody = {
channel_settings?: {
add_member_permissions?: 1 | 2;
new_members_can_see_previous_messages_files?: boolean;
posting_permissions?: 1 | 2 | 3;
mention_all_permissions?: 1 | 2 | 3;
};
members?: {
email: string;
}[];
name?: string;
type?: 1 | 2 | 3 | 4;
};
type ChatChannelsCreateChannelResponse = {
id?: string;
jid?: string;
name?: string;
type?: 1 | 2 | 3 | 4;
channel_url?: string;
};
type ChatChannelsAccountLevelBatchDeleteChannelsPathParams = {
userId: string;
};
type ChatChannelsAccountLevelBatchDeleteChannelsQueryParams = {
channel_ids: string;
};
type ChatChannelsAccountLevelListAccountsPublicChannelsQueryParams = {
page_size?: number;
next_page_token?: string;
};
type ChatChannelsAccountLevelListAccountsPublicChannelsResponse = {
channels?: {
channel_settings?: {
add_member_permissions?: 1 | 2;
new_members_can_see_previous_messages_files?: boolean;
posting_permissions?: 1 | 2 | 3;
mention_all_permissions?: 1 | 2 | 3;
allow_to_add_external_users?: 0 | 1 | 2 | 3;
};
id?: string;
jid?: string;
name?: string;
type?: 0 | 1 | 2 | 3 | 4 | 5;
channel_url?: string;
}[];
next_page_token?: string;
page_size?: number;
total_records?: number;
};
type ChatChannelsAccountLevelSearchUsersOrAccountsChannelsRequestBody = {
user_id?: string;
page_size?: number;
next_page_token?: string;
needle: {
search_type: "by_channel_name";
keywords: string[];
} | {
search_type: "by_channel_name_exact_match";
channel_name: string;
};
haystack: "user_joined" | "public" | "all";
};
type ChatChannelsAccountLevelSearchUsersOrAccountsChannelsResponse = {
channels: {
id: string;
name: string;
type: 0 | 1 | 2 | 3 | 4 | 5;
channel_url: string;
total_members: number;
}[];
next_page_token?: string;
page_size: number;
};
type ChatChannelsAccountLevelGetRetentionPolicyOfChannelPathParams = {
channelId: string;
};
type ChatChannelsAccountLevelGetRetentionPolicyOfChannelResponse = {
channel_id: string;
cloud_retention: {
enable_custom_retention: boolean;
retention_period: string;
};
};
type ChatChannelsAccountLevelUpdateRetentionPolicyOfChannelPathParams = {
channelId: string;
};
type ChatChannelsAccountLevelUpdateRetentionPolicyOfChannelRequestBody = {
cloud_retention: {
enable_custom_retention: boolean;
retention_period?: string;
};
};
type ChatChannelsAccountLevelGetChannelPathParams = {
channelId: string;
userId: string;
};
type ChatChannelsAccountLevelGetChannelResponse = {
channel_settings?: {
add_member_permissions?: 1 | 2;
new_members_can_see_previous_messages_files?: boolean;
posting_permissions?: 1 | 2 | 3;
mention_all_permissions?: 1 | 2 | 3;
allow_to_add_external_users?: 0 | 1 | 2 | 3;
};
id?: string;
jid?: string;
name?: string;
type?: 0 | 1 | 2 | 3 | 4 | 5;
channel_url?: string;
};
type ChatChannelsAccountLevelDeleteChannelPathParams = {
channelId: string;
userId: string;
};
type ChatChannelsAccountLevelUpdateChannelPathParams = {
channelId: string;
userId: string;
};
type ChatChannelsAccountLevelUpdateChannelRequestBody = {
name?: string;
channel_settings?: {
add_member_permissions?: 1 | 2;
new_members_can_see_previous_messages_files?: boolean;
posting_permissions?: 1 | 2 | 3;
mention_all_permissions?: 1 | 2 | 3;
designated_posting_members?: ({
user_id?: string;
} | {
member_id?: string;
})[];
};
type?: 1 | 2 | 3 | 5;
};
type ChatChannelsAccountLevelListChannelAdministratorsPathParams = {
userId: string;
channelId: string;
};
type ChatChannelsAccountLevelListChannelAdministratorsQueryParams = {
page_size?: number;
next_page_token?: string;
};
type ChatChannelsAccountLevelListChannelAdministratorsResponse = {
admins?: {
email?: string;
first_name?: string;
id?: string;
member_id?: string;
role?: "admin" | "owner";
last_name?: string;
name?: string;
}[];
next_page_token?: string;
page_size?: number;
};
type ChatChannelsAccountLevelPromoteChannelMembersToAdministratorsPathParams = {
userId: string;
channelId: string;
};
type ChatChannelsAccountLevelPromoteChannelMembersToAdministratorsRequestBody = {
admins?: ({
email: string;
} | {
member_id: string;
})[];
};
type ChatChannelsAccountLevelPromoteChannelMembersToAdministratorsResponse = {
added_at?: string;
ids?: string;
member_ids?: string;
};
type ChatChannelsAccountLevelBatchDemoteChannelAdministratorsPathParams = {
userId: string;
channelId: string;
};
type ChatChannelsAccountLevelBatchDemoteChannelAdministratorsQueryParams = {
admin_ids: string;
user_ids: string;
};
type ChatChannelsAccountLevelListChannelMembersPathParams = {
channelId: string;
userId: string;
};
type ChatChannelsAccountLevelListChannelMembersQueryParams = {
page_size?: number;
next_page_token?: string;
};
type ChatChannelsAccountLevelListChannelMembersResponse = {
members?: {
email?: string;
first_name?: string;
id?: string;
member_id?: string;
last_name?: string;
name?: string;
role?: "admin" | "owner" | "member";
is_external?: boolean;
}[];
next_page_token?: string;
page_size?: number;
total_records?: number;
};
type ChatChannelsAccountLevelInviteChannelMembersPathParams = {
channelId: string;
userId: string;
};
type ChatChannelsAccountLevelInviteChannelMembersRequestBody = {
members?: {
email: string;
}[];
};
type ChatChannelsAccountLevelInviteChannelMembersResponse = {
added_at?: string;
ids?: string;
member_ids?: string;
};
type ChatChannelsAccountLevelRemoveMemberPathParams = {
channelId: string;
identifier: string;
userId: string;
};
type ChatEmojiListCustomEmojisQueryParams = {
page_size?: number;
search_key?: string;
next_page_token?: string;
};
type ChatEmojiListCustomEmojisResponse = {
emojis: {
file_id: string;
name: string;
user_id: string;
member_id: string;
user_name: string;
user_email: string;
date_added: string;
}[];
next_page_token?: string;
page_size: number;
search_key?: string;
};
type ChatEmojiAddCustomEmojiRequestBody = {
name: string;
file: ReadStream;
};
type ChatEmojiAddCustomEmojiResponse = {
file_id: string;
name: string;
};
type ChatEmojiDeleteCustomEmojiPathParams = {
fileId: string;
};
type ChatFilesGetFileInfoPathParams = {
fileId: string;
};
type ChatFilesGetFileInfoResponse = {
file_id: string;
file_name: string;
OS_file_type: string;
length: number;
digest: string;
created_time: number;
modified_time: number;
public_url?: string;
};
type ChatFilesDeleteChatFilePathParams = {
fileId: string;
};
type ChatFilesUploadChatFilePathParams = {
userId: string;
};
type ChatFilesUploadChatFileRequestBody = {
file?: ReadStream;
};
type ChatFilesUploadChatFileResponse = {
id?: string;
};
type ChatFilesSendChatFilePathParams = {
userId: string;
};
type ChatFilesSendChatFileRequestBody = {
files: ReadStream[];
reply_main_message_id?: string;
to_channel?: string;
to_contact?: string;
};
type ChatFilesSendChatFileResponse = {
id?: string;
};
type ChatMessagesPerformOperationsOnMessageOfChannelRequestBody = {
method: "pin" | "unpin";
message_id: string;
channel_id: string;
};
type ChatMessagesListPinnedHistoryMessagesOfChannelPathParams = {
channelId: string;
};
type ChatMessagesListPinnedHistoryMessagesOfChannelQueryParams = {
page_size?: number;
next_page_token?: string;
include_history?: boolean;
};
type ChatMessagesListPinnedHistoryMessagesOfChannelResponse = {
messages: {
message_id: string;
message_timestamp: number;
pinner_user_id: string;
pinner_member_id: string;
pinned_time: string;
currently_pinned: boolean;
message: string;
pinned_by_external_user: boolean;
}[];
next_page_token?: string;
channel_id: string;
page_size?: number;
};
type ChatMessagesListBookmarksQueryParams = {
to_contact?: string;
to_channel?: string;
page_size?: number;
next_page_token?: string;
};
type ChatMessagesListBookmarksResponse = {
next_page_token?: string;
page_size: number;
bookmarks: ({
channel_id: string;
channel_name: string;
message: string;
message_id: string;
message_timestamp: number;
sender_user_id: string;
sender_member_id: string;
sender_display_name: string;
is_sent_by_user: boolean;
reply_main_message_id?: string;
reply_main_message_timestamp?: number;
} | {
peer_contact_name: string;
peer_contact_user_id: string;
peer_contact_member_id: string;
message: string;
message_id: string;
message_timestamp: number;
is_sent_by_user: boolean;
reply_main_message_id?: string;
reply_main_message_timestamp?: number;
})[];
};
type ChatMessagesAddOrRemoveBookmarkQueryParams = {
message_id: string;
};
type ChatMessagesAddOrRemoveBookmarkRequestBody = {
action: "add_bookmark" | "remove_bookmark";
to_channel?: string;
to_contact?: string;
};
type ChatMessagesListScheduledMessagesQueryParams = {
to_contact?: string;
to_channel?: string;
next_page_token?: string;
page_size?: number;
};
type ChatMessagesListScheduledMessagesResponse = {
to_channel?: string;
to_contact?: string;
page_size: number;
next_page_token?: string;
messages: {
draft_id: string;
create_date: string;
scheduled_time: string;
download_url?: string;
file_id?: string;
file_name?: string;
file_size?: number;
rich_text?: {
start_position: number;
end_position: number;
format_type: "Bold" | "Italic" | "Strikethrough" | "BulletedList" | "NumberedList" | "Underline" | "FontSize" | "FontColor" | "BackgroundColor" | "LeftIndent" | "Paragraph" | "Quote" | "AddLink";
format_attr: string;
}[];
files?: {
download_url: string;
file_id: string;
file_name: string;
file_size: number;
}[];
message: string;
reply_main_message_id?: string;
reply_main_message_timestamp?: number;
at_items?: {
at_contact: string;
at_contact_member_id: string;
at_type: 1 | 2;
end_position: number;
start_position: number;
}[];
}[];
};
type ChatMessagesDeleteScheduledMessagePathParams = {
draftId: string;
};
type ChatMessagesDeleteScheduledMessageQueryParams = {
to_contact?: string;
to_channel?: string;
};
type ChatMessagesListUsersChatMessagesPathParams = {
userId: string;
};
type ChatMessagesListUsersChatMessagesQueryParams = {
to_contact?: string;
to_channel?: string;
date?: string;
from?: string;
to?: string;
page_size?: number;
next_page_token?: string;
include_deleted_and_edited_message?: boolean;
search_type?: "message" | "file";
search_key?: string;
exclude_child_message?: boolean;
download_file_formats?: "audio/mp4";
};
type ChatMessagesListUsersChatMessagesResponse = {
date?: string;
from?: string;
messages?: {
bot_message?: object;
date_time?: string;
files?: {
download_url?: string;
file_id?: string;
file_name?: string;
file_size?: number;
}[];
rich_text?: {
start_position?: number;
end_position?: number;
format_type?: "Bold" | "Italic" | "Strikethrough" | "BulletedList" | "NumberedList" | "Underline" | "FontSize" | "FontColor" | "BackgroundColor" | "LeftIndent" | "Paragraph" | "Quote" | "AddLink";
format_attr?: string;
}[];
download_url?: string;
file_id?: string;
file_name?: string;
file_size?: number;
id?: string;
message?: string;
reactions?: {
emoji?: string;
total_count?: number;
senders?: {
user_id?: string;
member_id?: string;
}[];
}[];
reply_main_message_id?: string;
reply_main_message_timestamp?: number;
sender?: string;
sender_member_id?: string;
sender_display_name?: string;
status?: "Deleted" | "Edited" | "Normal";
timestamp?: number;
at_items?: {
at_contact?: string;
at_contact_member_id?: string;
at_type?: 1 | 2;
end_position?: number;
start_position?: number;
}[];
}[];
next_page_token?: string;
page_size?: number;
to?: string;
interactive_cards?: {
card_id?: string;
card_json?: string;
}[];
};
type ChatMessagesSendChatMessagePathParams = {
userId: string;
};
type ChatMessagesSendChatMessageRequestBody = {
at_items?: {
at_contact?: string;
at_type?: 1 | 2;
end_position?: number;
start_position?: number;
}[];
rich_text?: {
start_position?: number;
end_position?: number;
format_type?: "Bold" | "Italic" | "Strikethrough" | "BulletedList" | "NumberedList" | "Underline" | "FontSize" | "FontColor" | "BackgroundColor" | "LeftIndent" | "Paragraph" | "Quote" | "AddLink";
format_attr?: string;
}[];
message: string;
file_ids?: string[];
reply_main_message_id?: string;
to_channel?: string;
to_contact?: string;
interactive_cards?: {
card_json?: string;
}[];
scheduled_time?: string;
};
type ChatMessagesSendChatMessageResponse = {
id?: string;
};
type ChatMessagesGetMessagePathParams = {
userId: string;
messageId: string;
};
type ChatMessagesGetMessageQueryParams = {
to_contact?: string;
to_channel?: string;
download_file_formats?: "audio/mp4";
};
type ChatMessagesGetMessageResponse = {
bot_message?: object;
date_time?: string;
download_url?: string;
file_id?: string;
file_name?: string;
file_size?: number;
rich_text?: {
start_position?: number;
end_position?: number;
format_type?: "Bold" | "Italic" | "Strikethrough" | "BulletedList" | "NumberedList" | "Underline" | "FontSize" | "FontColor" | "BackgroundColor" | "LeftIndent" | "Paragraph" | "Quote" | "AddLink";
format_attr?: string;
}[];
files?: {
download_url?: string;
file_id?: string;
file_name?: string;
file_size?: number;
}[];
id?: string;
message?: string;
reactions?: {
emoji?: string;
total_count?: number;
user_ids?: string[];
member_ids?: string[];
}[];
reply_main_message_id?: string;
reply_main_message_timestamp?: number;
sender?: string;
sender_member_id?: string;
sender_display_name?: string;
timestamp?: number;
message_url?: string;
at_items?: {
at_contact?: string;
at_contact_member_id?: string;
at_type?: 1 | 2;
end_position?: number;
start_position?: number;
}[];
interactive_cards?: {
card_id?: string;
card_json?: string;
}[];
};
type ChatMessagesUpdateMessagePathParams = {
userId: string;
messageId: string;
};
type ChatMessagesUpdateMessageRequestBody = {
message?: string;
to_channel?: string;
to_contact?: string;
file_ids?: string[];
interactive_cards?: ({
card_id?: string;
} | {
card_json?: string;
})[];
};
type ChatMessagesDeleteMessagePathParams = {
userId: string;
messageId: string;
};
type ChatMessagesDeleteMessageQueryParams = {
to_contact?: string;
to_channel?: string;
};
type ChatMessagesReactToChatMessagePathParams = {
userId: string;
messageId: string;
};
type ChatMessagesReactToChatMessageRequestBody = {
action?: "add" | "remove";
emoji?: string;
to_channel?: string;
to_contact?: string;
};
type ChatMessagesMarkMessageReadOrUnreadPathParams = {
userId: string;
messageId: string;
};
type ChatMessagesMarkMessageReadOrUnreadRequestBody = {
action?: "read" | "unread";
timestamp?: number;
to_channel?: string;
to_contact?: string;
};
type ChatMessagesRetrieveThreadPathParams = {
userId: string;
messageId: string;
};
type ChatMessagesRetrieveThreadQueryParams = {
to_channel?: string;
to_contact?: string;
from: string;
to?: string;
limit?: number;
sort?: "desc" | "asc";
need_main_message?: boolean;
need_emoji?: boolean;
need_attachment?: boolean;
};
type ChatMessagesRetrieveThreadResponse = {
total: number;
messages?: {
msg_id: string;
message: string;
is_reply: boolean;
timestamp: number;
reactions?: {
emoji_id?: string;
count?: number;
is_sender?: boolean;
}[];
last_reply_time?: number;
is_followed?: boolean;
files?: {
file_id?: string;
file_name?: string;
file_size?: number;
download_url?: string;
}[];
}[];
};
type ChatMigrationMigrateChannelMembersPathParams = {
channelId: string;
};
type ChatMigrationMigrateChannelMembersRequestBody = {
members: {
identifier: string;
role?: "member" | "admin";
}[];
};
type ChatMigrationMigrateChatMessageReactionsRequestBody = {
reactions: {
message_id: string;
message_timestamp: number;
to_channel?: string;
to_contact?: string;
emojis: {
emoji: string;
user_identifier: string[];
}[];
}[];
};
type ChatMigrationMigrateChatMessagesRequestBody = {
messages: {
message_timestamp: number;
sender: string;
to_channel?: string;
to_contact?: string;
message?: string;
file_ids?: string[];
reply_main_message_id?: string;
reply_main_message_timestamp?: number;
}[];
};
type ChatMigrationMigrateChatMessagesResponse = {
ids?: string[];
};
type ChatMigrationMigrateChatChannelPathParams = {
identifier: string;
};
type ChatMigrationMigrateChatChannelRequestBody = {
members: {
identifier: string;
role?: "admin" | "member";
}[];
type: 2 | 3 | 4;
name: string;
created_time: string;
};
type ChatMigrationMigrateChatChannelResponse = {
channel_id: string;
};
type ChatMigrationMigrateConversationOrChannelOperationsPathParams = {
identifier: string;
};
type ChatMigrationMigrateConversationOrChannelOperationsRequestBody = {
method: "star";
params: {
target_id: string;
target_type: "channel" | "contact";
}[];
};
type ChatReminderCreateReminderMessagePathParams = {
messageId: string;
};
type ChatReminderCreateReminderMessageRequestBody = {
to_contact?: string;
to_channel?: string;
remind_time?: string;
delay_seconds?: number;
reminder_note?: string;
};
type ChatReminderDeleteReminderForMessagePathParams = {
messageId: string;
};
type ChatReminderDeleteReminderForMessageQueryParams = {
to_contact?: string;
to_channel?: string;
};
type ChatReminderListRemindersQueryParams = {
to_contact?: string;
to_channel?: string;
next_page_token?: string;
page_size?: number;
};
type ChatReminderListRemindersResponse = {
next_page_token: string;
reminders: {
reminder_note: string;
content: string;
message_timestamp: number;
create_time: string;
remind_time: string;
message_id: string;
main_message_id?: string;
main_message_timestamp?: number;
}[];
};
type ChatSessionsStarOrUnstarChannelOrContactUserPathParams = {
userId: string;
};
type ChatSessionsStarOrUnstarChannelOrContactUserRequestBody = {
method: "star" | "unstar";
params: {
target_id: string;
target_type: "channel" | "contact";
};
};
type ChatSessionsListUsersChatSessionsPathParams = {
userId: string;
};
type ChatSessionsListUsersChatSessionsQueryParams = {
type?: "1:1" | "groupchat";
search_star?: boolean;
page_size?: number;
next_page_token?: string;
from?: string;
to?: string;
};
type ChatSessionsListUsersChatSessionsResponse = {
from: string;
to: string;
next_page_token: string;
page_size: number;
sessions: {
channel_id?: string;
last_message_sent_time: string;
name: string;
type: string;
peer_contact_email?: string;
peer_contact_user_id?: string;
peer_contact_member_id?: string;
}[];
} | {
next_page_token: string;
page_size: number;
sessions: {
channel_id?: string;
name: string;
type: string;
peer_contact_email?: string;
peer_contact_user_id?: string;
peer_contact_member_id?: string;
}[];
};
type ContactsListUsersContactsQueryParams = {
type?: string;
page_size?: number;
next_page_token?: string;
};
type ContactsListUsersContactsResponse = {
contacts?: {
email?: string;
first_name?: string;
id?: string;
member_id?: string;
last_name?: string;
}[];
next_page_token?: string;
page_size?: number;
};
type ContactsGetUsersContactDetailsPathParams = {
identifier: string;
};
type ContactsGetUsersContactDetailsQueryParams = {
query_presence_status?: boolean;
};
type ContactsGetUsersContactDetailsResponse = {
direct_numbers?: string[];
email?: string;
extension_number?: string;
first_name?: string;
id?: string;
member_id?: string;
last_name?: string;
phone_number?: string;
phone_numbers?: {
code?: string;
country?: string;
label?: "Mobile" | "Office" | "Home" | "Fax";
number?: string;
verified?: boolean;
}[];
presence_status?: "Do_Not_Disturb" | "Away" | "Available" | "Offline" | "In_A_Meeting" | "In_A_Call" | "In_A_Calendar_Event" | "Presenting" | "Out_of_Office" | "Busy";
};
type ContactsSearchCompanyContactsQueryParams = {
search_key: string;
query_presence_status?: boolean;
page_size?: number;
contact_types?: number;
user_status?: "active" | "inactive";
next_page_token?: string;
};
type ContactsSearchCompanyContactsResponse = {
contacts?: {
contact_type?: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8;
dept?: string;
direct_numbers?: string[];
email?: string;
extension_number?: string;
display_name?: string;
first_name?: string;
id?: string;
member_id?: string;
im_group_id?: string;
im_group_name?: string;
job_title?: string;
last_name?: string;
location?: string;
phone_number?: string;
phone_numbers?: {
code?: string;
country?: string;
label?: "Mobile" | "Office" | "Home" | "Fax";
number?: string;
verified?: boolean;
}[];
presence_status?: "Do_Not_Disturb" | "Away" | "Available" | "Offline";
user_status?: "active" | "inactive";
activity?: "Active" | "Inactive" | "Unknown";
sip_phone_number?: string;
sip_uri?: string;
}[];
next_page_token?: string;
page_size?: number;
};
type IMChatSendIMMessagesQueryParams = {
chat_user?: string;
};
type IMChatSendIMMessagesRequestBody = {
message?: string;
};
type IMChatSendIMMessagesResponse = {
id?: string;
};
type IMGroupsListIMDirectoryGroupsResponse = {
total_records?: number;
} & {
groups?: ({
id?: string;
} & ({
name?: string;
total_members?: number;
} & {
search_by_account?: boolean;
search_by_domain?: boolean;
search_by_ma_account?: boolean;
type?: "normal" | "shared" | "restricted";
}))[];
};
type IMGroupsCreateIMDirectoryGroupRequestBody = {
name?: string;
search_by_account?: boolean;
search_by_domain?: boolean;
search_by_ma_account?: boolean;
type?: "normal" | "shared" | "restricted";
};
type IMGroupsRetrieveIMDirectoryGroupPathParams = {
groupId: string;
};
type IMGroupsRetrieveIMDirectoryGroupResponse = {
id?: string;
} & ({
name?: string;
total_members?: number;
} & {
search_by_account?: boolean;
search_by_domain?: boolean;
search_by_ma_account?: boolean;
type?: "normal" | "shared" | "restricted";
});
type IMGroupsDeleteIMDirectoryGroupPathParams = {
groupId: string;
};
type IMGroupsUpdateIMDirectoryGroupPathParams = {
groupId: string;
};
type IMGroupsUpdateIMDirectoryGroupRequestBody = {
name?: string;
search_by_account?: boolean;
search_by_domain?: boolean;
search_by_ma_account?: boolean;
type?: "normal" | "shared" | "restricted";
};
type IMGroupsListIMDirectoryGroupMembersPathParams = {
groupId: string;
};
type IMGroupsListIMDirectoryGroupMembersQueryParams = {
page_size?: number;
page_number?: number;
next_page_token?: string;
};
type IMGroupsListIMDirectoryGroupMembersResponse = {
next_page_token?: string;
page_count?: number;
/***Deprecated.** We will no longer support this field in a future release. Instead, use the `next_page_token` for pagination.*/
page_number?: number;
page_size?: number;
total_records?: number;
} & {
members?: {
email?: string;
first_name?: string;
id?: string;
last_name?: string;
type?: number;
}[];
};
type IMGroupsAddIMDirectoryGroupMembersPathParams = {
groupId: string;
};
type IMGroupsAddIMDirectoryGroupMembersRequestBody = {
members?: {
email?: string;
id?: string;
}[];
};
type IMGroupsDeleteIMDirectoryGroupMemberPathParams = {
groupId: string;
memberId: string;
};
type LegalHoldListLegalHoldMattersQueryParams = {
page_size?: number;
next_page_token?: string;
};
type LegalHoldListLegalHoldMattersResponse = {
legal_hold_matters: {
matter_id: string;
matter_name: string;
matter_start_date?: string;
matter_end_date?: string;
matter_creation_date: strin