@ckb-ccc/core 1.1.1 → 1.2.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/CHANGELOG.md +12 -0
- package/dist/client/cache/memory.advanced.d.ts +13 -1
- package/dist/client/cache/memory.advanced.d.ts.map +1 -1
- package/dist/client/cache/memory.advanced.js +26 -0
- package/dist/client/cache/memory.d.ts +3 -0
- package/dist/client/cache/memory.d.ts.map +1 -1
- package/dist/client/cache/memory.js +11 -15
- package/dist/client/jsonRpc/index.js +1 -1
- package/dist.commonjs/client/cache/memory.advanced.d.ts +13 -1
- package/dist.commonjs/client/cache/memory.advanced.d.ts.map +1 -1
- package/dist.commonjs/client/cache/memory.advanced.js +28 -0
- package/dist.commonjs/client/cache/memory.d.ts +3 -0
- package/dist.commonjs/client/cache/memory.d.ts.map +1 -1
- package/dist.commonjs/client/cache/memory.js +10 -14
- package/dist.commonjs/client/jsonRpc/index.js +1 -1
- package/package.json +1 -1
- package/src/client/cache/memory.advanced.ts +39 -0
- package/src/client/cache/memory.ts +18 -17
- package/src/client/jsonRpc/index.ts +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# @ckb-ccc/core
|
|
2
2
|
|
|
3
|
+
## 1.2.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [#118](https://github.com/ckb-devrel/ccc/pull/118) [`94e2618`](https://github.com/ckb-devrel/ccc/commit/94e26182515e09d6086ec5b653d091f117a499e6) Thanks [@Hanssen0](https://github.com/Hanssen0)! - fix: client concurrent should be FIFO
|
|
8
|
+
|
|
9
|
+
## 1.2.0
|
|
10
|
+
|
|
11
|
+
### Minor Changes
|
|
12
|
+
|
|
13
|
+
- [#116](https://github.com/ckb-devrel/ccc/pull/116) [`128e87b`](https://github.com/ckb-devrel/ccc/commit/128e87b5ca3e97bfe7842e76f786aa6aec010797) Thanks [@Hanssen0](https://github.com/Hanssen0)! - feat: Client LRU cache
|
|
14
|
+
|
|
3
15
|
## 1.1.1
|
|
4
16
|
|
|
5
17
|
### Patch Changes
|
|
@@ -1,10 +1,22 @@
|
|
|
1
|
-
import { CellLike, ScriptLike } from "../../ckb/index.js";
|
|
1
|
+
import { Cell, CellLike, ScriptLike } from "../../ckb/index.js";
|
|
2
2
|
import { HexLike } from "../../hex/index.js";
|
|
3
3
|
import { NumLike } from "../../num/index.js";
|
|
4
4
|
import { ClientCollectableSearchKeyLike } from "../clientTypes.advanced.js";
|
|
5
|
+
export type CellRecord = [
|
|
6
|
+
false,
|
|
7
|
+
Pick<Cell, "outPoint"> & Partial<Pick<Cell, "cellOutput" | "outputData">>
|
|
8
|
+
] | [true, Cell] | [undefined, Cell];
|
|
5
9
|
export declare function filterData(dataLike: HexLike, filterLike: HexLike | undefined, filterMode: "exact" | "prefix" | "partial"): boolean;
|
|
6
10
|
export declare function filterScript(valueLike: ScriptLike | undefined, filterLike: ScriptLike | undefined, filterMode: "prefix" | "exact" | "partial"): boolean;
|
|
7
11
|
export declare function filterNumByRange(lengthLike: NumLike, range: [NumLike, NumLike] | undefined): boolean;
|
|
8
12
|
export declare function filterScriptByLenRange(valueLike?: ScriptLike, scriptLenRange?: [NumLike, NumLike]): boolean;
|
|
9
13
|
export declare function filterCell(searchKeyLike: ClientCollectableSearchKeyLike, cellLike: CellLike): boolean;
|
|
14
|
+
export declare class MapLru<K, V> extends Map<K, V> {
|
|
15
|
+
private readonly capacity;
|
|
16
|
+
private readonly lru;
|
|
17
|
+
constructor(capacity: number);
|
|
18
|
+
access(key: K): void;
|
|
19
|
+
get(key: K): V | undefined;
|
|
20
|
+
set(key: K, value: V): this;
|
|
21
|
+
}
|
|
10
22
|
//# sourceMappingURL=memory.advanced.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory.advanced.d.ts","sourceRoot":"","sources":["../../../src/client/cache/memory.advanced.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"memory.advanced.d.ts","sourceRoot":"","sources":["../../../src/client/cache/memory.advanced.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAU,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACxE,OAAO,EAAE,OAAO,EAAW,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,OAAO,EAAW,MAAM,oBAAoB,CAAC;AACtD,OAAO,EACL,8BAA8B,EAE/B,MAAM,4BAA4B,CAAC;AAIpC,MAAM,MAAM,UAAU,GAClB;IACE,KAAK;IACL,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,GAAG,YAAY,CAAC,CAAC;CAC1E,GACD,CAAC,IAAI,EAAE,IAAI,CAAC,GACZ,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;AAEtB,wBAAgB,UAAU,CACxB,QAAQ,EAAE,OAAO,EACjB,UAAU,EAAE,OAAO,GAAG,SAAS,EAC/B,UAAU,EAAE,OAAO,GAAG,QAAQ,GAAG,SAAS,GACzC,OAAO,CAgBT;AAED,wBAAgB,YAAY,CAC1B,SAAS,EAAE,UAAU,GAAG,SAAS,EACjC,UAAU,EAAE,UAAU,GAAG,SAAS,EAClC,UAAU,EAAE,QAAQ,GAAG,OAAO,GAAG,SAAS,GACzC,OAAO,CAkBT;AAED,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,OAAO,EACnB,KAAK,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,SAAS,GACpC,OAAO,CAQT;AAED,wBAAgB,sBAAsB,CACpC,SAAS,CAAC,EAAE,UAAU,EACtB,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,GAClC,OAAO,CAYT;AAED,wBAAgB,UAAU,CACxB,aAAa,EAAE,8BAA8B,EAC7C,QAAQ,EAAE,QAAQ,GACjB,OAAO,CA4CT;AAED,qBAAa,MAAM,CAAC,CAAC,EAAE,CAAC,CAAE,SAAQ,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;IAG7B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAFrC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAW;gBAEF,QAAQ,EAAE,MAAM;IAI7C,MAAM,CAAC,GAAG,EAAE,CAAC;IAYb,GAAG,CAAC,GAAG,EAAE,CAAC;IAKV,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC;CAIrB"}
|
|
@@ -78,3 +78,29 @@ export function filterCell(searchKeyLike, cellLike) {
|
|
|
78
78
|
}
|
|
79
79
|
return true;
|
|
80
80
|
}
|
|
81
|
+
export class MapLru extends Map {
|
|
82
|
+
constructor(capacity) {
|
|
83
|
+
super();
|
|
84
|
+
this.capacity = capacity;
|
|
85
|
+
this.lru = [];
|
|
86
|
+
}
|
|
87
|
+
access(key) {
|
|
88
|
+
const index = this.lru.indexOf(key);
|
|
89
|
+
if (index !== -1) {
|
|
90
|
+
this.lru.splice(index, 1);
|
|
91
|
+
}
|
|
92
|
+
this.lru.push(key);
|
|
93
|
+
if (this.lru.length > this.capacity) {
|
|
94
|
+
this.delete(this.lru[0]);
|
|
95
|
+
this.lru.shift();
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
get(key) {
|
|
99
|
+
this.access(key);
|
|
100
|
+
return super.get(key);
|
|
101
|
+
}
|
|
102
|
+
set(key, value) {
|
|
103
|
+
this.access(key);
|
|
104
|
+
return super.set(key, value);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
@@ -3,6 +3,8 @@ import { HexLike } from "../../hex/index.js";
|
|
|
3
3
|
import { ClientCollectableSearchKeyLike } from "../clientTypes.advanced.js";
|
|
4
4
|
import { ClientCache } from "./cache.js";
|
|
5
5
|
export declare class ClientCacheMemory extends ClientCache {
|
|
6
|
+
private readonly maxCells;
|
|
7
|
+
private readonly maxTxs;
|
|
6
8
|
/**
|
|
7
9
|
* OutPoint => [isLive, Cell | OutPoint]
|
|
8
10
|
*/
|
|
@@ -11,6 +13,7 @@ export declare class ClientCacheMemory extends ClientCache {
|
|
|
11
13
|
* TX Hash => Transaction
|
|
12
14
|
*/
|
|
13
15
|
private readonly knownTransactions;
|
|
16
|
+
constructor(maxCells?: number, maxTxs?: number);
|
|
14
17
|
markUsable(...cellLikes: (CellLike | CellLike[])[]): Promise<void>;
|
|
15
18
|
markUnusable(...outPointLikes: (OutPointLike | OutPointLike[])[]): Promise<void>;
|
|
16
19
|
clear(): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../../src/client/cache/memory.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,IAAI,EACJ,QAAQ,EAER,YAAY,EACZ,WAAW,EACX,eAAe,EAChB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,
|
|
1
|
+
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../../src/client/cache/memory.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,IAAI,EACJ,QAAQ,EAER,YAAY,EACZ,WAAW,EACX,eAAe,EAChB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAW,OAAO,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,8BAA8B,EAAE,MAAM,4BAA4B,CAAC;AAC5E,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAGzC,qBAAa,iBAAkB,SAAQ,WAAW;IAY9C,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAZzB;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA6B;IAEnD;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAA8B;gBAG7C,QAAQ,SAAM,EACd,MAAM,SAAM;IAQzB,UAAU,CAAC,GAAG,SAAS,EAAE,CAAC,QAAQ,GAAG,QAAQ,EAAE,CAAC,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IASlE,YAAY,CAChB,GAAG,aAAa,EAAE,CAAC,YAAY,GAAG,YAAY,EAAE,CAAC,EAAE,GAClD,OAAO,CAAC,IAAI,CAAC;IAcV,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAKrB,SAAS,CACd,OAAO,EAAE,8BAA8B,GACtC,cAAc,CAAC,IAAI,CAAC;IAajB,OAAO,CAAC,YAAY,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC;IAS9D,UAAU,CAAC,YAAY,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC;IAMxD,kBAAkB,CACtB,GAAG,YAAY,EAAE,CAAC,eAAe,GAAG,eAAe,EAAE,CAAC,EAAE,GACvD,OAAO,CAAC,IAAI,CAAC;IAMV,cAAc,CAAC,UAAU,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IAKrE,WAAW,CAAC,GAAG,KAAK,EAAE,CAAC,QAAQ,GAAG,QAAQ,EAAE,CAAC,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAWtE"}
|
|
@@ -1,18 +1,14 @@
|
|
|
1
1
|
import { Cell, OutPoint, Transaction, } from "../../ckb/index.js";
|
|
2
2
|
import { hexFrom } from "../../hex/index.js";
|
|
3
3
|
import { ClientCache } from "./cache.js";
|
|
4
|
-
import { filterCell } from "./memory.advanced.js";
|
|
4
|
+
import { filterCell, MapLru } from "./memory.advanced.js";
|
|
5
5
|
export class ClientCacheMemory extends ClientCache {
|
|
6
|
-
constructor() {
|
|
7
|
-
super(
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
this.
|
|
12
|
-
/**
|
|
13
|
-
* TX Hash => Transaction
|
|
14
|
-
*/
|
|
15
|
-
this.knownTransactions = new Map();
|
|
6
|
+
constructor(maxCells = 512, maxTxs = 256) {
|
|
7
|
+
super();
|
|
8
|
+
this.maxCells = maxCells;
|
|
9
|
+
this.maxTxs = maxTxs;
|
|
10
|
+
this.cells = new MapLru(this.maxCells);
|
|
11
|
+
this.knownTransactions = new MapLru(this.maxTxs);
|
|
16
12
|
}
|
|
17
13
|
async markUsable(...cellLikes) {
|
|
18
14
|
cellLikes.flat().forEach((cellLike) => {
|
|
@@ -34,18 +30,18 @@ export class ClientCacheMemory extends ClientCache {
|
|
|
34
30
|
});
|
|
35
31
|
}
|
|
36
32
|
async clear() {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
}
|
|
33
|
+
this.cells.clear();
|
|
34
|
+
this.knownTransactions.clear();
|
|
40
35
|
}
|
|
41
36
|
async *findCells(keyLike) {
|
|
42
|
-
for (const [isLive, cell] of this.cells.
|
|
37
|
+
for (const [key, [isLive, cell]] of this.cells.entries()) {
|
|
43
38
|
if (!isLive) {
|
|
44
39
|
continue;
|
|
45
40
|
}
|
|
46
41
|
if (!filterCell(keyLike, cell)) {
|
|
47
42
|
continue;
|
|
48
43
|
}
|
|
44
|
+
this.cells.access(key);
|
|
49
45
|
yield cell.clone();
|
|
50
46
|
}
|
|
51
47
|
}
|
|
@@ -266,7 +266,7 @@ export class ClientJsonRpc extends Client {
|
|
|
266
266
|
this.concurrent += 1;
|
|
267
267
|
const res = (await this.transport.request(payload));
|
|
268
268
|
this.concurrent -= 1;
|
|
269
|
-
this.pending.
|
|
269
|
+
this.pending.shift()?.();
|
|
270
270
|
if (res.id !== payload.id) {
|
|
271
271
|
throw new Error(`Id mismatched, got ${res.id}, expected ${payload.id}`);
|
|
272
272
|
}
|
|
@@ -1,10 +1,22 @@
|
|
|
1
|
-
import { CellLike, ScriptLike } from "../../ckb/index.js";
|
|
1
|
+
import { Cell, CellLike, ScriptLike } from "../../ckb/index.js";
|
|
2
2
|
import { HexLike } from "../../hex/index.js";
|
|
3
3
|
import { NumLike } from "../../num/index.js";
|
|
4
4
|
import { ClientCollectableSearchKeyLike } from "../clientTypes.advanced.js";
|
|
5
|
+
export type CellRecord = [
|
|
6
|
+
false,
|
|
7
|
+
Pick<Cell, "outPoint"> & Partial<Pick<Cell, "cellOutput" | "outputData">>
|
|
8
|
+
] | [true, Cell] | [undefined, Cell];
|
|
5
9
|
export declare function filterData(dataLike: HexLike, filterLike: HexLike | undefined, filterMode: "exact" | "prefix" | "partial"): boolean;
|
|
6
10
|
export declare function filterScript(valueLike: ScriptLike | undefined, filterLike: ScriptLike | undefined, filterMode: "prefix" | "exact" | "partial"): boolean;
|
|
7
11
|
export declare function filterNumByRange(lengthLike: NumLike, range: [NumLike, NumLike] | undefined): boolean;
|
|
8
12
|
export declare function filterScriptByLenRange(valueLike?: ScriptLike, scriptLenRange?: [NumLike, NumLike]): boolean;
|
|
9
13
|
export declare function filterCell(searchKeyLike: ClientCollectableSearchKeyLike, cellLike: CellLike): boolean;
|
|
14
|
+
export declare class MapLru<K, V> extends Map<K, V> {
|
|
15
|
+
private readonly capacity;
|
|
16
|
+
private readonly lru;
|
|
17
|
+
constructor(capacity: number);
|
|
18
|
+
access(key: K): void;
|
|
19
|
+
get(key: K): V | undefined;
|
|
20
|
+
set(key: K, value: V): this;
|
|
21
|
+
}
|
|
10
22
|
//# sourceMappingURL=memory.advanced.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory.advanced.d.ts","sourceRoot":"","sources":["../../../src/client/cache/memory.advanced.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"memory.advanced.d.ts","sourceRoot":"","sources":["../../../src/client/cache/memory.advanced.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAU,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACxE,OAAO,EAAE,OAAO,EAAW,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,OAAO,EAAW,MAAM,oBAAoB,CAAC;AACtD,OAAO,EACL,8BAA8B,EAE/B,MAAM,4BAA4B,CAAC;AAIpC,MAAM,MAAM,UAAU,GAClB;IACE,KAAK;IACL,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,GAAG,YAAY,CAAC,CAAC;CAC1E,GACD,CAAC,IAAI,EAAE,IAAI,CAAC,GACZ,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;AAEtB,wBAAgB,UAAU,CACxB,QAAQ,EAAE,OAAO,EACjB,UAAU,EAAE,OAAO,GAAG,SAAS,EAC/B,UAAU,EAAE,OAAO,GAAG,QAAQ,GAAG,SAAS,GACzC,OAAO,CAgBT;AAED,wBAAgB,YAAY,CAC1B,SAAS,EAAE,UAAU,GAAG,SAAS,EACjC,UAAU,EAAE,UAAU,GAAG,SAAS,EAClC,UAAU,EAAE,QAAQ,GAAG,OAAO,GAAG,SAAS,GACzC,OAAO,CAkBT;AAED,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,OAAO,EACnB,KAAK,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,SAAS,GACpC,OAAO,CAQT;AAED,wBAAgB,sBAAsB,CACpC,SAAS,CAAC,EAAE,UAAU,EACtB,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,GAClC,OAAO,CAYT;AAED,wBAAgB,UAAU,CACxB,aAAa,EAAE,8BAA8B,EAC7C,QAAQ,EAAE,QAAQ,GACjB,OAAO,CA4CT;AAED,qBAAa,MAAM,CAAC,CAAC,EAAE,CAAC,CAAE,SAAQ,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;IAG7B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAFrC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAW;gBAEF,QAAQ,EAAE,MAAM;IAI7C,MAAM,CAAC,GAAG,EAAE,CAAC;IAYb,GAAG,CAAC,GAAG,EAAE,CAAC;IAKV,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC;CAIrB"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MapLru = void 0;
|
|
3
4
|
exports.filterData = filterData;
|
|
4
5
|
exports.filterScript = filterScript;
|
|
5
6
|
exports.filterNumByRange = filterNumByRange;
|
|
@@ -85,3 +86,30 @@ function filterCell(searchKeyLike, cellLike) {
|
|
|
85
86
|
}
|
|
86
87
|
return true;
|
|
87
88
|
}
|
|
89
|
+
class MapLru extends Map {
|
|
90
|
+
constructor(capacity) {
|
|
91
|
+
super();
|
|
92
|
+
this.capacity = capacity;
|
|
93
|
+
this.lru = [];
|
|
94
|
+
}
|
|
95
|
+
access(key) {
|
|
96
|
+
const index = this.lru.indexOf(key);
|
|
97
|
+
if (index !== -1) {
|
|
98
|
+
this.lru.splice(index, 1);
|
|
99
|
+
}
|
|
100
|
+
this.lru.push(key);
|
|
101
|
+
if (this.lru.length > this.capacity) {
|
|
102
|
+
this.delete(this.lru[0]);
|
|
103
|
+
this.lru.shift();
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
get(key) {
|
|
107
|
+
this.access(key);
|
|
108
|
+
return super.get(key);
|
|
109
|
+
}
|
|
110
|
+
set(key, value) {
|
|
111
|
+
this.access(key);
|
|
112
|
+
return super.set(key, value);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
exports.MapLru = MapLru;
|
|
@@ -3,6 +3,8 @@ import { HexLike } from "../../hex/index.js";
|
|
|
3
3
|
import { ClientCollectableSearchKeyLike } from "../clientTypes.advanced.js";
|
|
4
4
|
import { ClientCache } from "./cache.js";
|
|
5
5
|
export declare class ClientCacheMemory extends ClientCache {
|
|
6
|
+
private readonly maxCells;
|
|
7
|
+
private readonly maxTxs;
|
|
6
8
|
/**
|
|
7
9
|
* OutPoint => [isLive, Cell | OutPoint]
|
|
8
10
|
*/
|
|
@@ -11,6 +13,7 @@ export declare class ClientCacheMemory extends ClientCache {
|
|
|
11
13
|
* TX Hash => Transaction
|
|
12
14
|
*/
|
|
13
15
|
private readonly knownTransactions;
|
|
16
|
+
constructor(maxCells?: number, maxTxs?: number);
|
|
14
17
|
markUsable(...cellLikes: (CellLike | CellLike[])[]): Promise<void>;
|
|
15
18
|
markUnusable(...outPointLikes: (OutPointLike | OutPointLike[])[]): Promise<void>;
|
|
16
19
|
clear(): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../../src/client/cache/memory.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,IAAI,EACJ,QAAQ,EAER,YAAY,EACZ,WAAW,EACX,eAAe,EAChB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,
|
|
1
|
+
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../../src/client/cache/memory.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,IAAI,EACJ,QAAQ,EAER,YAAY,EACZ,WAAW,EACX,eAAe,EAChB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAW,OAAO,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,8BAA8B,EAAE,MAAM,4BAA4B,CAAC;AAC5E,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAGzC,qBAAa,iBAAkB,SAAQ,WAAW;IAY9C,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAZzB;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA6B;IAEnD;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAA8B;gBAG7C,QAAQ,SAAM,EACd,MAAM,SAAM;IAQzB,UAAU,CAAC,GAAG,SAAS,EAAE,CAAC,QAAQ,GAAG,QAAQ,EAAE,CAAC,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IASlE,YAAY,CAChB,GAAG,aAAa,EAAE,CAAC,YAAY,GAAG,YAAY,EAAE,CAAC,EAAE,GAClD,OAAO,CAAC,IAAI,CAAC;IAcV,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAKrB,SAAS,CACd,OAAO,EAAE,8BAA8B,GACtC,cAAc,CAAC,IAAI,CAAC;IAajB,OAAO,CAAC,YAAY,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC;IAS9D,UAAU,CAAC,YAAY,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC;IAMxD,kBAAkB,CACtB,GAAG,YAAY,EAAE,CAAC,eAAe,GAAG,eAAe,EAAE,CAAC,EAAE,GACvD,OAAO,CAAC,IAAI,CAAC;IAMV,cAAc,CAAC,UAAU,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IAKrE,WAAW,CAAC,GAAG,KAAK,EAAE,CAAC,QAAQ,GAAG,QAAQ,EAAE,CAAC,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAWtE"}
|
|
@@ -6,16 +6,12 @@ const index_js_2 = require("../../hex/index.js");
|
|
|
6
6
|
const cache_js_1 = require("./cache.js");
|
|
7
7
|
const memory_advanced_js_1 = require("./memory.advanced.js");
|
|
8
8
|
class ClientCacheMemory extends cache_js_1.ClientCache {
|
|
9
|
-
constructor() {
|
|
10
|
-
super(
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
this.
|
|
15
|
-
/**
|
|
16
|
-
* TX Hash => Transaction
|
|
17
|
-
*/
|
|
18
|
-
this.knownTransactions = new Map();
|
|
9
|
+
constructor(maxCells = 512, maxTxs = 256) {
|
|
10
|
+
super();
|
|
11
|
+
this.maxCells = maxCells;
|
|
12
|
+
this.maxTxs = maxTxs;
|
|
13
|
+
this.cells = new memory_advanced_js_1.MapLru(this.maxCells);
|
|
14
|
+
this.knownTransactions = new memory_advanced_js_1.MapLru(this.maxTxs);
|
|
19
15
|
}
|
|
20
16
|
async markUsable(...cellLikes) {
|
|
21
17
|
cellLikes.flat().forEach((cellLike) => {
|
|
@@ -37,18 +33,18 @@ class ClientCacheMemory extends cache_js_1.ClientCache {
|
|
|
37
33
|
});
|
|
38
34
|
}
|
|
39
35
|
async clear() {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
}
|
|
36
|
+
this.cells.clear();
|
|
37
|
+
this.knownTransactions.clear();
|
|
43
38
|
}
|
|
44
39
|
async *findCells(keyLike) {
|
|
45
|
-
for (const [isLive, cell] of this.cells.
|
|
40
|
+
for (const [key, [isLive, cell]] of this.cells.entries()) {
|
|
46
41
|
if (!isLive) {
|
|
47
42
|
continue;
|
|
48
43
|
}
|
|
49
44
|
if (!(0, memory_advanced_js_1.filterCell)(keyLike, cell)) {
|
|
50
45
|
continue;
|
|
51
46
|
}
|
|
47
|
+
this.cells.access(key);
|
|
52
48
|
yield cell.clone();
|
|
53
49
|
}
|
|
54
50
|
}
|
|
@@ -269,7 +269,7 @@ class ClientJsonRpc extends client_js_1.Client {
|
|
|
269
269
|
this.concurrent += 1;
|
|
270
270
|
const res = (await this.transport.request(payload));
|
|
271
271
|
this.concurrent -= 1;
|
|
272
|
-
this.pending.
|
|
272
|
+
this.pending.shift()?.();
|
|
273
273
|
if (res.id !== payload.id) {
|
|
274
274
|
throw new Error(`Id mismatched, got ${res.id}, expected ${payload.id}`);
|
|
275
275
|
}
|
package/package.json
CHANGED
|
@@ -8,6 +8,15 @@ import {
|
|
|
8
8
|
} from "../clientTypes.advanced.js";
|
|
9
9
|
import { ClientIndexerSearchKey } from "../clientTypes.js";
|
|
10
10
|
|
|
11
|
+
// [isLive, Cell | OutPoint]
|
|
12
|
+
export type CellRecord =
|
|
13
|
+
| [
|
|
14
|
+
false,
|
|
15
|
+
Pick<Cell, "outPoint"> & Partial<Pick<Cell, "cellOutput" | "outputData">>,
|
|
16
|
+
]
|
|
17
|
+
| [true, Cell]
|
|
18
|
+
| [undefined, Cell];
|
|
19
|
+
|
|
11
20
|
export function filterData(
|
|
12
21
|
dataLike: HexLike,
|
|
13
22
|
filterLike: HexLike | undefined,
|
|
@@ -132,3 +141,33 @@ export function filterCell(
|
|
|
132
141
|
|
|
133
142
|
return true;
|
|
134
143
|
}
|
|
144
|
+
|
|
145
|
+
export class MapLru<K, V> extends Map<K, V> {
|
|
146
|
+
private readonly lru: K[] = [];
|
|
147
|
+
|
|
148
|
+
constructor(private readonly capacity: number) {
|
|
149
|
+
super();
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
access(key: K) {
|
|
153
|
+
const index = this.lru.indexOf(key);
|
|
154
|
+
if (index !== -1) {
|
|
155
|
+
this.lru.splice(index, 1);
|
|
156
|
+
}
|
|
157
|
+
this.lru.push(key);
|
|
158
|
+
if (this.lru.length > this.capacity) {
|
|
159
|
+
this.delete(this.lru[0]);
|
|
160
|
+
this.lru.shift();
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
get(key: K) {
|
|
165
|
+
this.access(key);
|
|
166
|
+
return super.get(key);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
set(key: K, value: V) {
|
|
170
|
+
this.access(key);
|
|
171
|
+
return super.set(key, value);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
@@ -6,30 +6,31 @@ import {
|
|
|
6
6
|
Transaction,
|
|
7
7
|
TransactionLike,
|
|
8
8
|
} from "../../ckb/index.js";
|
|
9
|
-
import {
|
|
9
|
+
import { hexFrom, HexLike } from "../../hex/index.js";
|
|
10
10
|
import { ClientCollectableSearchKeyLike } from "../clientTypes.advanced.js";
|
|
11
11
|
import { ClientCache } from "./cache.js";
|
|
12
|
-
import { filterCell } from "./memory.advanced.js";
|
|
12
|
+
import { CellRecord, filterCell, MapLru } from "./memory.advanced.js";
|
|
13
13
|
|
|
14
14
|
export class ClientCacheMemory extends ClientCache {
|
|
15
15
|
/**
|
|
16
16
|
* OutPoint => [isLive, Cell | OutPoint]
|
|
17
17
|
*/
|
|
18
|
-
private readonly cells:
|
|
19
|
-
string,
|
|
20
|
-
| [
|
|
21
|
-
false,
|
|
22
|
-
Pick<Cell, "outPoint"> &
|
|
23
|
-
Partial<Pick<Cell, "cellOutput" | "outputData">>,
|
|
24
|
-
]
|
|
25
|
-
| [true, Cell]
|
|
26
|
-
| [undefined, Cell]
|
|
27
|
-
> = new Map();
|
|
18
|
+
private readonly cells: MapLru<string, CellRecord>;
|
|
28
19
|
|
|
29
20
|
/**
|
|
30
21
|
* TX Hash => Transaction
|
|
31
22
|
*/
|
|
32
|
-
private readonly knownTransactions:
|
|
23
|
+
private readonly knownTransactions: MapLru<string, Transaction>;
|
|
24
|
+
|
|
25
|
+
constructor(
|
|
26
|
+
private readonly maxCells = 512,
|
|
27
|
+
private readonly maxTxs = 256,
|
|
28
|
+
) {
|
|
29
|
+
super();
|
|
30
|
+
|
|
31
|
+
this.cells = new MapLru<string, CellRecord>(this.maxCells);
|
|
32
|
+
this.knownTransactions = new MapLru<string, Transaction>(this.maxTxs);
|
|
33
|
+
}
|
|
33
34
|
|
|
34
35
|
async markUsable(...cellLikes: (CellLike | CellLike[])[]): Promise<void> {
|
|
35
36
|
cellLikes.flat().forEach((cellLike) => {
|
|
@@ -57,15 +58,14 @@ export class ClientCacheMemory extends ClientCache {
|
|
|
57
58
|
}
|
|
58
59
|
|
|
59
60
|
async clear(): Promise<void> {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
}
|
|
61
|
+
this.cells.clear();
|
|
62
|
+
this.knownTransactions.clear();
|
|
63
63
|
}
|
|
64
64
|
|
|
65
65
|
async *findCells(
|
|
66
66
|
keyLike: ClientCollectableSearchKeyLike,
|
|
67
67
|
): AsyncGenerator<Cell> {
|
|
68
|
-
for (const [isLive, cell] of this.cells.
|
|
68
|
+
for (const [key, [isLive, cell]] of this.cells.entries()) {
|
|
69
69
|
if (!isLive) {
|
|
70
70
|
continue;
|
|
71
71
|
}
|
|
@@ -73,6 +73,7 @@ export class ClientCacheMemory extends ClientCache {
|
|
|
73
73
|
continue;
|
|
74
74
|
}
|
|
75
75
|
|
|
76
|
+
this.cells.access(key);
|
|
76
77
|
yield cell.clone();
|
|
77
78
|
}
|
|
78
79
|
}
|
|
@@ -459,7 +459,7 @@ export abstract class ClientJsonRpc extends Client {
|
|
|
459
459
|
result: unknown;
|
|
460
460
|
};
|
|
461
461
|
this.concurrent -= 1;
|
|
462
|
-
this.pending.
|
|
462
|
+
this.pending.shift()?.();
|
|
463
463
|
|
|
464
464
|
if (res.id !== payload.id) {
|
|
465
465
|
throw new Error(`Id mismatched, got ${res.id}, expected ${payload.id}`);
|