Skip to content

Commit 875e44b

Browse files
authored
Add file upload and download timeout configuration (#430)
feat(file-share): add file upload and download timeout configuration Add `fileRequestTimeout` client configuration option which is specific only for requests which upload and download files. fix: fix `instanceId` query parameter Fix issue with `instanceId` set to `undefined` for requests with `useInstanceId` configuration flag set to `true`.
1 parent 1a2ddeb commit 875e44b

File tree

16 files changed

+140
-46
lines changed

16 files changed

+140
-46
lines changed

.pubnub.yml

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
---
22
changelog:
3+
- date: 2025-01-15
4+
version: v8.5.0
5+
changes:
6+
- type: feature
7+
text: "Add `fileRequestTimeout` client configuration option which is specific only for requests which upload and download files."
8+
- type: bug
9+
text: "Fix issue with `instanceId` set to `undefined` for requests with `useInstanceId` configuration flag set to `true`."
310
- date: 2025-01-02
411
version: v8.4.1
512
changes:
@@ -1099,7 +1106,7 @@ supported-platforms:
10991106
- 'Ubuntu 14.04 and up'
11001107
- 'Windows 7 and up'
11011108
version: 'Pubnub Javascript for Node'
1102-
version: '8.4.1'
1109+
version: '8.5.0'
11031110
sdks:
11041111
- full-name: PubNub Javascript SDK
11051112
short-name: Javascript
@@ -1115,7 +1122,7 @@ sdks:
11151122
- distribution-type: source
11161123
distribution-repository: GitHub release
11171124
package-name: pubnub.js
1118-
location: https://github.com/pubnub/javascript/archive/refs/tags/v8.4.1.zip
1125+
location: https://github.com/pubnub/javascript/archive/refs/tags/v8.5.0.zip
11191126
requires:
11201127
- name: 'agentkeepalive'
11211128
min-version: '3.5.2'
@@ -1786,7 +1793,7 @@ sdks:
17861793
- distribution-type: library
17871794
distribution-repository: GitHub release
17881795
package-name: pubnub.js
1789-
location: https://github.com/pubnub/javascript/releases/download/v8.4.1/pubnub.8.4.1.js
1796+
location: https://github.com/pubnub/javascript/releases/download/v8.5.0/pubnub.8.5.0.js
17901797
requires:
17911798
- name: 'agentkeepalive'
17921799
min-version: '3.5.2'

CHANGELOG.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,12 @@
1+
## v8.5.0
2+
January 15 2025
3+
4+
#### Added
5+
- Add `fileRequestTimeout` client configuration option which is specific only for requests which upload and download files.
6+
7+
#### Fixed
8+
- Fix issue with `instanceId` set to `undefined` for requests with `useInstanceId` configuration flag set to `true`.
9+
110
## v8.4.1
211
January 02 2025
312

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@ Watch [Getting Started with PubNub JS SDK](https://app.dashcam.io/replay/64ee0d2
2828
npm install pubnub
2929
```
3030
* or download one of our builds from our CDN:
31-
* https://cdn.pubnub.com/sdk/javascript/pubnub.8.4.1.js
32-
* https://cdn.pubnub.com/sdk/javascript/pubnub.8.4.1.min.js
31+
* https://cdn.pubnub.com/sdk/javascript/pubnub.8.5.0.js
32+
* https://cdn.pubnub.com/sdk/javascript/pubnub.8.5.0.min.js
3333
3434
2. Configure your keys:
3535

dist/web/pubnub.js

Lines changed: 30 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3644,6 +3644,10 @@
36443644
* Subscription request timeout.
36453645
*/
36463646
const SUBSCRIBE_REQUEST_TIMEOUT = 310;
3647+
/**
3648+
* File upload / download request timeout.
3649+
*/
3650+
const FILE_REQUEST_TIMEOUT = 300;
36473651
/**
36483652
* Default user presence timeout.
36493653
*/
@@ -3660,27 +3664,28 @@
36603664
* @internal
36613665
*/
36623666
const setDefaults$1 = (configuration) => {
3663-
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p;
3667+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q;
36643668
// Copy configuration.
36653669
const configurationCopy = Object.assign({}, configuration);
36663670
(_a = configurationCopy.logVerbosity) !== null && _a !== void 0 ? _a : (configurationCopy.logVerbosity = USE_VERBOSE_LOGGING);
36673671
(_b = configurationCopy.ssl) !== null && _b !== void 0 ? _b : (configurationCopy.ssl = USE_SSL);
36683672
(_c = configurationCopy.transactionalRequestTimeout) !== null && _c !== void 0 ? _c : (configurationCopy.transactionalRequestTimeout = TRANSACTIONAL_REQUEST_TIMEOUT);
36693673
(_d = configurationCopy.subscribeRequestTimeout) !== null && _d !== void 0 ? _d : (configurationCopy.subscribeRequestTimeout = SUBSCRIBE_REQUEST_TIMEOUT);
3670-
(_e = configurationCopy.restore) !== null && _e !== void 0 ? _e : (configurationCopy.restore = RESTORE);
3671-
(_f = configurationCopy.useInstanceId) !== null && _f !== void 0 ? _f : (configurationCopy.useInstanceId = USE_INSTANCE_ID);
3672-
(_g = configurationCopy.suppressLeaveEvents) !== null && _g !== void 0 ? _g : (configurationCopy.suppressLeaveEvents = SUPPRESS_LEAVE_EVENTS);
3673-
(_h = configurationCopy.requestMessageCountThreshold) !== null && _h !== void 0 ? _h : (configurationCopy.requestMessageCountThreshold = DEDUPE_CACHE_SIZE);
3674-
(_j = configurationCopy.autoNetworkDetection) !== null && _j !== void 0 ? _j : (configurationCopy.autoNetworkDetection = AUTO_NETWORK_DETECTION);
3675-
(_k = configurationCopy.enableEventEngine) !== null && _k !== void 0 ? _k : (configurationCopy.enableEventEngine = ENABLE_EVENT_ENGINE);
3676-
(_l = configurationCopy.maintainPresenceState) !== null && _l !== void 0 ? _l : (configurationCopy.maintainPresenceState = MAINTAIN_PRESENCE_STATE);
3677-
(_m = configurationCopy.keepAlive) !== null && _m !== void 0 ? _m : (configurationCopy.keepAlive = KEEP_ALIVE$1);
3674+
(_e = configurationCopy.fileRequestTimeout) !== null && _e !== void 0 ? _e : (configurationCopy.fileRequestTimeout = FILE_REQUEST_TIMEOUT);
3675+
(_f = configurationCopy.restore) !== null && _f !== void 0 ? _f : (configurationCopy.restore = RESTORE);
3676+
(_g = configurationCopy.useInstanceId) !== null && _g !== void 0 ? _g : (configurationCopy.useInstanceId = USE_INSTANCE_ID);
3677+
(_h = configurationCopy.suppressLeaveEvents) !== null && _h !== void 0 ? _h : (configurationCopy.suppressLeaveEvents = SUPPRESS_LEAVE_EVENTS);
3678+
(_j = configurationCopy.requestMessageCountThreshold) !== null && _j !== void 0 ? _j : (configurationCopy.requestMessageCountThreshold = DEDUPE_CACHE_SIZE);
3679+
(_k = configurationCopy.autoNetworkDetection) !== null && _k !== void 0 ? _k : (configurationCopy.autoNetworkDetection = AUTO_NETWORK_DETECTION);
3680+
(_l = configurationCopy.enableEventEngine) !== null && _l !== void 0 ? _l : (configurationCopy.enableEventEngine = ENABLE_EVENT_ENGINE);
3681+
(_m = configurationCopy.maintainPresenceState) !== null && _m !== void 0 ? _m : (configurationCopy.maintainPresenceState = MAINTAIN_PRESENCE_STATE);
3682+
(_o = configurationCopy.keepAlive) !== null && _o !== void 0 ? _o : (configurationCopy.keepAlive = KEEP_ALIVE$1);
36783683
if (configurationCopy.userId && configurationCopy.uuid)
36793684
throw new PubNubError("PubNub client configuration error: use only 'userId'");
3680-
(_o = configurationCopy.userId) !== null && _o !== void 0 ? _o : (configurationCopy.userId = configurationCopy.uuid);
3685+
(_p = configurationCopy.userId) !== null && _p !== void 0 ? _p : (configurationCopy.userId = configurationCopy.uuid);
36813686
if (!configurationCopy.userId)
36823687
throw new PubNubError("PubNub client configuration error: 'userId' not set");
3683-
else if (((_p = configurationCopy.userId) === null || _p === void 0 ? void 0 : _p.trim().length) === 0)
3688+
else if (((_q = configurationCopy.userId) === null || _q === void 0 ? void 0 : _q.trim().length) === 0)
36843689
throw new PubNubError("PubNub client configuration error: 'userId' is empty");
36853690
// Generate default origin subdomains.
36863691
if (!configurationCopy.origin)
@@ -3894,6 +3899,11 @@
38943899
return this._instanceId;
38953900
return undefined;
38963901
},
3902+
getInstanceId() {
3903+
if (this.useInstanceId)
3904+
return this._instanceId;
3905+
return undefined;
3906+
},
38973907
getUserId() {
38983908
return this.userId;
38993909
},
@@ -3957,11 +3967,14 @@
39573967
getSubscribeTimeout() {
39583968
return this.subscribeRequestTimeout;
39593969
},
3970+
getFileTimeout() {
3971+
return this.fileRequestTimeout;
3972+
},
39603973
get PubNubFile() {
39613974
return base.PubNubFile;
39623975
},
39633976
get version() {
3964-
return '8.4.1';
3977+
return '8.5.0';
39653978
},
39663979
getVersion() {
39673980
return this.version;
@@ -4270,7 +4283,7 @@
42704283
req.queryParameters = {};
42714284
// Modify request with required information.
42724285
if (clientConfiguration.useInstanceId)
4273-
req.queryParameters['instanceid'] = clientConfiguration.instanceId;
4286+
req.queryParameters['instanceid'] = clientConfiguration.getInstanceId();
42744287
if (!req.queryParameters['uuid'])
42754288
req.queryParameters['uuid'] = clientConfiguration.userId;
42764289
if (clientConfiguration.useRequestId)
@@ -13037,9 +13050,10 @@
1303713050
}
1303813051
// Complete request configuration.
1303913052
const transportRequest = request.request();
13040-
if (transportRequest.formData && transportRequest.formData.length > 0) {
13041-
// Set 300 seconds file upload request delay.
13042-
transportRequest.timeout = 300;
13053+
if ((transportRequest.formData && transportRequest.formData.length > 0) ||
13054+
request.operation() === RequestOperation$1.PNDownloadFileOperation) {
13055+
// Set file upload / download request delay.
13056+
transportRequest.timeout = this._configuration.getFileTimeout();
1304313057
}
1304413058
else {
1304513059
if (request.operation() === RequestOperation$1.PNSubscribeOperation)

dist/web/pubnub.min.js

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/core/components/configuration.js

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,11 @@ const makeConfiguration = (base, setupCryptoModule) => {
4545
return this._instanceId;
4646
return undefined;
4747
},
48+
getInstanceId() {
49+
if (this.useInstanceId)
50+
return this._instanceId;
51+
return undefined;
52+
},
4853
getUserId() {
4954
return this.userId;
5055
},
@@ -108,11 +113,14 @@ const makeConfiguration = (base, setupCryptoModule) => {
108113
getSubscribeTimeout() {
109114
return this.subscribeRequestTimeout;
110115
},
116+
getFileTimeout() {
117+
return this.fileRequestTimeout;
118+
},
111119
get PubNubFile() {
112120
return base.PubNubFile;
113121
},
114122
get version() {
115-
return '8.4.1';
123+
return '8.5.0';
116124
},
117125
getVersion() {
118126
return this.version;

lib/core/interfaces/configuration.js

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,10 @@ const TRANSACTIONAL_REQUEST_TIMEOUT = 15;
7878
* Subscription request timeout.
7979
*/
8080
const SUBSCRIBE_REQUEST_TIMEOUT = 310;
81+
/**
82+
* File upload / download request timeout.
83+
*/
84+
const FILE_REQUEST_TIMEOUT = 300;
8185
/**
8286
* Default user presence timeout.
8387
*/
@@ -94,27 +98,28 @@ const PRESENCE_TIMEOUT_MINIMUM = 20;
9498
* @internal
9599
*/
96100
const setDefaults = (configuration) => {
97-
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p;
101+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q;
98102
// Copy configuration.
99103
const configurationCopy = Object.assign({}, configuration);
100104
(_a = configurationCopy.logVerbosity) !== null && _a !== void 0 ? _a : (configurationCopy.logVerbosity = USE_VERBOSE_LOGGING);
101105
(_b = configurationCopy.ssl) !== null && _b !== void 0 ? _b : (configurationCopy.ssl = USE_SSL);
102106
(_c = configurationCopy.transactionalRequestTimeout) !== null && _c !== void 0 ? _c : (configurationCopy.transactionalRequestTimeout = TRANSACTIONAL_REQUEST_TIMEOUT);
103107
(_d = configurationCopy.subscribeRequestTimeout) !== null && _d !== void 0 ? _d : (configurationCopy.subscribeRequestTimeout = SUBSCRIBE_REQUEST_TIMEOUT);
104-
(_e = configurationCopy.restore) !== null && _e !== void 0 ? _e : (configurationCopy.restore = RESTORE);
105-
(_f = configurationCopy.useInstanceId) !== null && _f !== void 0 ? _f : (configurationCopy.useInstanceId = USE_INSTANCE_ID);
106-
(_g = configurationCopy.suppressLeaveEvents) !== null && _g !== void 0 ? _g : (configurationCopy.suppressLeaveEvents = SUPPRESS_LEAVE_EVENTS);
107-
(_h = configurationCopy.requestMessageCountThreshold) !== null && _h !== void 0 ? _h : (configurationCopy.requestMessageCountThreshold = DEDUPE_CACHE_SIZE);
108-
(_j = configurationCopy.autoNetworkDetection) !== null && _j !== void 0 ? _j : (configurationCopy.autoNetworkDetection = AUTO_NETWORK_DETECTION);
109-
(_k = configurationCopy.enableEventEngine) !== null && _k !== void 0 ? _k : (configurationCopy.enableEventEngine = ENABLE_EVENT_ENGINE);
110-
(_l = configurationCopy.maintainPresenceState) !== null && _l !== void 0 ? _l : (configurationCopy.maintainPresenceState = MAINTAIN_PRESENCE_STATE);
111-
(_m = configurationCopy.keepAlive) !== null && _m !== void 0 ? _m : (configurationCopy.keepAlive = KEEP_ALIVE);
108+
(_e = configurationCopy.fileRequestTimeout) !== null && _e !== void 0 ? _e : (configurationCopy.fileRequestTimeout = FILE_REQUEST_TIMEOUT);
109+
(_f = configurationCopy.restore) !== null && _f !== void 0 ? _f : (configurationCopy.restore = RESTORE);
110+
(_g = configurationCopy.useInstanceId) !== null && _g !== void 0 ? _g : (configurationCopy.useInstanceId = USE_INSTANCE_ID);
111+
(_h = configurationCopy.suppressLeaveEvents) !== null && _h !== void 0 ? _h : (configurationCopy.suppressLeaveEvents = SUPPRESS_LEAVE_EVENTS);
112+
(_j = configurationCopy.requestMessageCountThreshold) !== null && _j !== void 0 ? _j : (configurationCopy.requestMessageCountThreshold = DEDUPE_CACHE_SIZE);
113+
(_k = configurationCopy.autoNetworkDetection) !== null && _k !== void 0 ? _k : (configurationCopy.autoNetworkDetection = AUTO_NETWORK_DETECTION);
114+
(_l = configurationCopy.enableEventEngine) !== null && _l !== void 0 ? _l : (configurationCopy.enableEventEngine = ENABLE_EVENT_ENGINE);
115+
(_m = configurationCopy.maintainPresenceState) !== null && _m !== void 0 ? _m : (configurationCopy.maintainPresenceState = MAINTAIN_PRESENCE_STATE);
116+
(_o = configurationCopy.keepAlive) !== null && _o !== void 0 ? _o : (configurationCopy.keepAlive = KEEP_ALIVE);
112117
if (configurationCopy.userId && configurationCopy.uuid)
113118
throw new pubnub_error_1.PubNubError("PubNub client configuration error: use only 'userId'");
114-
(_o = configurationCopy.userId) !== null && _o !== void 0 ? _o : (configurationCopy.userId = configurationCopy.uuid);
119+
(_p = configurationCopy.userId) !== null && _p !== void 0 ? _p : (configurationCopy.userId = configurationCopy.uuid);
115120
if (!configurationCopy.userId)
116121
throw new pubnub_error_1.PubNubError("PubNub client configuration error: 'userId' not set");
117-
else if (((_p = configurationCopy.userId) === null || _p === void 0 ? void 0 : _p.trim().length) === 0)
122+
else if (((_q = configurationCopy.userId) === null || _q === void 0 ? void 0 : _q.trim().length) === 0)
118123
throw new pubnub_error_1.PubNubError("PubNub client configuration error: 'userId' is empty");
119124
// Generate default origin subdomains.
120125
if (!configurationCopy.origin)

lib/core/pubnub-common.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -550,9 +550,10 @@ class PubNubCore {
550550
}
551551
// Complete request configuration.
552552
const transportRequest = request.request();
553-
if (transportRequest.formData && transportRequest.formData.length > 0) {
554-
// Set 300 seconds file upload request delay.
555-
transportRequest.timeout = 300;
553+
if ((transportRequest.formData && transportRequest.formData.length > 0) ||
554+
request.operation() === operations_1.default.PNDownloadFileOperation) {
555+
// Set file upload / download request delay.
556+
transportRequest.timeout = this._configuration.getFileTimeout();
556557
}
557558
else {
558559
if (request.operation() === operations_1.default.PNSubscribeOperation)

lib/transport/middleware.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ class PubNubMiddleware {
9393
req.queryParameters = {};
9494
// Modify request with required information.
9595
if (clientConfiguration.useInstanceId)
96-
req.queryParameters['instanceid'] = clientConfiguration.instanceId;
96+
req.queryParameters['instanceid'] = clientConfiguration.getInstanceId();
9797
if (!req.queryParameters['uuid'])
9898
req.queryParameters['uuid'] = clientConfiguration.userId;
9999
if (clientConfiguration.useRequestId)

lib/types/index.d.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2497,6 +2497,15 @@ declare namespace PubNub {
24972497
* @default `310` seconds
24982498
*/
24992499
subscribeRequestTimeout?: number;
2500+
/**
2501+
* File upload / download request timeout in milliseconds.
2502+
*
2503+
* Maximum duration for which PubNub client should wait for file upload / download request
2504+
* completion.
2505+
*
2506+
* @default `300` seconds
2507+
*/
2508+
fileRequestTimeout?: number;
25002509
/**
25012510
* `true` to allow catch up on the front-end applications.
25022511
*

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "pubnub",
3-
"version": "8.4.1",
3+
"version": "8.5.0",
44
"author": "PubNub <support@pubnub.com>",
55
"description": "Publish & Subscribe Real-time Messaging with PubNub",
66
"scripts": {

src/core/components/configuration.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,10 @@ export const makeConfiguration = (
103103
if (this.useInstanceId) return this._instanceId;
104104
return undefined;
105105
},
106+
getInstanceId(): string | undefined {
107+
if (this.useInstanceId) return this._instanceId;
108+
return undefined;
109+
},
106110
getUserId() {
107111
return this.userId!;
108112
},
@@ -167,11 +171,14 @@ export const makeConfiguration = (
167171
getSubscribeTimeout(): number {
168172
return this.subscribeRequestTimeout!;
169173
},
174+
getFileTimeout(): number {
175+
return this.fileRequestTimeout!;
176+
},
170177
get PubNubFile(): PubNubFileConstructor<PubNubFileInterface, unknown> | undefined {
171178
return base.PubNubFile;
172179
},
173180
get version(): string {
174-
return '8.4.1';
181+
return '8.5.0';
175182
},
176183
getVersion(): string {
177184
return this.version;

src/core/interfaces/configuration.ts

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,11 @@ const TRANSACTIONAL_REQUEST_TIMEOUT = 15;
9999
*/
100100
const SUBSCRIBE_REQUEST_TIMEOUT = 310;
101101

102+
/**
103+
* File upload / download request timeout.
104+
*/
105+
const FILE_REQUEST_TIMEOUT = 300;
106+
102107
/**
103108
* Default user presence timeout.
104109
*/
@@ -218,6 +223,16 @@ export type UserConfiguration = {
218223
*/
219224
subscribeRequestTimeout?: number;
220225

226+
/**
227+
* File upload / download request timeout in milliseconds.
228+
*
229+
* Maximum duration for which PubNub client should wait for file upload / download request
230+
* completion.
231+
*
232+
* @default `300` seconds
233+
*/
234+
fileRequestTimeout?: number;
235+
221236
/**
222237
* `true` to allow catch up on the front-end applications.
223238
*
@@ -617,6 +632,14 @@ export interface PrivateClientConfiguration
617632
*/
618633
getSubscribeTimeout(): number;
619634

635+
/**
636+
* File requests timeout.
637+
*
638+
* @returns Maximum duration in milliseconds for which PubNub client should wait for
639+
* file upload / download request completion.
640+
*/
641+
getFileTimeout(): number;
642+
620643
/**
621644
* PubNub file object constructor.
622645
*/
@@ -629,6 +652,13 @@ export interface PrivateClientConfiguration
629652
*/
630653
get instanceId(): string | undefined;
631654

655+
/**
656+
* Get PubNub client instance identifier.
657+
*
658+
* @returns Current PubNub client instance identifier.
659+
*/
660+
getInstanceId(): string | undefined;
661+
632662
/**
633663
* Get SDK family identifier.
634664
*
@@ -698,6 +728,7 @@ export const setDefaults = (configuration: UserConfiguration): ExtendedConfigura
698728
configurationCopy.ssl ??= USE_SSL;
699729
configurationCopy.transactionalRequestTimeout ??= TRANSACTIONAL_REQUEST_TIMEOUT;
700730
configurationCopy.subscribeRequestTimeout ??= SUBSCRIBE_REQUEST_TIMEOUT;
731+
configurationCopy.fileRequestTimeout ??= FILE_REQUEST_TIMEOUT;
701732
configurationCopy.restore ??= RESTORE;
702733
configurationCopy.useInstanceId ??= USE_INSTANCE_ID;
703734
configurationCopy.suppressLeaveEvents ??= SUPPRESS_LEAVE_EVENTS;

0 commit comments

Comments
 (0)