|
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