@blackglory/estore-js 0.6.1 → 0.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +36 -12
- package/lib/contract.d.ts +9 -1
- package/lib/contract.js +1 -1
- package/lib/contract.js.map +1 -1
- package/lib/estore-client.d.ts +15 -10
- package/lib/estore-client.js +36 -24
- package/lib/estore-client.js.map +1 -1
- package/package.json +23 -23
- package/src/contract.ts +18 -2
- package/src/estore-client.ts +79 -25
package/README.md
CHANGED
|
@@ -13,48 +13,61 @@ interface INamespaceStats {
|
|
|
13
13
|
items: number
|
|
14
14
|
}
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
interface IEStoreClientOptions {
|
|
17
17
|
server: string
|
|
18
18
|
timeout?: number
|
|
19
19
|
retryIntervalForReconnection?: number
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
interface IEStoreClientRequestOptions {
|
|
23
|
+
signal?: AbortSignal
|
|
24
|
+
timeout?: number | false
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
class EStoreClient {
|
|
23
28
|
static create(options: IEStoreClientOptions): Promise<EStoreClient>
|
|
24
29
|
|
|
25
30
|
close(): Promise<void>
|
|
26
31
|
|
|
27
32
|
getNamespaceStats(
|
|
28
33
|
namespace: string
|
|
29
|
-
,
|
|
34
|
+
, signalOrOptions?: AbortSignal | IEStoreClientRequestOptions
|
|
30
35
|
): Promise<INamespaceStats>
|
|
31
36
|
|
|
32
|
-
getAllNamespaces(
|
|
37
|
+
getAllNamespaces(
|
|
38
|
+
signalOrOptions?: AbortSignal | IEStoreClientRequestOptions
|
|
39
|
+
): Promise<string[]>
|
|
33
40
|
|
|
34
|
-
getAllItemIds(
|
|
41
|
+
getAllItemIds(
|
|
42
|
+
namespace: string
|
|
43
|
+
, signalOrOptions?: AbortSignal | IEStoreClientRequestOptions
|
|
44
|
+
): Promise<string[]>
|
|
35
45
|
|
|
36
46
|
getAllEvents(
|
|
37
47
|
namespace: string
|
|
38
48
|
, itemId: string
|
|
39
|
-
,
|
|
49
|
+
, signalOrOptions?: AbortSignal | IEStoreClientRequestOptions
|
|
40
50
|
): Promise<JSONValue[]>
|
|
41
51
|
|
|
42
|
-
clearItemsByNamespace(
|
|
52
|
+
clearItemsByNamespace(
|
|
53
|
+
namespace: string
|
|
54
|
+
, signalOrOptions?: AbortSignal | IEStoreClientRequestOptions
|
|
55
|
+
): Promise<void>
|
|
43
56
|
|
|
44
57
|
removeItem(
|
|
45
58
|
namespace: string
|
|
46
59
|
, itemId: string
|
|
47
|
-
,
|
|
60
|
+
, signalOrOptions?: AbortSignal | IEStoreClientRequestOptions
|
|
48
61
|
): Promise<void>
|
|
49
62
|
|
|
50
63
|
getItemSize(
|
|
51
64
|
namespace: string
|
|
52
65
|
, itemId: string
|
|
53
|
-
,
|
|
66
|
+
, signalOrOptions?: AbortSignal | IEStoreClientRequestOptions
|
|
54
67
|
): Promise<number>
|
|
55
68
|
|
|
56
69
|
/**
|
|
57
|
-
* @param nextEventIndex 如果指定,
|
|
70
|
+
* @param nextEventIndex 如果指定, 则会在不匹配下一个index时抛出EventIndexConflict错误.
|
|
58
71
|
* @throws {EventIndexConflict}
|
|
59
72
|
*/
|
|
60
73
|
appendEvent(
|
|
@@ -62,14 +75,25 @@ export class EStoreClient {
|
|
|
62
75
|
, itemId: string
|
|
63
76
|
, event: JSONValue
|
|
64
77
|
, nextEventIndex?: number
|
|
65
|
-
,
|
|
78
|
+
, signalOrOptions?: AbortSignal | IEStoreClientRequestOptions
|
|
79
|
+
): Promise<void>
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* @param lastEventIndex 如果指定, 则会在不匹配最后一个index时抛出EventIndexConflict错误.
|
|
83
|
+
* @throws {EventIndexConflict}
|
|
84
|
+
*/
|
|
85
|
+
popEvent(
|
|
86
|
+
namespace: string
|
|
87
|
+
, itemId: string
|
|
88
|
+
, lastEventIndex?: number
|
|
89
|
+
, signalOrOptions?: AbortSignal | IEStoreClientRequestOptions
|
|
66
90
|
): Promise<void>
|
|
67
91
|
|
|
68
92
|
getEvent(
|
|
69
93
|
namespace: string
|
|
70
94
|
, itemId: string
|
|
71
95
|
, index: number
|
|
72
|
-
,
|
|
96
|
+
, signalOrOptions?: AbortSignal | IEStoreClientRequestOptions
|
|
73
97
|
): Promise<JSONValue | null>
|
|
74
98
|
}
|
|
75
99
|
```
|
package/lib/contract.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { CustomError } from '@blackglory/errors';
|
|
2
2
|
import { JSONValue } from 'justypes';
|
|
3
|
-
export declare const expectedVersion = "^0.4.
|
|
3
|
+
export declare const expectedVersion = "^0.4.1";
|
|
4
4
|
export interface INamespaceStats {
|
|
5
5
|
items: number;
|
|
6
6
|
}
|
|
@@ -22,6 +22,14 @@ export interface IAPI {
|
|
|
22
22
|
event: JSONValue,
|
|
23
23
|
nextEventIndex: number
|
|
24
24
|
]): null;
|
|
25
|
+
popEvent(...args: [
|
|
26
|
+
namespace: string,
|
|
27
|
+
itemId: string
|
|
28
|
+
] | [
|
|
29
|
+
namespace: string,
|
|
30
|
+
itemId: string,
|
|
31
|
+
lastEventIndex: number
|
|
32
|
+
]): null;
|
|
25
33
|
getEvent(namespace: string, itemId: string, eventIndex: number): JSONValue | null;
|
|
26
34
|
}
|
|
27
35
|
export declare class EventIndexConflict extends CustomError {
|
package/lib/contract.js
CHANGED
package/lib/contract.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contract.js","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAGhD,MAAM,CAAC,MAAM,eAAe,GAAG,QAAQ,CAAA;
|
|
1
|
+
{"version":3,"file":"contract.js","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAGhD,MAAM,CAAC,MAAM,eAAe,GAAG,QAAQ,CAAA;AAgEvC,MAAM,OAAO,kBAAmB,SAAQ,WAAW;CAAG"}
|
package/lib/estore-client.d.ts
CHANGED
|
@@ -7,6 +7,10 @@ export interface IEStoreClientOptions {
|
|
|
7
7
|
timeout?: number;
|
|
8
8
|
retryIntervalForReconnection?: number;
|
|
9
9
|
}
|
|
10
|
+
export interface IEStoreClientRequestOptions {
|
|
11
|
+
signal?: AbortSignal;
|
|
12
|
+
timeout?: number | false;
|
|
13
|
+
}
|
|
10
14
|
export declare class EStoreClient {
|
|
11
15
|
private client;
|
|
12
16
|
private closeClients;
|
|
@@ -14,14 +18,15 @@ export declare class EStoreClient {
|
|
|
14
18
|
static create(options: IEStoreClientOptions): Promise<EStoreClient>;
|
|
15
19
|
private constructor();
|
|
16
20
|
close(): Promise<void>;
|
|
17
|
-
getNamespaceStats(namespace: string,
|
|
18
|
-
getAllNamespaces(
|
|
19
|
-
getAllItemIds(namespace: string,
|
|
20
|
-
getAllEvents(namespace: string, itemId: string,
|
|
21
|
-
clearItemsByNamespace(namespace: string,
|
|
22
|
-
removeItem(namespace: string, itemId: string,
|
|
23
|
-
getItemSize(namespace: string, itemId: string,
|
|
24
|
-
appendEvent(namespace: string, itemId: string, event: JSONValue, nextEventIndex?: number,
|
|
25
|
-
|
|
26
|
-
|
|
21
|
+
getNamespaceStats(namespace: string, signalOrOptions?: AbortSignal | IEStoreClientRequestOptions): Promise<INamespaceStats>;
|
|
22
|
+
getAllNamespaces(signalOrOptions?: AbortSignal | IEStoreClientRequestOptions): Promise<string[]>;
|
|
23
|
+
getAllItemIds(namespace: string, signalOrOptions?: AbortSignal | IEStoreClientRequestOptions): Promise<string[]>;
|
|
24
|
+
getAllEvents(namespace: string, itemId: string, signalOrOptions?: AbortSignal | IEStoreClientRequestOptions): Promise<JSONValue[]>;
|
|
25
|
+
clearItemsByNamespace(namespace: string, signalOrOptions?: AbortSignal | IEStoreClientRequestOptions): Promise<void>;
|
|
26
|
+
removeItem(namespace: string, itemId: string, signalOrOptions?: AbortSignal | IEStoreClientRequestOptions): Promise<void>;
|
|
27
|
+
getItemSize(namespace: string, itemId: string, signalOrOptions?: AbortSignal | IEStoreClientRequestOptions): Promise<number>;
|
|
28
|
+
appendEvent(namespace: string, itemId: string, event: JSONValue, nextEventIndex?: number, signalOrOptions?: AbortSignal | IEStoreClientRequestOptions): Promise<void>;
|
|
29
|
+
popEvent(namespace: string, itemId: string, lastEventIndex?: number, signalOrOptions?: AbortSignal | IEStoreClientRequestOptions): Promise<void>;
|
|
30
|
+
getEvent(namespace: string, itemId: string, index: number, signalOrOptions?: AbortSignal | IEStoreClientRequestOptions): Promise<JSONValue | null>;
|
|
31
|
+
private createSignal;
|
|
27
32
|
}
|
package/lib/estore-client.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { createRPCClient } from "./utils/rpc-client.js";
|
|
2
|
-
import { raceAbortSignals, timeoutSignal } from 'extra-abort';
|
|
3
|
-
import {
|
|
2
|
+
import { isAbortSignal, raceAbortSignals, timeoutSignal } from 'extra-abort';
|
|
3
|
+
import { isUndefined } from '@blackglory/prelude';
|
|
4
4
|
export { EventIndexConflict } from './contract.js';
|
|
5
5
|
export class EStoreClient {
|
|
6
6
|
static async create(options) {
|
|
@@ -15,42 +15,54 @@ export class EStoreClient {
|
|
|
15
15
|
async close() {
|
|
16
16
|
await this.closeClients();
|
|
17
17
|
}
|
|
18
|
-
async getNamespaceStats(namespace,
|
|
19
|
-
return await this.client.getNamespaceStats(namespace, this.
|
|
18
|
+
async getNamespaceStats(namespace, signalOrOptions) {
|
|
19
|
+
return await this.client.getNamespaceStats(namespace, this.createSignal(signalOrOptions));
|
|
20
20
|
}
|
|
21
|
-
async getAllNamespaces(
|
|
22
|
-
return await this.client.getAllNamespaces(this.
|
|
21
|
+
async getAllNamespaces(signalOrOptions) {
|
|
22
|
+
return await this.client.getAllNamespaces(this.createSignal(signalOrOptions));
|
|
23
23
|
}
|
|
24
|
-
async getAllItemIds(namespace,
|
|
25
|
-
return await this.client.getAllItemIds(namespace, this.
|
|
24
|
+
async getAllItemIds(namespace, signalOrOptions) {
|
|
25
|
+
return await this.client.getAllItemIds(namespace, this.createSignal(signalOrOptions));
|
|
26
26
|
}
|
|
27
|
-
async getAllEvents(namespace, itemId,
|
|
28
|
-
return await this.client.getAllEvents(namespace, itemId, this.
|
|
27
|
+
async getAllEvents(namespace, itemId, signalOrOptions) {
|
|
28
|
+
return await this.client.getAllEvents(namespace, itemId, this.createSignal(signalOrOptions));
|
|
29
29
|
}
|
|
30
|
-
async clearItemsByNamespace(namespace,
|
|
31
|
-
await this.client.clearItemsByNamespace(namespace, this.
|
|
30
|
+
async clearItemsByNamespace(namespace, signalOrOptions) {
|
|
31
|
+
await this.client.clearItemsByNamespace(namespace, this.createSignal(signalOrOptions));
|
|
32
32
|
}
|
|
33
|
-
async removeItem(namespace, itemId,
|
|
34
|
-
await this.client.removeItem(namespace, itemId, this.
|
|
33
|
+
async removeItem(namespace, itemId, signalOrOptions) {
|
|
34
|
+
await this.client.removeItem(namespace, itemId, this.createSignal(signalOrOptions));
|
|
35
35
|
}
|
|
36
|
-
async getItemSize(namespace, itemId,
|
|
37
|
-
return await this.client.getItemSize(namespace, itemId, this.
|
|
36
|
+
async getItemSize(namespace, itemId, signalOrOptions) {
|
|
37
|
+
return await this.client.getItemSize(namespace, itemId, this.createSignal(signalOrOptions));
|
|
38
38
|
}
|
|
39
|
-
async appendEvent(namespace, itemId, event, nextEventIndex,
|
|
39
|
+
async appendEvent(namespace, itemId, event, nextEventIndex, signalOrOptions) {
|
|
40
40
|
if (isUndefined(nextEventIndex)) {
|
|
41
|
-
await this.client.appendEvent(namespace, itemId, event, this.
|
|
41
|
+
await this.client.appendEvent(namespace, itemId, event, this.createSignal(signalOrOptions));
|
|
42
42
|
}
|
|
43
43
|
else {
|
|
44
|
-
await this.client.appendEvent(namespace, itemId, event, nextEventIndex, this.
|
|
44
|
+
await this.client.appendEvent(namespace, itemId, event, nextEventIndex, this.createSignal(signalOrOptions));
|
|
45
45
|
}
|
|
46
46
|
}
|
|
47
|
-
async
|
|
48
|
-
|
|
47
|
+
async popEvent(namespace, itemId, lastEventIndex, signalOrOptions) {
|
|
48
|
+
if (isUndefined(lastEventIndex)) {
|
|
49
|
+
await this.client.popEvent(namespace, itemId, this.createSignal(signalOrOptions));
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
await this.client.popEvent(namespace, itemId, lastEventIndex, this.createSignal(signalOrOptions));
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
async getEvent(namespace, itemId, index, signalOrOptions) {
|
|
56
|
+
return await this.client.getEvent(namespace, itemId, index, this.createSignal(signalOrOptions));
|
|
49
57
|
}
|
|
50
|
-
|
|
58
|
+
createSignal(signalOrOptions = {}) {
|
|
59
|
+
var _a;
|
|
60
|
+
const options = isAbortSignal(signalOrOptions)
|
|
61
|
+
? { signal: signalOrOptions }
|
|
62
|
+
: signalOrOptions;
|
|
51
63
|
return raceAbortSignals([
|
|
52
|
-
|
|
53
|
-
|
|
64
|
+
options.signal,
|
|
65
|
+
options.timeout !== false && ((_a = (options.timeout && timeoutSignal(options.timeout))) !== null && _a !== void 0 ? _a : (this.timeout && timeoutSignal(this.timeout)))
|
|
54
66
|
]);
|
|
55
67
|
}
|
|
56
68
|
}
|
package/lib/estore-client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"estore-client.js","sourceRoot":"","sources":["../src/estore-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,8BAA4B;AAGtD,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"estore-client.js","sourceRoot":"","sources":["../src/estore-client.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@blackglory/estore-js",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.1",
|
|
4
4
|
"description": "",
|
|
5
5
|
"keywords": [],
|
|
6
6
|
"files": [
|
|
@@ -41,36 +41,36 @@
|
|
|
41
41
|
}
|
|
42
42
|
},
|
|
43
43
|
"devDependencies": {
|
|
44
|
-
"@commitlint/cli": "^
|
|
45
|
-
"@commitlint/config-conventional": "^
|
|
46
|
-
"@eslint/js": "^
|
|
44
|
+
"@commitlint/cli": "^20.4.4",
|
|
45
|
+
"@commitlint/config-conventional": "^20.4.4",
|
|
46
|
+
"@eslint/js": "^10.0.1",
|
|
47
47
|
"@types/ws": "^8.18.1",
|
|
48
|
-
"cross-env": "^
|
|
49
|
-
"eslint": "^
|
|
50
|
-
"extra-utils": "^
|
|
48
|
+
"cross-env": "^10.1.0",
|
|
49
|
+
"eslint": "^10.0.3",
|
|
50
|
+
"extra-utils": "^6.1.0",
|
|
51
51
|
"husky": "4",
|
|
52
52
|
"npm-run-all": "^4.1.5",
|
|
53
|
-
"rimraf": "^6.
|
|
53
|
+
"rimraf": "^6.1.3",
|
|
54
54
|
"standard-version": "^9.3.2",
|
|
55
55
|
"ts-patch": "^3.3.0",
|
|
56
56
|
"tslib": "^2.8.1",
|
|
57
|
-
"typescript": "5.
|
|
58
|
-
"typescript-eslint": "^8.
|
|
59
|
-
"typescript-transform-paths": "^3.5.
|
|
60
|
-
"vite": "^
|
|
61
|
-
"vite-tsconfig-paths": "^
|
|
62
|
-
"vitest": "^
|
|
57
|
+
"typescript": "5.9.3",
|
|
58
|
+
"typescript-eslint": "^8.57.0",
|
|
59
|
+
"typescript-transform-paths": "^3.5.6",
|
|
60
|
+
"vite": "^8.0.0",
|
|
61
|
+
"vite-tsconfig-paths": "^6.1.1",
|
|
62
|
+
"vitest": "^4.1.0"
|
|
63
63
|
},
|
|
64
64
|
"dependencies": {
|
|
65
|
-
"@blackglory/errors": "^3.0
|
|
65
|
+
"@blackglory/errors": "^3.1.0",
|
|
66
66
|
"@blackglory/prelude": "^0.4.0",
|
|
67
|
-
"@delight-rpc/extra-native-websocket": "^0.6.
|
|
68
|
-
"@delight-rpc/extra-websocket": "^0.7.
|
|
69
|
-
"delight-rpc": "^
|
|
70
|
-
"extra-abort": "^0.4.
|
|
71
|
-
"extra-native-websocket": "^0.5.
|
|
72
|
-
"extra-websocket": "^0.5.
|
|
73
|
-
"justypes": "^4.
|
|
74
|
-
"ws": "^8.
|
|
67
|
+
"@delight-rpc/extra-native-websocket": "^0.6.6",
|
|
68
|
+
"@delight-rpc/extra-websocket": "^0.7.8",
|
|
69
|
+
"delight-rpc": "^7.0.0",
|
|
70
|
+
"extra-abort": "^0.4.1",
|
|
71
|
+
"extra-native-websocket": "^0.5.1",
|
|
72
|
+
"extra-websocket": "^0.5.1",
|
|
73
|
+
"justypes": "^4.5.0",
|
|
74
|
+
"ws": "^8.19.0"
|
|
75
75
|
}
|
|
76
76
|
}
|
package/src/contract.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { CustomError } from '@blackglory/errors'
|
|
2
2
|
import { JSONValue } from 'justypes'
|
|
3
3
|
|
|
4
|
-
export const expectedVersion = '^0.4.
|
|
4
|
+
export const expectedVersion = '^0.4.1'
|
|
5
5
|
|
|
6
6
|
export interface INamespaceStats {
|
|
7
7
|
items: number
|
|
@@ -25,7 +25,7 @@ export interface IAPI {
|
|
|
25
25
|
getItemSize(namespace: string, itemId: string): number
|
|
26
26
|
|
|
27
27
|
/**
|
|
28
|
-
* @param nextEventIndex 如果指定,
|
|
28
|
+
* @param nextEventIndex 如果指定, 则会在不匹配下一个index时抛出EventIndexConflict错误.
|
|
29
29
|
* @throws {EventIndexConflict}
|
|
30
30
|
*/
|
|
31
31
|
appendEvent(...args:
|
|
@@ -42,6 +42,22 @@ export interface IAPI {
|
|
|
42
42
|
]
|
|
43
43
|
): null
|
|
44
44
|
|
|
45
|
+
/**
|
|
46
|
+
* @param lastEventIndex 如果指定, 则会在不匹配最后一个index时抛出EventIndexConflict错误.
|
|
47
|
+
* @throws {EventIndexConflict}
|
|
48
|
+
*/
|
|
49
|
+
popEvent(...args:
|
|
50
|
+
| [
|
|
51
|
+
namespace: string
|
|
52
|
+
, itemId: string
|
|
53
|
+
]
|
|
54
|
+
| [
|
|
55
|
+
namespace: string
|
|
56
|
+
, itemId: string
|
|
57
|
+
, lastEventIndex: number
|
|
58
|
+
]
|
|
59
|
+
): null
|
|
60
|
+
|
|
45
61
|
getEvent(
|
|
46
62
|
namespace: string
|
|
47
63
|
, itemId: string
|
package/src/estore-client.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { createRPCClient } from '@utils/rpc-client.js'
|
|
2
2
|
import { ClientProxy } from 'delight-rpc'
|
|
3
3
|
import { IAPI, INamespaceStats } from './contract.js'
|
|
4
|
-
import { raceAbortSignals, timeoutSignal } from 'extra-abort'
|
|
5
|
-
import {
|
|
4
|
+
import { isAbortSignal, raceAbortSignals, timeoutSignal } from 'extra-abort'
|
|
5
|
+
import { isUndefined, JSONValue } from '@blackglory/prelude'
|
|
6
6
|
export { INamespaceStats } from './contract.js'
|
|
7
7
|
export { EventIndexConflict } from './contract.js'
|
|
8
8
|
|
|
@@ -12,6 +12,11 @@ export interface IEStoreClientOptions {
|
|
|
12
12
|
retryIntervalForReconnection?: number
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
+
export interface IEStoreClientRequestOptions {
|
|
16
|
+
signal?: AbortSignal
|
|
17
|
+
timeout?: number | false
|
|
18
|
+
}
|
|
19
|
+
|
|
15
20
|
export class EStoreClient {
|
|
16
21
|
static async create(options: IEStoreClientOptions): Promise<EStoreClient> {
|
|
17
22
|
const { client, close } = await createRPCClient(
|
|
@@ -34,66 +39,80 @@ export class EStoreClient {
|
|
|
34
39
|
|
|
35
40
|
async getNamespaceStats(
|
|
36
41
|
namespace: string
|
|
37
|
-
,
|
|
42
|
+
, signalOrOptions?: AbortSignal | IEStoreClientRequestOptions
|
|
38
43
|
): Promise<INamespaceStats> {
|
|
39
44
|
return await this.client.getNamespaceStats(
|
|
40
45
|
namespace
|
|
41
|
-
, this.
|
|
46
|
+
, this.createSignal(signalOrOptions)
|
|
42
47
|
)
|
|
43
48
|
}
|
|
44
49
|
|
|
45
|
-
async getAllNamespaces(
|
|
46
|
-
|
|
50
|
+
async getAllNamespaces(
|
|
51
|
+
signalOrOptions?: AbortSignal | IEStoreClientRequestOptions
|
|
52
|
+
): Promise<string[]> {
|
|
53
|
+
return await this.client.getAllNamespaces(
|
|
54
|
+
this.createSignal(signalOrOptions)
|
|
55
|
+
)
|
|
47
56
|
}
|
|
48
57
|
|
|
49
58
|
async getAllItemIds(
|
|
50
59
|
namespace: string
|
|
51
|
-
,
|
|
60
|
+
, signalOrOptions?: AbortSignal | IEStoreClientRequestOptions
|
|
52
61
|
): Promise<string[]> {
|
|
53
|
-
return await this.client.getAllItemIds(
|
|
62
|
+
return await this.client.getAllItemIds(
|
|
63
|
+
namespace
|
|
64
|
+
, this.createSignal(signalOrOptions)
|
|
65
|
+
)
|
|
54
66
|
}
|
|
55
67
|
|
|
56
68
|
async getAllEvents(
|
|
57
69
|
namespace: string
|
|
58
70
|
, itemId: string
|
|
59
|
-
,
|
|
71
|
+
, signalOrOptions?: AbortSignal | IEStoreClientRequestOptions
|
|
60
72
|
): Promise<JSONValue[]> {
|
|
61
73
|
return await this.client.getAllEvents(
|
|
62
74
|
namespace
|
|
63
75
|
, itemId
|
|
64
|
-
, this.
|
|
76
|
+
, this.createSignal(signalOrOptions)
|
|
65
77
|
)
|
|
66
78
|
}
|
|
67
79
|
|
|
68
80
|
async clearItemsByNamespace(
|
|
69
81
|
namespace: string
|
|
70
|
-
,
|
|
82
|
+
, signalOrOptions?: AbortSignal | IEStoreClientRequestOptions
|
|
71
83
|
): Promise<void> {
|
|
72
|
-
await this.client.clearItemsByNamespace(
|
|
84
|
+
await this.client.clearItemsByNamespace(
|
|
85
|
+
namespace
|
|
86
|
+
, this.createSignal(signalOrOptions)
|
|
87
|
+
)
|
|
73
88
|
}
|
|
74
89
|
|
|
75
90
|
async removeItem(
|
|
76
91
|
namespace: string
|
|
77
92
|
, itemId: string
|
|
78
|
-
,
|
|
93
|
+
, signalOrOptions?: AbortSignal | IEStoreClientRequestOptions
|
|
79
94
|
): Promise<void> {
|
|
80
|
-
await this.client.removeItem(
|
|
95
|
+
await this.client.removeItem(
|
|
96
|
+
namespace
|
|
97
|
+
, itemId
|
|
98
|
+
, this.createSignal(signalOrOptions)
|
|
99
|
+
)
|
|
81
100
|
}
|
|
82
101
|
|
|
83
102
|
async getItemSize(
|
|
84
103
|
namespace: string
|
|
85
104
|
, itemId: string
|
|
86
|
-
,
|
|
105
|
+
, signalOrOptions?: AbortSignal | IEStoreClientRequestOptions
|
|
87
106
|
): Promise<number> {
|
|
88
107
|
return await this.client.getItemSize(
|
|
89
108
|
namespace
|
|
90
109
|
, itemId
|
|
91
|
-
, this.
|
|
110
|
+
, this.createSignal(signalOrOptions)
|
|
92
111
|
)
|
|
93
112
|
}
|
|
94
113
|
|
|
95
114
|
/**
|
|
96
|
-
* @param nextEventIndex 如果指定,
|
|
115
|
+
* @param nextEventIndex 如果指定, 则会在不匹配下一个index时抛出EventIndexConflict错误.
|
|
97
116
|
* @throws {EventIndexConflict}
|
|
98
117
|
*/
|
|
99
118
|
async appendEvent(
|
|
@@ -101,14 +120,14 @@ export class EStoreClient {
|
|
|
101
120
|
, itemId: string
|
|
102
121
|
, event: JSONValue
|
|
103
122
|
, nextEventIndex?: number
|
|
104
|
-
,
|
|
123
|
+
, signalOrOptions?: AbortSignal | IEStoreClientRequestOptions
|
|
105
124
|
): Promise<void> {
|
|
106
125
|
if (isUndefined(nextEventIndex)) {
|
|
107
126
|
await this.client.appendEvent(
|
|
108
127
|
namespace
|
|
109
128
|
, itemId
|
|
110
129
|
, event
|
|
111
|
-
, this.
|
|
130
|
+
, this.createSignal(signalOrOptions)
|
|
112
131
|
)
|
|
113
132
|
} else {
|
|
114
133
|
await this.client.appendEvent(
|
|
@@ -116,7 +135,33 @@ export class EStoreClient {
|
|
|
116
135
|
, itemId
|
|
117
136
|
, event
|
|
118
137
|
, nextEventIndex
|
|
119
|
-
, this.
|
|
138
|
+
, this.createSignal(signalOrOptions)
|
|
139
|
+
)
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* @param lastEventIndex 如果指定, 则会在不匹配最后一个index时抛出EventIndexConflict错误.
|
|
145
|
+
* @throws {EventIndexConflict}
|
|
146
|
+
*/
|
|
147
|
+
async popEvent(
|
|
148
|
+
namespace: string
|
|
149
|
+
, itemId: string
|
|
150
|
+
, lastEventIndex?: number
|
|
151
|
+
, signalOrOptions?: AbortSignal | IEStoreClientRequestOptions
|
|
152
|
+
): Promise<void> {
|
|
153
|
+
if (isUndefined(lastEventIndex)) {
|
|
154
|
+
await this.client.popEvent(
|
|
155
|
+
namespace
|
|
156
|
+
, itemId
|
|
157
|
+
, this.createSignal(signalOrOptions)
|
|
158
|
+
)
|
|
159
|
+
} else {
|
|
160
|
+
await this.client.popEvent(
|
|
161
|
+
namespace
|
|
162
|
+
, itemId
|
|
163
|
+
, lastEventIndex
|
|
164
|
+
, this.createSignal(signalOrOptions)
|
|
120
165
|
)
|
|
121
166
|
}
|
|
122
167
|
}
|
|
@@ -125,20 +170,29 @@ export class EStoreClient {
|
|
|
125
170
|
namespace: string
|
|
126
171
|
, itemId: string
|
|
127
172
|
, index: number
|
|
128
|
-
,
|
|
173
|
+
, signalOrOptions?: AbortSignal | IEStoreClientRequestOptions
|
|
129
174
|
): Promise<JSONValue | null> {
|
|
130
175
|
return await this.client.getEvent(
|
|
131
176
|
namespace
|
|
132
177
|
, itemId
|
|
133
178
|
, index
|
|
134
|
-
, this.
|
|
179
|
+
, this.createSignal(signalOrOptions)
|
|
135
180
|
)
|
|
136
181
|
}
|
|
137
182
|
|
|
138
|
-
private
|
|
183
|
+
private createSignal(
|
|
184
|
+
signalOrOptions: AbortSignal | IEStoreClientRequestOptions = {}
|
|
185
|
+
): AbortSignal {
|
|
186
|
+
const options: IEStoreClientRequestOptions = isAbortSignal(signalOrOptions)
|
|
187
|
+
? { signal: signalOrOptions }
|
|
188
|
+
: signalOrOptions
|
|
189
|
+
|
|
139
190
|
return raceAbortSignals([
|
|
140
|
-
|
|
141
|
-
,
|
|
191
|
+
options.signal
|
|
192
|
+
, options.timeout !== false && (
|
|
193
|
+
(options.timeout && timeoutSignal(options.timeout)) ??
|
|
194
|
+
(this.timeout && timeoutSignal(this.timeout))
|
|
195
|
+
)
|
|
142
196
|
])
|
|
143
197
|
}
|
|
144
198
|
}
|