@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 CHANGED
@@ -13,48 +13,61 @@ interface INamespaceStats {
13
13
  items: number
14
14
  }
15
15
 
16
- export interface IEStoreClientOptions {
16
+ interface IEStoreClientOptions {
17
17
  server: string
18
18
  timeout?: number
19
19
  retryIntervalForReconnection?: number
20
20
  }
21
21
 
22
- export class EStoreClient {
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
- , signal?: AbortSignal
34
+ , signalOrOptions?: AbortSignal | IEStoreClientRequestOptions
30
35
  ): Promise<INamespaceStats>
31
36
 
32
- getAllNamespaces(signal?: AbortSignal): Promise<string[]>
37
+ getAllNamespaces(
38
+ signalOrOptions?: AbortSignal | IEStoreClientRequestOptions
39
+ ): Promise<string[]>
33
40
 
34
- getAllItemIds(namespace: string, signal?: AbortSignal): Promise<string[]>
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
- , signal?: AbortSignal
49
+ , signalOrOptions?: AbortSignal | IEStoreClientRequestOptions
40
50
  ): Promise<JSONValue[]>
41
51
 
42
- clearItemsByNamespace(namespace: string, signal?: AbortSignal): Promise<void>
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
- , signal?: AbortSignal
60
+ , signalOrOptions?: AbortSignal | IEStoreClientRequestOptions
48
61
  ): Promise<void>
49
62
 
50
63
  getItemSize(
51
64
  namespace: string
52
65
  , itemId: string
53
- , signal?: AbortSignal
66
+ , signalOrOptions?: AbortSignal | IEStoreClientRequestOptions
54
67
  ): Promise<number>
55
68
 
