/** * PubNub Objects API module. */ import { GetAllChannelsMetadataRequest } from './endpoints/objects/channel/get_all'; import { RemoveChannelMetadataRequest } from './endpoints/objects/channel/remove'; import { GetUUIDMembershipsRequest } from './endpoints/objects/membership/get'; import { SetUUIDMembershipsRequest } from './endpoints/objects/membership/set'; import { GetAllUUIDMetadataRequest } from './endpoints/objects/uuid/get_all'; import { GetChannelMetadataRequest } from './endpoints/objects/channel/get'; import { SetChannelMetadataRequest } from './endpoints/objects/channel/set'; import { RemoveUUIDMetadataRequest } from './endpoints/objects/uuid/remove'; import { GetChannelMembersRequest } from './endpoints/objects/member/get'; import { SetChannelMembersRequest } from './endpoints/objects/member/set'; import { KeySet, ResultCallback, SendRequestFunction } from './types/api'; import { GetUUIDMetadataRequest } from './endpoints/objects/uuid/get'; import { PrivateClientConfiguration } from './interfaces/configuration'; import * as AppContext from './types/api/app-context'; import { ChannelMetadataObject } from './types/api/app-context'; import { SetUUIDMetadataRequest } from './endpoints/objects/uuid/set'; import { LoggerManager } from './components/logger-manager'; /** * PubNub App Context API interface. */ export default class PubNubObjects { /** * Extended PubNub client configuration object. * * @internal */ private readonly configuration: PrivateClientConfiguration; /* eslint-disable @typescript-eslint/no-explicit-any */ /** * Function which should be used to send REST API calls. * * @internal */ private readonly sendRequest: SendRequestFunction; /** * REST API endpoints access credentials. * * @internal */ private readonly keySet: KeySet; /** * Create app context API access object. * * @param configuration - Extended PubNub client configuration object. * @param sendRequest - Function which should be used to send REST API calls. * * @internal */ constructor( configuration: PrivateClientConfiguration, /* eslint-disable @typescript-eslint/no-explicit-any */ sendRequest: SendRequestFunction, ) { this.keySet = configuration.keySet; this.configuration = configuration; this.sendRequest = sendRequest; } /** * Get registered loggers' manager. * * @returns Registered loggers' manager. * * @internal */ get logger(): LoggerManager { return this.configuration.logger(); } // -------------------------------------------------------- // ----------------------- UUID API ----------------------- // -------------------------------------------------------- // region UUID API // region Get Metadata /** * Fetch a paginated list of UUID Metadata objects. * * @param callback - Request completion handler callback. */ public getAllUUIDMetadata( callback: ResultCallback>, ): void; /** * Fetch a paginated list of UUID Metadata objects. * * @param parameters - Request configuration parameters. * @param callback - Request completion handler callback. */ public getAllUUIDMetadata( parameters: AppContext.GetAllMetadataParameters>, callback: ResultCallback>, ): void; /** * Fetch a paginated list of UUID Metadata objects. * * @param [parameters] - Request configuration parameters. * * @returns Asynchronous get all UUID metadata response. */ public async getAllUUIDMetadata( parameters?: AppContext.GetAllMetadataParameters>, ): Promise>; /** * Fetch a paginated list of UUID Metadata objects. * * @param [parametersOrCallback] - Request configuration parameters or callback from overload. * @param [callback] - Request completion handler callback. * * @returns Asynchronous get all UUID metadata response or `void` in case if `callback` provided. */ async getAllUUIDMetadata( parametersOrCallback?: | AppContext.GetAllMetadataParameters> | ResultCallback>, callback?: ResultCallback>, ): Promise | void> { this.logger.debug('PubNub', () => ({ messageType: 'object', message: !parametersOrCallback || typeof parametersOrCallback === 'function' ? {} : parametersOrCallback, details: `Get all UUID metadata objects with parameters:`, })); return this._getAllUUIDMetadata(parametersOrCallback, callback); } /** * Fetch a paginated list of UUID Metadata objects. * * @param [parametersOrCallback] - Request configuration parameters or callback from overload. * @param [callback] - Request completion handler callback. * * @returns Asynchronous get all UUID metadata response or `void` in case if `callback` provided. * * @internal */ async _getAllUUIDMetadata( parametersOrCallback?: | AppContext.GetAllMetadataParameters> | ResultCallback>, callback?: ResultCallback>, ): Promise | void> { // Get user request parameters. const parameters: AppContext.GetAllMetadataParameters> = parametersOrCallback && typeof parametersOrCallback !== 'function' ? parametersOrCallback : {}; callback ??= typeof parametersOrCallback === 'function' ? parametersOrCallback : undefined; const request = new GetAllUUIDMetadataRequest({ ...parameters, keySet: this.keySet }); const logResponse = (response: AppContext.GetAllUUIDMetadataResponse | null) => { if (!response) return; this.logger.debug( 'PubNub', `Get all UUID metadata success. Received ${response.totalCount} UUID metadata objects.`, ); }; if (callback) return this.sendRequest(request, (status, response) => { logResponse(response); callback(status, response); }); return this.sendRequest(request).then((response) => { logResponse(response); return response; }); } /** * Fetch a UUID Metadata object for the currently configured PubNub client `uuid`. * * @param callback - Request completion handler callback. */ public getUUIDMetadata( callback: ResultCallback>, ): void; /** * Fetch a specific UUID Metadata object. * * @param parameters - Request configuration parameters. Will fetch a UUID metadata object for * a currently configured PubNub client `uuid` if not set. * @param callback - Request completion handler callback. */ public getUUIDMetadata( parameters: AppContext.GetUUIDMetadataParameters, callback: ResultCallback>, ): void; /** * Fetch a specific UUID Metadata object. * * @param [parameters] - Request configuration parameters. Will fetch UUID Metadata object for * currently configured PubNub client `uuid` if not set. * * @returns Asynchronous get UUID metadata response. */ public async getUUIDMetadata( parameters?: AppContext.GetUUIDMetadataParameters, ): Promise>; /** * Fetch a specific UUID Metadata object. * * @param [parametersOrCallback] - Request configuration parameters or callback from overload. * @param [callback] - Request completion handler callback. * * @returns Asynchronous get UUID metadata response or `void` in case if `callback` provided. */ async getUUIDMetadata( parametersOrCallback?: | AppContext.GetUUIDMetadataParameters | ResultCallback>, callback?: ResultCallback>, ): Promise | void> { this.logger.debug('PubNub', () => ({ messageType: 'object', message: !parametersOrCallback || typeof parametersOrCallback === 'function' ? { uuid: this.configuration.userId } : parametersOrCallback, details: `Get ${ !parametersOrCallback || typeof parametersOrCallback === 'function' ? ' current' : '' } UUID metadata object with parameters:`, })); return this._getUUIDMetadata(parametersOrCallback, callback); } /** * Fetch a specific UUID Metadata object. * * @param [parametersOrCallback] - Request configuration parameters or callback from overload. * @param [callback] - Request completion handler callback. * * @returns Asynchronous get UUID metadata response or `void` in case if `callback` provided. * * @internal */ async _getUUIDMetadata( parametersOrCallback?: | AppContext.GetUUIDMetadataParameters | ResultCallback>, callback?: ResultCallback>, ): Promise | void> { // Get user request parameters. const parameters: AppContext.GetUUIDMetadataParameters = parametersOrCallback && typeof parametersOrCallback !== 'function' ? parametersOrCallback : {}; callback ??= typeof parametersOrCallback === 'function' ? parametersOrCallback : undefined; if (parameters.userId) { this.logger.warn('PubNub', `'userId' parameter is deprecated. Use 'uuid' instead.`); parameters.uuid = parameters.userId; } parameters.uuid ??= this.configuration.userId; const request = new GetUUIDMetadataRequest({ ...parameters, keySet: this.keySet }); const logResponse = (response: AppContext.GetUUIDMetadataResponse | null) => { if (!response) return; this.logger.debug( 'PubNub', `Get UUID metadata object success. Received '${parameters.uuid}' UUID metadata object.`, ); }; if (callback) return this.sendRequest(request, (status, response) => { logResponse(response); callback(status, response); }); return this.sendRequest(request).then((response) => { logResponse(response); return response; }); } // endregion // region Set Metadata /** * Update a specific UUID Metadata object. * * @param parameters - Request configuration parameters. Will set UUID metadata for a currently * configured PubNub client `uuid` if not set. * @param callback - Request completion handler callback. */ public setUUIDMetadata( parameters: AppContext.SetUUIDMetadataParameters, callback: ResultCallback>, ): void; /** * Update specific UUID Metadata object. * * @param parameters - Request configuration parameters. Will set UUID metadata for currently * configured PubNub client `uuid` if not set. * * @returns Asynchronous set UUID metadata response. */ public async setUUIDMetadata( parameters: AppContext.SetUUIDMetadataParameters, ): Promise>; /** * Update a specific UUID Metadata object. * * @param parameters - Request configuration parameters. Will set UUID metadata for currently * configured PubNub client `uuid` if not set. * @param [callback] - Request completion handler callback. * * @returns Asynchronous set UUID metadata response or `void` in case if `callback` provided. */ async setUUIDMetadata( parameters: AppContext.SetUUIDMetadataParameters, callback?: ResultCallback>, ): Promise | void> { this.logger.debug('PubNub', () => ({ messageType: 'object', message: { ...parameters }, details: `Set UUID metadata object with parameters:`, })); return this._setUUIDMetadata(parameters, callback); } /** * Update a specific UUID Metadata object. * * @internal * * @param parameters - Request configuration parameters. Will set UUID metadata for currently * configured PubNub client `uuid` if not set. * @param [callback] - Request completion handler callback. * * @returns Asynchronous set UUID metadata response or `void` in case if `callback` provided. */ async _setUUIDMetadata( parameters: AppContext.SetUUIDMetadataParameters, callback?: ResultCallback>, ): Promise | void> { if (parameters.userId) { this.logger.warn('PubNub', `'userId' parameter is deprecated. Use 'uuid' instead.`); parameters.uuid = parameters.userId; } parameters.uuid ??= this.configuration.userId; const request = new SetUUIDMetadataRequest({ ...parameters, keySet: this.keySet }); const logResponse = (response: AppContext.SetUUIDMetadataResponse | null) => { if (!response) return; this.logger.debug( 'PubNub', `Set UUID metadata object success. Updated '${parameters.uuid}' UUID metadata object.`, ); }; if (callback) return this.sendRequest(request, (status, response) => { logResponse(response); callback(status, response); }); return this.sendRequest(request).then((response) => { logResponse(response); return response; }); } // endregion // region Remove Metadata /** * Remove a UUID Metadata object for currently configured PubNub client `uuid`. * * @param callback - Request completion handler callback. */ public removeUUIDMetadata(callback: ResultCallback): void; /** * Remove a specific UUID Metadata object. * * @param parameters - Request configuration parameters. Will remove UUID metadata for currently * configured PubNub client `uuid` if not set. * @param callback - Request completion handler callback. */ public removeUUIDMetadata( parameters: AppContext.RemoveUUIDMetadataParameters, callback: ResultCallback, ): void; /** * Remove a specific UUID Metadata object. * * @param [parameters] - Request configuration parameters. Will remove UUID metadata for currently * configured PubNub client `uuid` if not set. * * @returns Asynchronous UUID metadata remove response. */ public async removeUUIDMetadata( parameters?: AppContext.RemoveUUIDMetadataParameters, ): Promise; /** * Remove a specific UUID Metadata object. * * @param [parametersOrCallback] - Request configuration parameters or callback from overload. * @param [callback] - Request completion handler callback. * * @returns Asynchronous UUID metadata remove response or `void` in case if `callback` provided. */ public async removeUUIDMetadata( parametersOrCallback?: | AppContext.RemoveUUIDMetadataParameters | ResultCallback, callback?: ResultCallback, ): Promise { this.logger.debug('PubNub', () => ({ messageType: 'object', message: !parametersOrCallback || typeof parametersOrCallback === 'function' ? { uuid: this.configuration.userId } : parametersOrCallback, details: `Remove${ !parametersOrCallback || typeof parametersOrCallback === 'function' ? ' current' : '' } UUID metadata object with parameters:`, })); return this._removeUUIDMetadata(parametersOrCallback, callback); } /** * Remove a specific UUID Metadata object. * * @internal * * @param [parametersOrCallback] - Request configuration parameters or callback from overload. * @param [callback] - Request completion handler callback. * * @returns Asynchronous UUID metadata remove response or `void` in case if `callback` provided. */ public async _removeUUIDMetadata( parametersOrCallback?: | AppContext.RemoveUUIDMetadataParameters | ResultCallback, callback?: ResultCallback, ): Promise { // Get user request parameters. const parameters: AppContext.RemoveUUIDMetadataParameters = parametersOrCallback && typeof parametersOrCallback !== 'function' ? parametersOrCallback : {}; callback ??= typeof parametersOrCallback === 'function' ? parametersOrCallback : undefined; if (parameters.userId) { this.logger.warn('PubNub', `'userId' parameter is deprecated. Use 'uuid' instead.`); parameters.uuid = parameters.userId; } parameters.uuid ??= this.configuration.userId; const request = new RemoveUUIDMetadataRequest({ ...parameters, keySet: this.keySet }); const logResponse = (response: AppContext.RemoveUUIDMetadataResponse | null) => { if (!response) return; this.logger.debug( 'PubNub', `Remove UUID metadata object success. Removed '${parameters.uuid}' UUID metadata object.`, ); }; if (callback) return this.sendRequest(request, (status, response: AppContext.RemoveUUIDMetadataResponse | null) => { logResponse(response); callback(status, response); }); return this.sendRequest(request).then((response) => { logResponse(response); return response; }); } // endregion // endregion // -------------------------------------------------------- // --------------------- Channel API ---------------------- // -------------------------------------------------------- // region Channel API // region Get Metadata /** * Fetch a paginated list of Channel Metadata objects. * * @param callback - Request completion handler callback. */ public getAllChannelMetadata( callback: ResultCallback>, ): void; /** * Fetch a paginated list of Channel Metadata objects. * * @param parameters - Request configuration parameters. * @param callback - Request completion handler callback. */ public getAllChannelMetadata( parameters: AppContext.GetAllMetadataParameters>, callback: ResultCallback>, ): void; /** * Fetch a paginated list of Channel Metadata objects. * * @param [parameters] - Request configuration parameters. * * @returns Asynchronous get all Channel metadata response. */ public async getAllChannelMetadata( parameters?: AppContext.GetAllMetadataParameters>, ): Promise>; /** * Fetch a paginated list of Channel Metadata objects. * * @param [parametersOrCallback] - Request configuration parameters or callback from overload. * @param [callback] - Request completion handler callback. * * @returns Asynchronous get all Channel metadata response or `void` in case if `callback` * provided. */ async getAllChannelMetadata( parametersOrCallback?: | AppContext.GetAllMetadataParameters> | ResultCallback>, callback?: ResultCallback>, ): Promise | void> { this.logger.debug('PubNub', () => ({ messageType: 'object', message: !parametersOrCallback || typeof parametersOrCallback === 'function' ? {} : parametersOrCallback, details: `Get all Channel metadata objects with parameters:`, })); return this._getAllChannelMetadata(parametersOrCallback, callback); } /** * Fetch a paginated list of Channel Metadata objects. * * @internal * * @param [parametersOrCallback] - Request configuration parameters or callback from overload. * @param [callback] - Request completion handler callback. * * @returns Asynchronous get all Channel metadata response or `void` in case if `callback` * provided. */ async _getAllChannelMetadata( parametersOrCallback?: | AppContext.GetAllMetadataParameters> | ResultCallback>, callback?: ResultCallback>, ): Promise | void> { // Get user request parameters. const parameters: AppContext.GetAllMetadataParameters> = parametersOrCallback && typeof parametersOrCallback !== 'function' ? parametersOrCallback : {}; callback ??= typeof parametersOrCallback === 'function' ? parametersOrCallback : undefined; const request = new GetAllChannelsMetadataRequest({ ...parameters, keySet: this.keySet }); const logResponse = (response: AppContext.GetAllChannelMetadataResponse | null) => { if (!response) return; this.logger.debug( 'PubNub', `Get all Channel metadata objects success. Received ${response.totalCount} Channel metadata objects.`, ); }; if (callback) return this.sendRequest(request, (status, response) => { logResponse(response); callback(status, response); }); return this.sendRequest(request).then((response) => { logResponse(response); return response; }); } /** * Fetch Channel Metadata object. * * @param parameters - Request configuration parameters. * @param callback - Request completion handler callback. */ public getChannelMetadata( parameters: AppContext.GetChannelMetadataParameters, callback: ResultCallback>, ): void; /** * Fetch a specific Channel Metadata object. * * @param parameters - Request configuration parameters. * * @returns Asynchronous get Channel metadata response. */ public async getChannelMetadata( parameters: AppContext.GetChannelMetadataParameters, ): Promise>; /** * Fetch Channel Metadata object. * * @param parameters - Request configuration parameters. * @param [callback] - Request completion handler callback. * * @returns Asynchronous get Channel metadata response or `void` in case if `callback` provided. */ async getChannelMetadata( parameters: AppContext.GetChannelMetadataParameters, callback?: ResultCallback>, ): Promise | void> { this.logger.debug('PubNub', () => ({ messageType: 'object', message: { ...parameters }, details: `Get Channel metadata object with parameters:`, })); return this._getChannelMetadata(parameters, callback); } /** * Fetch Channel Metadata object. * * @internal * * @param parameters - Request configuration parameters. * @param [callback] - Request completion handler callback. * * @returns Asynchronous get Channel metadata response or `void` in case if `callback` provided. */ async _getChannelMetadata( parameters: AppContext.GetChannelMetadataParameters, callback?: ResultCallback>, ): Promise | void> { const request = new GetChannelMetadataRequest({ ...parameters, keySet: this.keySet }); const logResponse = (response: AppContext.GetChannelMetadataResponse | null) => { if (!response) return; this.logger.debug( 'PubNub', `Get Channel metadata object success. Received '${parameters.channel}' Channel metadata object.`, ); }; if (callback) return this.sendRequest(request, (status, response) => { logResponse(response); callback(status, response); }); return this.sendRequest(request).then((response) => { logResponse(response); return response; }); } // endregion // region Set Metadata /** * Update specific Channel Metadata object. * * @param parameters - Request configuration parameters. * @param callback - Request completion handler callback. */ public setChannelMetadata( parameters: AppContext.SetChannelMetadataParameters, callback: ResultCallback>, ): void; /** * Update specific Channel Metadata object. * * @param parameters - Request configuration parameters. * * @returns Asynchronous set Channel metadata response. */ public async setChannelMetadata( parameters: AppContext.SetChannelMetadataParameters, ): Promise>; /** * Update specific Channel Metadata object. * * @param parameters - Request configuration parameters. * @param [callback] - Request completion handler callback. * * @returns Asynchronous set Channel metadata response or `void` in case if `callback` provided. */ async setChannelMetadata( parameters: AppContext.SetChannelMetadataParameters, callback?: ResultCallback>, ): Promise | void> { this.logger.debug('PubNub', () => ({ messageType: 'object', message: { ...parameters }, details: `Set Channel metadata object with parameters:`, })); return this._setChannelMetadata(parameters, callback); } /** * Update specific Channel Metadata object. * * @internal * * @param parameters - Request configuration parameters. * @param [callback] - Request completion handler callback. * * @returns Asynchronous set Channel metadata response or `void` in case if `callback` provided. */ async _setChannelMetadata( parameters: AppContext.SetChannelMetadataParameters, callback?: ResultCallback>, ): Promise | void> { const request = new SetChannelMetadataRequest({ ...parameters, keySet: this.keySet }); const logResponse = (response: AppContext.SetChannelMetadataResponse | null) => { if (!response) return; this.logger.debug( 'PubNub', `Set Channel metadata object success. Updated '${parameters.channel}' Channel metadata object.`, ); }; if (callback) return this.sendRequest(request, (status, response: AppContext.SetChannelMetadataResponse | null) => { logResponse(response); callback(status, response); }); return this.sendRequest(request).then((response: AppContext.SetChannelMetadataResponse) => { logResponse(response); return response; }); } // endregion // region Remove Metadata /** * Remove Channel Metadata object. * * @param parameters - Request configuration parameters. * @param callback - Request completion handler callback. */ public removeChannelMetadata( parameters: AppContext.RemoveChannelMetadataParameters, callback: ResultCallback, ): void; /** * Remove a specific Channel Metadata object. * * @param parameters - Request configuration parameters. * * @returns Asynchronous Channel metadata remove response. */ public async removeChannelMetadata( parameters: AppContext.RemoveChannelMetadataParameters, ): Promise; /** * Remove a specific Channel Metadata object. * * @param parameters - Request configuration parameters. * @param [callback] - Request completion handler callback. * * @returns Asynchronous Channel metadata remove response or `void` in case if `callback` * provided. */ async removeChannelMetadata( parameters: AppContext.RemoveChannelMetadataParameters, callback?: ResultCallback, ): Promise { this.logger.debug('PubNub', () => ({ messageType: 'object', message: { ...parameters }, details: `Remove Channel metadata object with parameters:`, })); return this._removeChannelMetadata(parameters, callback); } /** * Remove a specific Channel Metadata object. * * @internal * * @param parameters - Request configuration parameters. * @param [callback] - Request completion handler callback. * * @returns Asynchronous Channel metadata remove response or `void` in case if `callback` * provided. */ async _removeChannelMetadata( parameters: AppContext.RemoveChannelMetadataParameters, callback?: ResultCallback, ): Promise { const request = new RemoveChannelMetadataRequest({ ...parameters, keySet: this.keySet }); const logResponse = (response: AppContext.RemoveChannelMetadataResponse | null) => { if (!response) return; this.logger.debug( 'PubNub', `Remove Channel metadata object success. Removed '${parameters.channel}' Channel metadata object.`, ); }; if (callback) return this.sendRequest(request, (status, response: AppContext.RemoveChannelMetadataResponse | null) => { logResponse(response); callback(status, response); }); return this.sendRequest(request).then((response) => { logResponse(response); return response; }); } // endregion // endregion // -------------------------------------------------------- // -------------- Members / Membership API ---------------- // -------------------------------------------------------- // region Members API // region Get Members /** * Fetch a paginated list of Channel Member objects. * * @param parameters - Request configuration parameters. * @param callback - Request completion handler callback. */ public getChannelMembers< MemberCustom extends AppContext.CustomData = AppContext.CustomData, UUIDCustom extends AppContext.CustomData = AppContext.CustomData, >( parameters: AppContext.GetMembersParameters, callback: ResultCallback>, ): void; /** * Fetch a paginated list of Channel Member objects. * * @param parameters - Request configuration parameters. * * @returns Asynchronous get Channel Members response. */ public async getChannelMembers< MemberCustom extends AppContext.CustomData = AppContext.CustomData, UUIDCustom extends AppContext.CustomData = AppContext.CustomData, >(parameters: AppContext.GetMembersParameters): Promise>; /** * Fetch a paginated list of Channel Member objects. * * @param parameters - Request configuration parameters. * @param [callback] - Request completion handler callback. * * @returns Asynchronous get Channel Members response or `void` in case if `callback` provided. */ async getChannelMembers< MemberCustom extends AppContext.CustomData = AppContext.CustomData, UUIDCustom extends AppContext.CustomData = AppContext.CustomData, >( parameters: AppContext.GetMembersParameters, callback?: ResultCallback>, ): Promise | void> { this.logger.debug('PubNub', () => ({ messageType: 'object', message: { ...parameters }, details: `Get channel members with parameters:`, })); const request = new GetChannelMembersRequest({ ...parameters, keySet: this.keySet }); const logResponse = (response: AppContext.GetMembersResponse | null) => { if (!response) return; this.logger.debug('PubNub', `Get channel members success. Received ${response.totalCount} channel members.`); }; if (callback) return this.sendRequest( request, (status, response: AppContext.GetMembersResponse | null) => { logResponse(response); callback(status, response); }, ); return this.sendRequest(request).then((response: AppContext.GetMembersResponse) => { logResponse(response); return response; }); } // endregion // region Set Members /** * Update specific Channel Members list. * * @param parameters - Request configuration parameters. * @param callback - Request completion handler callback. */ public setChannelMembers< MemberCustom extends AppContext.CustomData = AppContext.CustomData, UUIDCustom extends AppContext.CustomData = AppContext.CustomData, >( parameters: AppContext.SetChannelMembersParameters, callback: ResultCallback>, ): void; /** * Update specific Channel Members list. * * @param parameters - Request configuration parameters. * * @returns Asynchronous update Channel Members list response. */ public async setChannelMembers< MemberCustom extends AppContext.CustomData = AppContext.CustomData, UUIDCustom extends AppContext.CustomData = AppContext.CustomData, >( parameters: AppContext.SetChannelMembersParameters, ): Promise>; /** * Update specific Channel Members list. * * @param parameters - Request configuration parameters. * @param [callback] - Request completion handler callback. * * @returns Asynchronous update Channel members list response or `void` in case if `callback` * provided. */ async setChannelMembers< MemberCustom extends AppContext.CustomData = AppContext.CustomData, UUIDCustom extends AppContext.CustomData = AppContext.CustomData, >( parameters: AppContext.SetChannelMembersParameters, callback?: ResultCallback>, ): Promise | void> { this.logger.debug('PubNub', () => ({ messageType: 'object', message: { ...parameters }, details: `Set channel members with parameters:`, })); const request = new SetChannelMembersRequest({ ...parameters, type: 'set', keySet: this.keySet }); const logResponse = (response: AppContext.SetMembersResponse | null) => { if (!response) return; this.logger.debug('PubNub', `Set channel members success. There are ${response.totalCount} channel members now.`); }; if (callback) return this.sendRequest( request, (status, response: AppContext.SetMembersResponse | null) => { logResponse(response); callback(status, response); }, ); return this.sendRequest(request).then((response: AppContext.SetMembersResponse) => { logResponse(response); return response; }); } // endregion // region Remove Members /** * Remove Members from the Channel. * * @param parameters - Request configuration parameters. * @param callback - Request completion handler callback. */ public removeChannelMembers< MemberCustom extends AppContext.CustomData = AppContext.CustomData, UUIDCustom extends AppContext.CustomData = AppContext.CustomData, >( parameters: AppContext.RemoveMembersParameters, callback: ResultCallback>, ): void; /** * Remove Members from the Channel. * * @param parameters - Request configuration parameters. * * @returns Asynchronous Channel Members remove response. */ public async removeChannelMembers< MemberCustom extends AppContext.CustomData = AppContext.CustomData, UUIDCustom extends AppContext.CustomData = AppContext.CustomData, >( parameters: AppContext.RemoveMembersParameters, ): Promise>; /** * Remove Members from the Channel. * * @param parameters - Request configuration parameters. * @param [callback] - Request completion handler callback. * * @returns Asynchronous Channel Members remove response or `void` in case if `callback` provided. */ async removeChannelMembers< MemberCustom extends AppContext.CustomData = AppContext.CustomData, UUIDCustom extends AppContext.CustomData = AppContext.CustomData, >( parameters: AppContext.RemoveMembersParameters, callback?: ResultCallback>, ): Promise | void> { this.logger.debug('PubNub', () => ({ messageType: 'object', message: { ...parameters }, details: `Remove channel members with parameters:`, })); const request = new SetChannelMembersRequest({ ...parameters, type: 'delete', keySet: this.keySet }); const logResponse = (response: AppContext.RemoveMembersResponse | null) => { if (!response) return; this.logger.debug( 'PubNub', `Remove channel members success. There are ${response.totalCount} channel members now.`, ); }; if (callback) return this.sendRequest( request, (status, response: AppContext.RemoveMembersResponse | null) => { logResponse(response); callback(status, response); }, ); return this.sendRequest(request).then((response: AppContext.RemoveMembersResponse) => { logResponse(response); return response; }); } // endregion // endregion // region Membership API // region Get Membership /** * Fetch a specific UUID Memberships list for currently configured PubNub client `uuid`. * * @param callback - Request completion handler callback. * * @returns Asynchronous get UUID Memberships list response or `void` in case if `callback` * provided. */ public getMemberships< MembershipCustom extends AppContext.CustomData = AppContext.CustomData, ChannelCustom extends AppContext.CustomData = AppContext.CustomData, >(callback: ResultCallback>): void; /** * Fetch a specific UUID Memberships list. * * @param parameters - Request configuration parameters. * @param callback - Request completion handler callback. */ public getMemberships< MembershipCustom extends AppContext.CustomData = AppContext.CustomData, ChannelCustom extends AppContext.CustomData = AppContext.CustomData, >( parameters: AppContext.GetMembershipsParameters, callback: ResultCallback>, ): void; /** * Fetch a specific UUID Memberships list. * * @param [parameters] - Request configuration parameters. Will fetch UUID Memberships list for * currently configured PubNub client `uuid` if not set. * * @returns Asynchronous get UUID Memberships list response. */ public async getMemberships< MembershipCustom extends AppContext.CustomData = AppContext.CustomData, ChannelCustom extends AppContext.CustomData = AppContext.CustomData, >( parameters?: AppContext.GetMembershipsParameters, ): Promise>; /** * Fetch a specific UUID Memberships list. * * @param [parametersOrCallback] - Request configuration parameters or callback from overload. * @param [callback] - Request completion handler callback. * * @returns Asynchronous get UUID Memberships response or `void` in case if `callback` provided. */ async getMemberships< MembershipCustom extends AppContext.CustomData = AppContext.CustomData, ChannelCustom extends AppContext.CustomData = AppContext.CustomData, >( parametersOrCallback?: | AppContext.GetMembershipsParameters | ResultCallback>, callback?: ResultCallback>, ): Promise | void> { // Get user request parameters. const parameters: AppContext.GetMembershipsParameters = parametersOrCallback && typeof parametersOrCallback !== 'function' ? parametersOrCallback : {}; callback ??= typeof parametersOrCallback === 'function' ? parametersOrCallback : undefined; if (parameters.userId) { this.logger.warn('PubNub', `'userId' parameter is deprecated. Use 'uuid' instead.`); parameters.uuid = parameters.userId; } parameters.uuid ??= this.configuration.userId; this.logger.debug('PubNub', () => ({ messageType: 'object', message: { ...parameters }, details: `Get memberships with parameters:`, })); const request = new GetUUIDMembershipsRequest({ ...parameters, keySet: this.keySet }); const logResponse = (response: AppContext.GetMembershipsResponse | null) => { if (!response) return; this.logger.debug('PubNub', `Get memberships success. Received ${response.totalCount} memberships.`); }; if (callback) return this.sendRequest( request, (status, response: AppContext.GetMembershipsResponse | null) => { logResponse(response); callback(status, response); }, ); return this.sendRequest(request).then( (response: AppContext.GetMembershipsResponse) => { logResponse(response); return response; }, ); } // endregion // region Set Membership /** * Update a specific UUID Memberships list. * * @param parameters - Request configuration parameters. * @param callback - Request completion handler callback. */ public setMemberships< MembershipCustom extends AppContext.CustomData = AppContext.CustomData, ChannelCustom extends AppContext.CustomData = AppContext.CustomData, >( parameters: AppContext.SetMembershipsParameters, callback: ResultCallback>, ): void; /** * Update specific UUID Memberships list. * * @param parameters - Request configuration parameters or callback from overload. * * @returns Asynchronous update UUID Memberships list response. */ public async setMemberships< MembershipCustom extends AppContext.CustomData = AppContext.CustomData, ChannelCustom extends AppContext.CustomData = AppContext.CustomData, >( parameters: AppContext.SetMembershipsParameters, ): Promise>; /** * Update specific UUID Memberships list. * * @param parameters - Request configuration parameters. * @param [callback] - Request completion handler callback. * * @returns Asynchronous update UUID Memberships list response or `void` in case if `callback` * provided. */ async setMemberships< MembershipCustom extends AppContext.CustomData = AppContext.CustomData, ChannelCustom extends AppContext.CustomData = AppContext.CustomData, >( parameters: AppContext.SetMembershipsParameters, callback?: ResultCallback>, ): Promise | void> { if (parameters.userId) { this.logger.warn('PubNub', `'userId' parameter is deprecated. Use 'uuid' instead.`); parameters.uuid = parameters.userId; } parameters.uuid ??= this.configuration.userId; this.logger.debug('PubNub', () => ({ messageType: 'object', message: { ...parameters }, details: `Set memberships with parameters:`, })); const request = new SetUUIDMembershipsRequest({ ...parameters, type: 'set', keySet: this.keySet }); const logResponse = (response: AppContext.SetMembershipsResponse | null) => { if (!response) return; this.logger.debug('PubNub', `Set memberships success. There are ${response.totalCount} memberships now.`); }; if (callback) return this.sendRequest( request, (status, response: AppContext.SetMembershipsResponse | null) => { logResponse(response); callback(status, response); }, ); return this.sendRequest(request).then( (response: AppContext.SetMembershipsResponse) => { logResponse(response); return response; }, ); } // endregion // region Remove Membership /** * Remove a specific UUID Memberships. * * @param parameters - Request configuration parameters. * @param callback - Request completion handler callback. */ public removeMemberships< MembershipCustom extends AppContext.CustomData = AppContext.CustomData, ChannelCustom extends AppContext.CustomData = AppContext.CustomData, >( parameters: AppContext.RemoveMembershipsParameters, callback: ResultCallback>, ): void; /** * Remove a specific UUID Memberships. * * @param parameters - Request configuration parameters. * * @returns Asynchronous UUID Memberships remove response. */ public async removeMemberships< MembershipCustom extends AppContext.CustomData = AppContext.CustomData, ChannelCustom extends AppContext.CustomData = AppContext.CustomData, >( parameters: AppContext.RemoveMembershipsParameters, ): Promise>; /** * Remove a specific UUID Memberships. * * @param parameters - Request configuration parameters or callback from overload. * @param [callback] - Request completion handler callback. * * @returns Asynchronous UUID Memberships remove response or `void` in case if `callback` * provided. */ async removeMemberships< MembershipCustom extends AppContext.CustomData = AppContext.CustomData, ChannelCustom extends AppContext.CustomData = AppContext.CustomData, >( parameters: AppContext.RemoveMembershipsParameters, callback?: ResultCallback>, ): Promise | void> { if (parameters.userId) { this.logger.warn('PubNub', `'userId' parameter is deprecated. Use 'uuid' instead.`); parameters.uuid = parameters.userId; } parameters.uuid ??= this.configuration.userId; this.logger.debug('PubNub', () => ({ messageType: 'object', message: { ...parameters }, details: `Remove memberships with parameters:`, })); const request = new SetUUIDMembershipsRequest({ ...parameters, type: 'delete', keySet: this.keySet }); const logResponse = (response: AppContext.RemoveMembershipsResponse | null) => { if (!response) return; this.logger.debug('PubNub', `Remove memberships success. There are ${response.totalCount} memberships now.`); }; if (callback) return this.sendRequest( request, (status, response: AppContext.RemoveMembershipsResponse | null) => { logResponse(response); callback(status, response); }, ); return this.sendRequest(request).then( (response: AppContext.RemoveMembershipsResponse) => { logResponse(response); return response; }, ); } // endregion // endregion // -------------------------------------------------------- // --------------------- Deprecated API ------------------- // -------------------------------------------------------- // region Deprecated /** * Fetch paginated list of specific Space members or specific User memberships. * * @param parameters - Request configuration parameters. * @param [callback] - Request completion handler callback. * * @returns Asynchronous get specific Space members or specific User memberships response. * * @deprecated Use {@link PubNubObjects#getChannelMembers getChannelMembers} or * {@link PubNubObjects#getMemberships getMemberships} methods instead. */ public async fetchMemberships< RelationCustom extends AppContext.CustomData = AppContext.CustomData, MetadataCustom extends AppContext.CustomData = AppContext.CustomData, >( parameters: AppContext.GetMembershipsParameters | AppContext.GetMembersParameters, callback?: ResultCallback< | AppContext.SpaceMembershipsResponse | AppContext.UserMembersResponse >, ): Promise< | AppContext.SpaceMembershipsResponse | AppContext.UserMembersResponse | void > { this.logger.warn( 'PubNub', "'fetchMemberships' is deprecated. Use 'pubnub.objects.getChannelMembers' or 'pubnub.objects.getMemberships'" + ' instead.', ); this.logger.debug('PubNub', () => ({ messageType: 'object', message: { ...parameters }, details: `Fetch memberships with parameters:`, })); if ('spaceId' in parameters) { const spaceParameters = parameters as AppContext.GetMembersParameters; const mappedParameters = { channel: spaceParameters.spaceId ?? spaceParameters.channel, filter: spaceParameters.filter, limit: spaceParameters.limit, page: spaceParameters.page, include: { ...spaceParameters.include }, sort: spaceParameters.sort ? Object.fromEntries( Object.entries(spaceParameters.sort).map(([key, value]) => [key.replace('user', 'uuid'), value]), ) : undefined, } as AppContext.GetMembersParameters; // Map Members object to the older version. const mapMembers = (response: AppContext.GetMembersResponse) => ({ status: response.status, data: response.data.map((members) => ({ user: members.uuid, custom: members.custom, updated: members.updated, eTag: members.eTag, })), totalCount: response.totalCount, next: response.next, prev: response.prev, }) as AppContext.UserMembersResponse; if (callback) return this.getChannelMembers(mappedParameters, (status, result) => { callback(status, result ? mapMembers(result) : result); }); return this.getChannelMembers(mappedParameters).then(mapMembers); } const userParameters = parameters as AppContext.GetMembershipsParameters; const mappedParameters = { uuid: userParameters.userId ?? userParameters.uuid, filter: userParameters.filter, limit: userParameters.limit, page: userParameters.page, include: { ...userParameters.include }, sort: userParameters.sort ? Object.fromEntries( Object.entries(userParameters.sort).map(([key, value]) => [key.replace('space', 'channel'), value]), ) : undefined, } as AppContext.GetMembershipsParameters; // Map Memberships object to the older version. const mapMemberships = ( response: AppContext.GetMembershipsResponse, ) => ({ status: response.status, data: response.data.map((membership) => ({ space: membership.channel, custom: membership.custom, updated: membership.updated, eTag: membership.eTag, })), totalCount: response.totalCount, next: response.next, prev: response.prev, }) as AppContext.SpaceMembershipsResponse; if (callback) return this.getMemberships(mappedParameters, (status, result) => { callback(status, result ? mapMemberships(result) : result); }); return this.getMemberships(mappedParameters).then(mapMemberships); } /** * Add members to specific Space or memberships specific User. * * @param parameters - Request configuration parameters. * @param [callback] - Request completion handler callback. * * @returns Asynchronous add members to specific Space or memberships specific User response or * `void` in case if `callback` provided. * * @deprecated Use {@link PubNubObjects#setChannelMembers setChannelMembers} or * {@link PubNubObjects#setMemberships setMemberships} methods instead. */ async addMemberships< Custom extends AppContext.CustomData = AppContext.CustomData, MetadataCustom extends AppContext.CustomData = AppContext.CustomData, >( parameters: AppContext.SetMembershipsParameters | AppContext.SetChannelMembersParameters, callback?: ResultCallback< AppContext.SetMembershipsResponse | AppContext.SetMembersResponse >, ): Promise< | AppContext.SetMembershipsResponse | AppContext.SetMembersResponse | void > { this.logger.warn( 'PubNub', "'addMemberships' is deprecated. Use 'pubnub.objects.setChannelMembers' or 'pubnub.objects.setMemberships'" + ' instead.', ); this.logger.debug('PubNub', () => ({ messageType: 'object', message: { ...parameters }, details: `Add memberships with parameters:`, })); if ('spaceId' in parameters) { const spaceParameters = parameters as AppContext.SetChannelMembersParameters; const mappedParameters = { channel: spaceParameters.spaceId ?? spaceParameters.channel, uuids: spaceParameters.users?.map((user) => { if (typeof user === 'string') return user; return { id: user.userId, custom: user.custom }; }) ?? spaceParameters.uuids, limit: 0, }; if (callback) return this.setChannelMembers(mappedParameters, callback); return this.setChannelMembers(mappedParameters); } const userParameters = parameters as AppContext.SetMembershipsParameters; const mappedParameters = { uuid: userParameters.userId ?? userParameters.uuid, channels: userParameters.spaces?.map((space) => { if (typeof space === 'string') return space; return { id: space.spaceId, custom: space.custom, }; }) ?? userParameters.channels, limit: 0, }; if (callback) return this.setMemberships(mappedParameters, callback); return this.setMemberships(mappedParameters); } // endregion }