Skip to content

Commit 75d2ea6

Browse files
committed
feat: add timeout option
1 parent 7a6d697 commit 75d2ea6

File tree

3 files changed

+23
-3
lines changed

3 files changed

+23
-3
lines changed

readme.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,10 @@ socket.on('connection', (socket) => {
218218

219219
## Api Reference
220220

221+
### constructor(setting: { timeout: number })
222+
223+
`timeout` default timeout setting
224+
221225
### Server.receiveData(data: RemoteData)
222226

223227
Receive a remote data from another server.
@@ -231,7 +235,7 @@ Add a listener on `target` path, which will call `callback` when `receiveData` w
231235

232236
Remove listener on target. This will remove all callbacks when callback params was not set.
233237

234-
### Server.registerPromise(target: string, data: any)
238+
### Server.registerPromise(target: string, data: any, option: { timeout: number })
235239

236240
Register a promise and pass to anther server which listen `target` path.
237241

src/Server.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@ export type RemoteCallBack = (
1313
reject?: (ret: any) => void,
1414
remoteData?: RemoteData,
1515
) => any;
16+
export const NO_TIMEOUT = -1;
1617
export class Server {
18+
constructor(private readonly setting: { timeout: number } = { timeout: NO_TIMEOUT }) {}
1719
protected promiseMap: {
1820
[key: string]: RemoteAsyncObject<any>;
1921
} = {};
@@ -99,10 +101,10 @@ export class Server {
99101
/**
100102
* Register a promise and pass to anther server which listen `target` path.
101103
*/
102-
registerPromise<T = any, Payload = any>(target: string, data?: Payload): Promise<T> {
104+
registerPromise<T = any, Payload = any>(target: string, data?: Payload, option?: { timeout: number }): Promise<T> {
103105
const uuid = uuidv4();
104106
let resolver: (value: T | PromiseLike<T>) => void = () => {};
105-
let ejector = () => {};
107+
let ejector = (params: any) => {};
106108
const promise = new Promise<T>((resolve, reject) => {
107109
resolver = resolve;
108110
ejector = reject;
@@ -114,6 +116,10 @@ export class Server {
114116
data: this.dataStringify(typeof data === 'undefined' || data === null ? {} : data),
115117
target,
116118
});
119+
const timeout = option?.timeout ?? this.setting.timeout ?? NO_TIMEOUT;
120+
if (timeout !== NO_TIMEOUT && timeout >= 0) {
121+
setTimeout(() => ejector(new Error('ErrorTimeout')), timeout);
122+
}
117123
return promise;
118124
}
119125
}

tests/inner.spec.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,16 @@ describe('remoteAsync:inner test', () => {
3434
expect(returnedValue).toEqual(retObject);
3535
});
3636

37+
test('timeout', async () => {
38+
const defer = (time: number) => new Promise((resolve) => setTimeout(resolve, time));
39+
const listener = new Server({ timeout: 5 });
40+
listener.registerSender(() => {});
41+
await expect(() => listener.registerPromise('dataSend', { a: 1 })).rejects.toThrowError('ErrorTimeout');
42+
await expect(
43+
Promise.race([listener.registerPromise('dataSend', { a: 2 }, { timeout: 20 }), defer(30)]),
44+
).rejects.toThrowError('ErrorTimeout');
45+
});
46+
3747
test('reject data', async () => {
3848
const listener = new Server();
3949
const object = { a: 1 };

0 commit comments

Comments
 (0)