56
69
  /**
57
- * @param nextEventIndex 如果指定, 则会在eventIndex不等于下一个index时抛出EventIndexConflict错误.
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
- , signal?: ABortSignal
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
- , signal?: AbortSignal
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.0";
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
@@ -1,5 +1,5 @@
1
1
  import { CustomError } from '@blackglory/errors';
2
- export const expectedVersion = '^0.4.0';
2
+ export const expectedVersion = '^0.4.1';
3
3
  export class EventIndexConflict extends CustomError {
4
4
  }
5
5
  //# sourceMappingURL=contract.js.map
@@ -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;AAgDvC,MAAM,OAAO,kBAAmB,SAAQ,WAAW;CAAG"}
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"}
@@ -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, signal?: AbortSignal): Promise<INamespaceStats>;
18
- getAllNamespaces(signal?: AbortSignal): Promise<string[]>;
19
- getAllItemIds(namespace: string, signal?: AbortSignal): Promise<string[]>;
20
- getAllEvents(namespace: string, itemId: string, signal?: AbortSignal): Promise<JSONValue[]>;
21
- clearItemsByNamespace(namespace: string, signal?: AbortSignal): Promise<void>;
22
- removeItem(namespace: string, itemId: string, signal?: AbortSignal): Promise<void>;
23
- getItemSize(namespace: string, itemId: string, signal?: AbortSignal): Promise<number>;
24
- appendEvent(namespace: string, itemId: string, event: JSONValue, nextEventIndex?: number, signal?: AbortSignal): Promise<void>;
25
- getEvent(namespace: string, itemId: string, index: number, signal?: AbortSignal): Promise<JSONValue | null>;
26
- private withTimeout;
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
  }
@@ -1,6 +1,6 @@
1
1
  import { createRPCClient } from "./utils/rpc-client.js";
2
- import { raceAbortSignals, timeoutSignal } from 'extra-abort';
3
- import { isntUndefined, isUndefined } from '@blackglory/prelude';
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, signal) {
19
- return await this.client.getNamespaceStats(namespace, this.withTimeout(signal));
18
+ async getNamespaceStats(namespace, signalOrOptions) {
19
+ return await this.client.getNamespaceStats(namespace, this.createSignal(signalOrOptions));
20
20
  }
21
- async getAllNamespaces(signal) {
22
- return await this.client.getAllNamespaces(this.withTimeout(signal));
21
+ async getAllNamespaces(signalOrOptions) {
22
+ return await this.client.getAllNamespaces(this.createSignal(signalOrOptions));
23
23
  }
24
- async getAllItemIds(namespace, signal) {
25
- return await this.client.getAllItemIds(namespace, this.withTimeout(signal));
24
+ async getAllItemIds(namespace, signalOrOptions) {
25
+ return await this.client.getAllItemIds(namespace, this.createSignal(signalOrOptions));
26
26
  }
27
- async getAllEvents(namespace, itemId, signal) {
28
- return await this.client.getAllEvents(namespace, itemId, this.withTimeout(signal));
27
+ async getAllEvents(namespace, itemId, signalOrOptions) {
28
+ return await this.client.getAllEvents(namespace, itemId, this.createSignal(signalOrOptions));
29
29
  }
30
- async clearItemsByNamespace(namespace, signal) {
31
- await this.client.clearItemsByNamespace(namespace, this.withTimeout(signal));
30
+ async clearItemsByNamespace(namespace, signalOrOptions) {
31
+ await this.client.clearItemsByNamespace(namespace, this.createSignal(signalOrOptions));
32
32
  }
33
- async removeItem(namespace, itemId, signal) {
34
- await this.client.removeItem(namespace, itemId, this.withTimeout(signal));
33
+ async removeItem(namespace, itemId, signalOrOptions) {
34
+ await this.client.removeItem(namespace, itemId, this.createSignal(signalOrOptions));
35
35
  }
36
- async getItemSize(namespace, itemId, signal) {
37
- return await this.client.getItemSize(namespace, itemId, this.withTimeout(signal));
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, signal) {
39
+ async appendEvent(namespace, itemId, event, nextEventIndex, signalOrOptions) {
40
40
  if (isUndefined(nextEventIndex)) {
41
- await this.client.appendEvent(namespace, itemId, event, this.withTimeout(signal));
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.withTimeout(signal));
44
+ await this.client.appendEvent(namespace, itemId, event, nextEventIndex, this.createSignal(signalOrOptions));
45
45
  }
46
46
  }
47
- async getEvent(namespace, itemId, index, signal) {
48
- return await this.client.getEvent(namespace, itemId, index, this.withTimeout(signal));
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
- withTimeout(signal) {
58
+ createSignal(signalOrOptions = {}) {
59
+ var _a;
60
+ const options = isAbortSignal(signalOrOptions)
61
+ ? { signal: signalOrOptions }
62
+ : signalOrOptions;
51
63
  return raceAbortSignals([
52
- isntUndefined(this.timeout) && timeoutSignal(this.timeout),
53
- signal
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
  }
@@ -1 +1 @@
1
- {"version":3,"file":"estore-client.js","sourceRoot":"","sources":["../src/estore-client.ts"],"names":[],"mappings":"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"}
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.6.1",
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": "^19.8.1",
45
- "@commitlint/config-conventional": "^19.8.1",
46
- "@eslint/js": "^9.31.0",
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": "^7.0.3",
49
- "eslint": "^9.31.0",
50
- "extra-utils": "^5.19.0",
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.0.1",
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.8.3",
58
- "typescript-eslint": "^8.38.0",
59
- "typescript-transform-paths": "^3.5.5",
60
- "vite": "^7.0.5",
61
- "vite-tsconfig-paths": "^5.1.4",
62
- "vitest": "^3.2.4"
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.3",
65
+ "@blackglory/errors": "^3.1.0",
66
66
  "@blackglory/prelude": "^0.4.0",
67
- "@delight-rpc/extra-native-websocket": "^0.6.1",
68
- "@delight-rpc/extra-websocket": "^0.7.1",
69
- "delight-rpc": "^6.1.2",
70
- "extra-abort": "^0.4.0",
71
- "extra-native-websocket": "^0.5.0",
72
- "extra-websocket": "^0.5.0",
73
- "justypes": "^4.4.1",
74
- "ws": "^8.18.3"
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.0'
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 如果指定, 则会在eventIndex不等于下一个index时抛出EventIndexConflict错误.
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
@@ -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 { isntUndefined, isUndefined, JSONValue } from '@blackglory/prelude'
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
- , signal?: AbortSignal
42
+ , signalOrOptions?: AbortSignal | IEStoreClientRequestOptions
38
43
  ): Promise<INamespaceStats> {
39
44
  return await this.client.getNamespaceStats(
40
45
  namespace
41
- , this.withTimeout(signal)
46
+ , this.createSignal(signalOrOptions)
42
47
  )
43
48
  }
44
49
 
45
- async getAllNamespaces(signal?: AbortSignal): Promise<string[]> {
46
- return await this.client.getAllNamespaces(this.withTimeout(signal))
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
- , signal?: AbortSignal
60
+ , signalOrOptions?: AbortSignal | IEStoreClientRequestOptions
52
61
  ): Promise<string[]> {
53
- return await this.client.getAllItemIds(namespace, this.withTimeout(signal))
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
- , signal?: AbortSignal
71
+ , signalOrOptions?: AbortSignal | IEStoreClientRequestOptions
60
72
  ): Promise<JSONValue[]> {
61
73
  return await this.client.getAllEvents(
62
74
  namespace
63
75
  , itemId
64
- , this.withTimeout(signal)
76
+ , this.createSignal(signalOrOptions)
65
77
  )
66
78
  }
67
79
 
68
80
  async clearItemsByNamespace(
69
81
  namespace: string
70
- , signal?: AbortSignal
82
+ , signalOrOptions?: AbortSignal | IEStoreClientRequestOptions
71
83
  ): Promise<void> {
72
- await this.client.clearItemsByNamespace(namespace, this.withTimeout(signal))
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
- , signal?: AbortSignal
93
+ , signalOrOptions?: AbortSignal | IEStoreClientRequestOptions
79
94
  ): Promise<void> {
80
- await this.client.removeItem(namespace, itemId, this.withTimeout(signal))
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
- , signal?: AbortSignal
105
+ , signalOrOptions?: AbortSignal | IEStoreClientRequestOptions
87
106
  ): Promise<number> {
88
107
  return await this.client.getItemSize(
89
108
  namespace
90
109
  , itemId
91
- , this.withTimeout(signal)
110
+ , this.createSignal(signalOrOptions)
92
111
  )
93
112
  }
94
113
 
95
114
  /**
96
- * @param nextEventIndex 如果指定, 则会在eventIndex不等于下一个index时抛出EventIndexConflict错误.
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
- , signal?: AbortSignal
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.withTimeout(signal)
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.withTimeout(signal)
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
- , signal?: AbortSignal
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.withTimeout(signal)
179
+ , this.createSignal(signalOrOptions)
135
180
  )
136
181
  }
137
182
 
138
- private withTimeout(signal?: AbortSignal): AbortSignal {
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
- isntUndefined(this.timeout) && timeoutSignal(this.timeout)
141
- , signal
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
  }