|
3595 | 3595 | workerLogLevel: this.configuration.workerLogLevel,
|
3596 | 3596 | });
|
3597 | 3597 | }
|
| 3598 | + /** |
| 3599 | + * Update presence state associated with `userId`. |
| 3600 | + * |
| 3601 | + * @param state - Key-value pair of payloads (states) that should be associated with channels / groups specified as |
| 3602 | + * keys. |
| 3603 | + */ |
| 3604 | + onPresenceStateChange(state) { |
| 3605 | + this.scheduleEventPost({ |
| 3606 | + type: 'client-presence-state-update', |
| 3607 | + clientIdentifier: this.configuration.clientIdentifier, |
| 3608 | + subscriptionKey: this.configuration.subscriptionKey, |
| 3609 | + workerLogLevel: this.configuration.workerLogLevel, |
| 3610 | + state, |
| 3611 | + }); |
| 3612 | + } |
3598 | 3613 | /**
|
3599 | 3614 | * Update client's heartbeat interval change.
|
3600 | 3615 | *
|
|
3897 | 3912 | if (!token || !stringifiedToken)
|
3898 | 3913 | return undefined;
|
3899 | 3914 | return (this.accessTokensMap = {
|
3900 |
| - [accessToken]: { token: stringifiedToken, expiration: token.timestamp * token.ttl * 60 }, |
| 3915 | + [accessToken]: { token: stringifiedToken, expiration: token.timestamp + token.ttl * 60 }, |
3901 | 3916 | })[accessToken];
|
3902 | 3917 | });
|
3903 | 3918 | });
|
|
5421 | 5436 | return base.PubNubFile;
|
5422 | 5437 | },
|
5423 | 5438 | get version() {
|
5424 |
| - return '9.9.0'; |
| 5439 | + return '9.10.0'; |
5425 | 5440 | },
|
5426 | 5441 | getVersion() {
|
5427 | 5442 | return this.version;
|
|
6519 | 6534 | let { e: eventType } = envelope;
|
6520 | 6535 | // Resolve missing event type.
|
6521 | 6536 | eventType !== null && eventType !== void 0 ? eventType : (eventType = envelope.c.endsWith('-pnpres') ? PubNubEventType.Presence : PubNubEventType.Message);
|
| 6537 | + const pn_mfp = messageFingerprint(envelope.d); |
6522 | 6538 | // Check whether payload is string (potentially encrypted data).
|
6523 | 6539 | if (eventType != PubNubEventType.Signal && typeof envelope.d === 'string') {
|
6524 | 6540 | if (eventType == PubNubEventType.Message) {
|
6525 | 6541 | return {
|
6526 | 6542 | type: PubNubEventType.Message,
|
6527 | 6543 | data: this.messageFromEnvelope(envelope),
|
| 6544 | + pn_mfp, |
6528 | 6545 | };
|
6529 | 6546 | }
|
6530 | 6547 | return {
|
6531 | 6548 | type: PubNubEventType.Files,
|
6532 | 6549 | data: this.fileFromEnvelope(envelope),
|
| 6550 | + pn_mfp, |
6533 | 6551 | };
|
6534 | 6552 | }
|
6535 | 6553 | else if (eventType == PubNubEventType.Message) {
|
6536 | 6554 | return {
|
6537 | 6555 | type: PubNubEventType.Message,
|
6538 | 6556 | data: this.messageFromEnvelope(envelope),
|
| 6557 | + pn_mfp, |
6539 | 6558 | };
|
6540 | 6559 | }
|
6541 | 6560 | else if (eventType === PubNubEventType.Presence) {
|
6542 | 6561 | return {
|
6543 | 6562 | type: PubNubEventType.Presence,
|
6544 | 6563 | data: this.presenceEventFromEnvelope(envelope),
|
| 6564 | + pn_mfp, |
6545 | 6565 | };
|
6546 | 6566 | }
|
6547 | 6567 | else if (eventType == PubNubEventType.Signal) {
|
6548 | 6568 | return {
|
6549 | 6569 | type: PubNubEventType.Signal,
|
6550 | 6570 | data: this.signalFromEnvelope(envelope),
|
| 6571 | + pn_mfp, |
6551 | 6572 | };
|
6552 | 6573 | }
|
6553 | 6574 | else if (eventType === PubNubEventType.AppContext) {
|
6554 | 6575 | return {
|
6555 | 6576 | type: PubNubEventType.AppContext,
|
6556 | 6577 | data: this.appContextFromEnvelope(envelope),
|
| 6578 | + pn_mfp, |
6557 | 6579 | };
|
6558 | 6580 | }
|
6559 | 6581 | else if (eventType === PubNubEventType.MessageAction) {
|
6560 | 6582 | return {
|
6561 | 6583 | type: PubNubEventType.MessageAction,
|
6562 | 6584 | data: this.messageActionFromEnvelope(envelope),
|
| 6585 | + pn_mfp, |
6563 | 6586 | };
|
6564 | 6587 | }
|
6565 | 6588 | return {
|
6566 | 6589 | type: PubNubEventType.Files,
|
6567 | 6590 | data: this.fileFromEnvelope(envelope),
|
| 6591 | + pn_mfp, |
6568 | 6592 | };
|
6569 | 6593 | });
|
6570 | 6594 | return {
|
|
7413 | 7437 | region: this.region ? this.region : undefined,
|
7414 | 7438 | };
|
7415 | 7439 | this.configuration.logger().debug('SubscriptionManager', () => {
|
7416 |
| - const hashedEvents = messages.map((event) => { |
7417 |
| - const pn_mfp = event.type === PubNubEventType.Message || event.type === PubNubEventType.Signal |
7418 |
| - ? messageFingerprint(event.data.message) |
7419 |
| - : undefined; |
7420 |
| - return pn_mfp ? { type: event.type, data: Object.assign(Object.assign({}, event.data), { pn_mfp }) } : event; |
7421 |
| - }); |
| 7440 | + const hashedEvents = messages.map((event) => ({ |
| 7441 | + type: event.type, |
| 7442 | + data: Object.assign(Object.assign({}, event.data), { pn_mfp: event.pn_mfp }), |
| 7443 | + })); |
7422 | 7444 | return { messageType: 'object', message: hashedEvents, details: 'Received events:' };
|
7423 | 7445 | });
|
7424 | 7446 | messages.forEach((message) => {
|
|
13009 | 13031 | const logResponse = (response) => {
|
13010 | 13032 | if (!response)
|
13011 | 13033 | return;
|
13012 |
| - this.logger.info('PubNub', `List channel group channels success. Received ${response.channels.length} channels.`); |
| 13034 | + this.logger.debug('PubNub', `List channel group channels success. Received ${response.channels.length} channels.`); |
13013 | 13035 | };
|
13014 | 13036 | if (callback)
|
13015 | 13037 | return this.sendRequest(request, (status, response) => {
|
|
13038 | 13060 | const logResponse = (response) => {
|
13039 | 13061 | if (!response)
|
13040 | 13062 | return;
|
13041 |
| - this.logger.info('PubNub', `List all channel groups success. Received ${response.groups.length} groups.`); |
| 13063 | + this.logger.debug('PubNub', `List all channel groups success. Received ${response.groups.length} groups.`); |
13042 | 13064 | };
|
13043 | 13065 | if (callback)
|
13044 | 13066 | return this.sendRequest(request, (status, response) => {
|
|
13069 | 13091 | }));
|
13070 | 13092 | const request = new AddChannelGroupChannelsRequest(Object.assign(Object.assign({}, parameters), { keySet: this.keySet }));
|
13071 | 13093 | const logResponse = () => {
|
13072 |
| - this.logger.info('PubNub', `Add channels to the channel group success.`); |
| 13094 | + this.logger.debug('PubNub', `Add channels to the channel group success.`); |
13073 | 13095 | };
|
13074 | 13096 | if (callback)
|
13075 | 13097 | return this.sendRequest(request, (status) => {
|
|
13101 | 13123 | }));
|
13102 | 13124 | const request = new RemoveChannelGroupChannelsRequest(Object.assign(Object.assign({}, parameters), { keySet: this.keySet }));
|
13103 | 13125 | const logResponse = () => {
|
13104 |
| - this.logger.info('PubNub', `Remove channels from the channel group success.`); |
| 13126 | + this.logger.debug('PubNub', `Remove channels from the channel group success.`); |
13105 | 13127 | };
|
13106 | 13128 | if (callback)
|
13107 | 13129 | return this.sendRequest(request, (status) => {
|
|
13132 | 13154 | }));
|
13133 | 13155 | const request = new DeleteChannelGroupRequest(Object.assign(Object.assign({}, parameters), { keySet: this.keySet }));
|
13134 | 13156 | const logResponse = () => {
|
13135 |
| - this.logger.info('PubNub', `Remove a channel group success. Removed '${parameters.channelGroup}' channel group.'`); |
| 13157 | + this.logger.debug('PubNub', `Remove a channel group success. Removed '${parameters.channelGroup}' channel group.'`); |
13136 | 13158 | };
|
13137 | 13159 | if (callback)
|
13138 | 13160 | return this.sendRequest(request, (status) => {
|
|
14516 | 14538 | const logResponse = (response) => {
|
14517 | 14539 | if (!response)
|
14518 | 14540 | return;
|
14519 |
| - this.logger.debug('PubNub', `Set UUID metadata object success. Updated '${parameters.uuid}' UUID metadata object.'`); |
| 14541 | + this.logger.debug('PubNub', `Set UUID metadata object success. Updated '${parameters.uuid}' UUID metadata object.`); |
14520 | 14542 | };
|
14521 | 14543 | if (callback)
|
14522 | 14544 | return this.sendRequest(request, (status, response) => {
|
|
14673 | 14695 | const logResponse = (response) => {
|
14674 | 14696 | if (!response)
|
14675 | 14697 | return;
|
14676 |
| - this.logger.debug('PubNub', `Get Channel metadata object success. Received '${parameters.channel}' Channel metadata object.'`); |
| 14698 | + this.logger.debug('PubNub', `Get Channel metadata object success. Received '${parameters.channel}' Channel metadata object.`); |
14677 | 14699 | };
|
14678 | 14700 | if (callback)
|
14679 | 14701 | return this.sendRequest(request, (status, response) => {
|
|
16858 | 16880 | if ('channelGroups' in parameters) {
|
16859 | 16881 | (_b = parameters.channelGroups) === null || _b === void 0 ? void 0 : _b.forEach((group) => (presenceState[group] = parameters.state));
|
16860 | 16882 | }
|
| 16883 | + if (this.onPresenceStateChange) |
| 16884 | + this.onPresenceStateChange(this.presenceState); |
16861 | 16885 | }
|
16862 | 16886 | // Check whether the state should be set with heartbeat or not.
|
16863 | 16887 | if ('withHeartbeat' in parameters && parameters.withHeartbeat) {
|
|
16872 | 16896 | this.logger.debug('PubNub', `Set presence state success.${request instanceof HeartbeatRequest ? ' Presence state has been set using heartbeat endpoint.' : ''}`);
|
16873 | 16897 | };
|
16874 | 16898 | // Update state used by subscription manager.
|
16875 |
| - if (this.subscriptionManager) |
| 16899 | + if (this.subscriptionManager) { |
16876 | 16900 | this.subscriptionManager.setState(parameters);
|
| 16901 | + if (this.onPresenceStateChange) |
| 16902 | + this.onPresenceStateChange(this.subscriptionManager.presenceState); |
| 16903 | + } |
16877 | 16904 | if (callback)
|
16878 | 16905 | return this.sendRequest(request, (status, response) => {
|
16879 | 16906 | logResponse(response);
|
|
16943 | 16970 | return callback(responseStatus, {});
|
16944 | 16971 | return Promise.resolve(responseStatus);
|
16945 | 16972 | }
|
16946 |
| - const request = new HeartbeatRequest(Object.assign(Object.assign({}, parameters), { channels, |
16947 |
| - channelGroups, keySet: this._configuration.keySet })); |
| 16973 | + const request = new HeartbeatRequest(Object.assign(Object.assign({}, parameters), { channels: [...new Set(channels)], channelGroups: [...new Set(channelGroups)], keySet: this._configuration.keySet })); |
16948 | 16974 | const logResponse = (response) => {
|
16949 | 16975 | if (!response)
|
16950 | 16976 | return;
|
|
18246 | 18272 | }
|
18247 | 18273 | // Settings change handlers
|
18248 | 18274 | let heartbeatIntervalChangeHandler = () => { };
|
| 18275 | + let presenceStateChangeHandler = () => { }; |
18249 | 18276 | let authenticationChangeHandler = () => { };
|
18250 | 18277 | let userIdChangeHandler = () => { };
|
18251 | 18278 | let cryptography;
|
|
18272 | 18299 | transport,
|
18273 | 18300 | logger: clientConfiguration.logger(),
|
18274 | 18301 | });
|
| 18302 | + presenceStateChangeHandler = (state) => middleware.onPresenceStateChange(state); |
18275 | 18303 | heartbeatIntervalChangeHandler = (interval) => middleware.onHeartbeatIntervalChange(interval);
|
18276 | 18304 | authenticationChangeHandler = (auth) => middleware.onTokenChange(auth);
|
18277 | 18305 | userIdChangeHandler = (userId) => middleware.onUserIdChange(userId);
|
|
18310 | 18338 | });
|
18311 | 18339 | this.onHeartbeatIntervalChange = heartbeatIntervalChangeHandler;
|
18312 | 18340 | this.onAuthenticationChange = authenticationChangeHandler;
|
| 18341 | + this.onPresenceStateChange = presenceStateChangeHandler; |
18313 | 18342 | this.onUserIdChange = userIdChangeHandler;
|
18314 | 18343 | {
|
18315 | 18344 | if (transport instanceof SubscriptionWorkerMiddleware) {
|
|
0 commit comments