@sentio/sdk 3.1.0 → 3.2.0-rc.2
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/lib/core/base-context.d.ts +24 -0
- package/lib/core/base-context.d.ts.map +1 -1
- package/lib/core/base-context.js +32 -0
- package/lib/core/base-context.js.map +1 -1
- package/lib/core/core-plugin.d.ts.map +1 -1
- package/lib/core/core-plugin.js +13 -4
- package/lib/core/core-plugin.js.map +1 -1
- package/lib/store/cache.d.ts +130 -0
- package/lib/store/cache.d.ts.map +1 -0
- package/lib/store/cache.js +183 -0
- package/lib/store/cache.js.map +1 -0
- package/lib/store/schema.d.ts.map +1 -1
- package/lib/store/schema.js +1 -0
- package/lib/store/schema.js.map +1 -1
- package/lib/testing/memory-database.d.ts +1 -0
- package/lib/testing/memory-database.d.ts.map +1 -1
- package/lib/testing/memory-database.js +33 -2
- package/lib/testing/memory-database.js.map +1 -1
- package/package.json +3 -3
- package/src/core/base-context.ts +33 -0
- package/src/core/core-plugin.ts +15 -4
- package/src/store/cache.ts +193 -0
- package/src/store/schema.ts +1 -0
- package/src/testing/memory-database.ts +36 -2
|
@@ -3,10 +3,12 @@ import { EventLoggerBinding } from './event-logger.js';
|
|
|
3
3
|
import { Meter, Labels } from './meter.js';
|
|
4
4
|
import { ChainId } from '@sentio/chain';
|
|
5
5
|
import { Store } from '../store/store.js';
|
|
6
|
+
import { MemoryCache } from '../store/cache.js';
|
|
6
7
|
export declare abstract class BaseContext {
|
|
7
8
|
meter: Meter;
|
|
8
9
|
eventLogger: EventLoggerBinding;
|
|
9
10
|
private _store;
|
|
11
|
+
private _cache;
|
|
10
12
|
baseLabels: Labels;
|
|
11
13
|
private active;
|
|
12
14
|
private _res;
|
|
@@ -18,6 +20,28 @@ export declare abstract class BaseContext {
|
|
|
18
20
|
protected abstract getMetaDataInternal(name: string, labels: Labels): RecordMetaData;
|
|
19
21
|
abstract getChainId(): ChainId;
|
|
20
22
|
get store(): Store;
|
|
23
|
+
/**
|
|
24
|
+
* Access the in-memory key-value cache.
|
|
25
|
+
*
|
|
26
|
+
* The cache allows storing and retrieving JSON-serializable values that persist
|
|
27
|
+
* across handler invocations. Useful for caching computed results, tracking
|
|
28
|
+
* cumulative state, or storing intermediate processing data.
|
|
29
|
+
*
|
|
30
|
+
* @returns The MemoryCache instance, or undefined if cache is not available
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* ```typescript
|
|
34
|
+
* // Store and retrieve values
|
|
35
|
+
* await ctx.cache.set('totalVolume', volume)
|
|
36
|
+
* const cached = await ctx.cache.get<number>('totalVolume')
|
|
37
|
+
*
|
|
38
|
+
* // Block-scoped values (isolated per block)
|
|
39
|
+
* await ctx.cache.setInBlock('blockCount', count)
|
|
40
|
+
* ```
|
|
41
|
+
*
|
|
42
|
+
* @see {@link MemoryCache} for full API documentation
|
|
43
|
+
*/
|
|
44
|
+
get cache(): MemoryCache;
|
|
21
45
|
initStore(): void;
|
|
22
46
|
sendTemplateInstance(instance: TemplateInstance, unbind?: boolean): void;
|
|
23
47
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base-context.d.ts","sourceRoot":"","sources":["../../src/core/base-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAChF,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AACtD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAIvC,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"base-context.d.ts","sourceRoot":"","sources":["../../src/core/base-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAChF,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AACtD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAIvC,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAE/C,8BAAsB,WAAW;IAC/B,KAAK,EAAE,KAAK,CAAA;IACZ,WAAW,EAAE,kBAAkB,CAAA;IAC/B,OAAO,CAAC,MAAM,CAAO;IACrB,OAAO,CAAC,MAAM,CAAa;IAC3B,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,MAAM,CAAS;IAEvB,OAAO,CAAC,IAAI,CASX;IAEM,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,aAAa,CAAC;IAQzC,SAAS,aAAa,UAAU,EAAE,MAAM,GAAG,SAAS;IAQpD,gBAAgB,IAAI,aAAa;IASjC,OAAO,CAAC,aAAa,CAAoC;IAEzD,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,cAAc;IAmBzD,SAAS,CAAC,QAAQ,CAAC,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,cAAc;IAEpF,QAAQ,CAAC,UAAU,IAAI,OAAO;IAE9B,IAAI,KAAK,UAQR;IAED;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,IAAI,KAAK,gBAQR;IAGD,SAAS;IAOT,oBAAoB,CAAC,QAAQ,EAAE,gBAAgB,EAAE,MAAM,GAAE,OAAe;CAMzE"}
|
package/lib/core/base-context.js
CHANGED
|
@@ -4,10 +4,12 @@ import { Meter } from './meter.js';
|
|
|
4
4
|
import { mergeProcessResultsInPlace, PluginManager } from '@sentio/runtime';
|
|
5
5
|
import { ServerError, Status } from 'nice-grpc';
|
|
6
6
|
import { Store } from '../store/store.js';
|
|
7
|
+
import { MemoryCache } from '../store/cache.js';
|
|
7
8
|
export class BaseContext {
|
|
8
9
|
meter;
|
|
9
10
|
eventLogger;
|
|
10
11
|
_store;
|
|
12
|
+
_cache;
|
|
11
13
|
baseLabels;
|
|
12
14
|
active;
|
|
13
15
|
_res = {
|
|
@@ -71,6 +73,36 @@ export class BaseContext {
|
|
|
71
73
|
}
|
|
72
74
|
return this._store;
|
|
73
75
|
}
|
|
76
|
+
/**
|
|
77
|
+
* Access the in-memory key-value cache.
|
|
78
|
+
*
|
|
79
|
+
* The cache allows storing and retrieving JSON-serializable values that persist
|
|
80
|
+
* across handler invocations. Useful for caching computed results, tracking
|
|
81
|
+
* cumulative state, or storing intermediate processing data.
|
|
82
|
+
*
|
|
83
|
+
* @returns The MemoryCache instance, or undefined if cache is not available
|
|
84
|
+
*
|
|
85
|
+
* @example
|
|
86
|
+
* ```typescript
|
|
87
|
+
* // Store and retrieve values
|
|
88
|
+
* await ctx.cache.set('totalVolume', volume)
|
|
89
|
+
* const cached = await ctx.cache.get<number>('totalVolume')
|
|
90
|
+
*
|
|
91
|
+
* // Block-scoped values (isolated per block)
|
|
92
|
+
* await ctx.cache.setInBlock('blockCount', count)
|
|
93
|
+
* ```
|
|
94
|
+
*
|
|
95
|
+
* @see {@link MemoryCache} for full API documentation
|
|
96
|
+
*/
|
|
97
|
+
get cache() {
|
|
98
|
+
if (!this._cache) {
|
|
99
|
+
const dbContext = PluginManager.INSTANCE.dbContextLocalStorage.getStore();
|
|
100
|
+
if (dbContext) {
|
|
101
|
+
this._cache = new MemoryCache(dbContext, this);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return this._cache;
|
|
105
|
+
}
|
|
74
106
|
// this method must be called within the dbContextLocalStorage scope
|
|
75
107
|
initStore() {
|
|
76
108
|
const dbContext = PluginManager.INSTANCE.dbContextLocalStorage.getStore();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base-context.js","sourceRoot":"","sources":["../../src/core/base-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAoC,MAAM,gBAAgB,CAAA;AAChF,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AACtD,OAAO,EAAE,KAAK,EAAU,MAAM,YAAY,CAAA;AAE1C,OAAO,EAAE,0BAA0B,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAE3E,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAC/C,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"base-context.js","sourceRoot":"","sources":["../../src/core/base-context.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core-plugin.d.ts","sourceRoot":"","sources":["../../src/core/core-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"core-plugin.d.ts","sourceRoot":"","sources":["../../src/core/core-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,MAAM,EAAiB,MAAM,iBAAiB,CAAA;AACtE,OAAO,EAAE,YAAY,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAA;AAOpE,qBAAa,UAAW,SAAQ,MAAM;IACpC,IAAI,EAAE,MAAM,CAAe;IAErB,SAAS,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvD,IAAI,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/C,iBAAiB,CAAC,MAAM,EAAE,YAAY,GAAG,qBAAqB,GAAG,IAAI;CAsCtE"}
|
package/lib/core/core-plugin.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Plugin, PluginManager } from '@sentio/runtime';
|
|
1
|
+
import { GLOBAL_CONFIG, Plugin, PluginManager } from '@sentio/runtime';
|
|
2
2
|
import { MetricState } from './meter.js';
|
|
3
3
|
import { ExporterState } from './exporter.js';
|
|
4
4
|
import { EventLoggerState } from './event-logger.js';
|
|
@@ -28,9 +28,18 @@ export class CorePlugin extends Plugin {
|
|
|
28
28
|
channel: exporter.channel
|
|
29
29
|
});
|
|
30
30
|
}
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
31
|
+
const schemas = DatabaseSchemaState.INSTANCE.getValues();
|
|
32
|
+
let mergedSources = mergeSchemas(schemas);
|
|
33
|
+
// Append MemoryCacheItem schema when cache is enabled
|
|
34
|
+
if (GLOBAL_CONFIG.cache?.enabled) {
|
|
35
|
+
mergedSources += `
|
|
36
|
+
type MemoryCacheItem @cache(sizeMB: ${GLOBAL_CONFIG.cache.size || 100}) {
|
|
37
|
+
id: ID!
|
|
38
|
+
value: String!
|
|
39
|
+
}
|
|
40
|
+
`;
|
|
41
|
+
}
|
|
42
|
+
if (mergedSources.trim().length > 0) {
|
|
34
43
|
config.dbSchema = {
|
|
35
44
|
gqlSchema: mergedSources
|
|
36
45
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core-plugin.js","sourceRoot":"","sources":["../../src/core/core-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"core-plugin.js","sourceRoot":"","sources":["../../src/core/core-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAGtE,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AACpD,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAExE,MAAM,OAAO,UAAW,SAAQ,MAAM;IACpC,IAAI,GAAW,YAAY,CAAA;IAE3B,KAAK,CAAC,SAAS,CAAC,MAA6B;QAC3C,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAA;IAChC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,MAAoB;QAC7B,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAA;IAChC,CAAC;IAED,iBAAiB,CAAC,MAA4C;QAC5D,KAAK,MAAM,MAAM,IAAI,WAAW,CAAC,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC;YACtD,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC;gBACxB,GAAG,MAAM,CAAC,MAAM;aACjB,CAAC,CAAA;QACJ,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,gBAAgB,CAAC,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC;YAC1D,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC;gBAC1B,GAAG,KAAK,CAAC,MAAM;aAChB,CAAC,CAAA;QACJ,CAAC;QAED,KAAK,MAAM,QAAQ,IAAI,aAAa,CAAC,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC;YAC1D,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC;gBACxB,IAAI,EAAE,QAAQ,CAAC,IAAI;gBACnB,OAAO,EAAE,QAAQ,CAAC,OAAO;aAC1B,CAAC,CAAA;QACJ,CAAC;QAED,MAAM,OAAO,GAAG,mBAAmB,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAA;QACxD,IAAI,aAAa,GAAG,YAAY,CAAC,OAAO,CAAC,CAAA;QAEzC,sDAAsD;QACtD,IAAI,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC;YACjC,aAAa,IAAI;sCACe,aAAa,CAAC,KAAK,CAAC,IAAI,IAAI,GAAG;;;;CAIpE,CAAA;QACG,CAAC;QAED,IAAI,aAAa,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpC,MAAM,CAAC,QAAQ,GAAG;gBAChB,SAAS,EAAE,aAAa;aACzB,CAAA;QACH,CAAC;IACH,CAAC;CACF;AAED,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,UAAU,EAAE,CAAC,CAAA"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { IStoreContext } from '@sentio/runtime';
|
|
2
|
+
import { BaseContext } from '../core/index.js';
|
|
3
|
+
/**
|
|
4
|
+
* A key-value cache that persists across handler invocations.
|
|
5
|
+
*
|
|
6
|
+
* MemoryCache provides a simple interface for storing and retrieving JSON-serializable
|
|
7
|
+
* values. It's useful for caching computed results, tracking state between events,
|
|
8
|
+
* or storing intermediate data during processing.
|
|
9
|
+
*
|
|
10
|
+
* Access the cache through the context object in your handlers:
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```typescript
|
|
14
|
+
* // Basic usage
|
|
15
|
+
* ERC20Processor.bind({ address: TOKEN_ADDRESS })
|
|
16
|
+
* .onEventTransfer(async (event, ctx) => {
|
|
17
|
+
* // Get cached total
|
|
18
|
+
* let total = await ctx.cache.get<number>('transferTotal') ?? 0
|
|
19
|
+
* total += Number(event.args.value)
|
|
20
|
+
* await ctx.cache.set('transferTotal', total)
|
|
21
|
+
* })
|
|
22
|
+
* ```
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```typescript
|
|
26
|
+
* // Block-scoped caching (values isolated per block)
|
|
27
|
+
* .onEventTransfer(async (event, ctx) => {
|
|
28
|
+
* // This value is only visible within the current block
|
|
29
|
+
* await ctx.cache.setInBlock('blockTransferCount', count)
|
|
30
|
+
* const blockCount = await ctx.cache.getInBlock<number>('blockTransferCount')
|
|
31
|
+
* })
|
|
32
|
+
* ```
|
|
33
|
+
*
|
|
34
|
+
* @remarks
|
|
35
|
+
* - Values are JSON serialized, so only JSON-compatible types are supported
|
|
36
|
+
* - Cache is enabled by default; configure via `GLOBAL_CONFIG.cache`
|
|
37
|
+
* - Block-scoped methods (`*InBlock`) prefix keys with block number for isolation
|
|
38
|
+
*/
|
|
39
|
+
export declare class MemoryCache {
|
|
40
|
+
private readonly storeContext;
|
|
41
|
+
private readonly context;
|
|
42
|
+
constructor(storeContext: IStoreContext, context: BaseContext);
|
|
43
|
+
/**
|
|
44
|
+
* Retrieves a value from the cache.
|
|
45
|
+
*
|
|
46
|
+
* @typeParam T - The expected type of the cached value
|
|
47
|
+
* @param key - The unique key identifying the cached value
|
|
48
|
+
* @returns The cached value deserialized as type T, or null if not found
|
|
49
|
+
*
|
|
50
|
+
* @example
|
|
51
|
+
* ```typescript
|
|
52
|
+
* const user = await ctx.cache.get<{ name: string, score: number }>('user:123')
|
|
53
|
+
* if (user) {
|
|
54
|
+
* console.log(user.name, user.score)
|
|
55
|
+
* }
|
|
56
|
+
* ```
|
|
57
|
+
*/
|
|
58
|
+
get<T>(key: string): Promise<T | null>;
|
|
59
|
+
/**
|
|
60
|
+
* Stores a value in the cache.
|
|
61
|
+
*
|
|
62
|
+
* @typeParam T - The type of value being stored (must be JSON-serializable)
|
|
63
|
+
* @param key - The unique key to store the value under
|
|
64
|
+
* @param value - The value to cache (will be JSON serialized)
|
|
65
|
+
*
|
|
66
|
+
* @example
|
|
67
|
+
* ```typescript
|
|
68
|
+
* await ctx.cache.set('config', { threshold: 100, enabled: true })
|
|
69
|
+
* await ctx.cache.set('lastPrice', 1234.56)
|
|
70
|
+
* ```
|
|
71
|
+
*/
|
|
72
|
+
set<T>(key: string, value: T): Promise<void>;
|
|
73
|
+
/**
|
|
74
|
+
* Removes a value from the cache.
|
|
75
|
+
*
|
|
76
|
+
* @param key - The key of the value to remove
|
|
77
|
+
*
|
|
78
|
+
* @example
|
|
79
|
+
* ```typescript
|
|
80
|
+
* await ctx.cache.delete('temporaryData')
|
|
81
|
+
* ```
|
|
82
|
+
*/
|
|
83
|
+
delete(key: string): Promise<void>;
|
|
84
|
+
/**
|
|
85
|
+
* Stores a value scoped to the current block number.
|
|
86
|
+
*
|
|
87
|
+
* The key is automatically prefixed with the block number, ensuring that
|
|
88
|
+
* values set in different blocks don't collide. Useful for accumulating
|
|
89
|
+
* per-block statistics or temporary computation results.
|
|
90
|
+
*
|
|
91
|
+
* @typeParam T - The type of value being stored (must be JSON-serializable)
|
|
92
|
+
* @param key - The key to store the value under (will be prefixed with block number)
|
|
93
|
+
* @param value - The value to cache
|
|
94
|
+
*
|
|
95
|
+
* @example
|
|
96
|
+
* ```typescript
|
|
97
|
+
* // Track transfers per block
|
|
98
|
+
* let count = await ctx.cache.getInBlock<number>('transferCount') ?? 0
|
|
99
|
+
* await ctx.cache.setInBlock('transferCount', count + 1)
|
|
100
|
+
* ```
|
|
101
|
+
*/
|
|
102
|
+
setInBlock<T>(key: string, value: T): Promise<void>;
|
|
103
|
+
/**
|
|
104
|
+
* Retrieves a value scoped to the current block number.
|
|
105
|
+
*
|
|
106
|
+
* Only returns values that were set in the same block using `setInBlock`.
|
|
107
|
+
*
|
|
108
|
+
* @typeParam T - The expected type of the cached value
|
|
109
|
+
* @param key - The key to retrieve (block number prefix is added automatically)
|
|
110
|
+
* @returns The cached value for this block, or null if not found
|
|
111
|
+
*
|
|
112
|
+
* @example
|
|
113
|
+
* ```typescript
|
|
114
|
+
* const blockVolume = await ctx.cache.getInBlock<bigint>('volume')
|
|
115
|
+
* ```
|
|
116
|
+
*/
|
|
117
|
+
getInBlock<T>(key: string): Promise<T | null>;
|
|
118
|
+
/**
|
|
119
|
+
* Removes a value scoped to the current block number.
|
|
120
|
+
*
|
|
121
|
+
* @param key - The key to delete (block number prefix is added automatically)
|
|
122
|
+
*
|
|
123
|
+
* @example
|
|
124
|
+
* ```typescript
|
|
125
|
+
* await ctx.cache.deleteInBlock('temporaryBlockData')
|
|
126
|
+
* ```
|
|
127
|
+
*/
|
|
128
|
+
deleteInBlock(key: string): Promise<void>;
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/store/cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAE/C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAK9C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,qBAAa,WAAW;IAEpB,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,OAAO;gBADP,YAAY,EAAE,aAAa,EAC3B,OAAO,EAAE,WAAW;IAGvC;;;;;;;;;;;;;;OAcG;IACU,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAkBnD;;;;;;;;;;;;OAYG;IACU,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBzD;;;;;;;;;OASG;IACU,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAU/C;;;;;;;;;;;;;;;;;OAiBG;IACU,UAAU,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAKhE;;;;;;;;;;;;;OAaG;IACU,UAAU,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAK1D;;;;;;;;;OASG;IACU,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAIvD"}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
/** Internal entity name used for cache storage */
|
|
2
|
+
const CacheItemEntityName = 'MemoryCacheItem';
|
|
3
|
+
/**
|
|
4
|
+
* A key-value cache that persists across handler invocations.
|
|
5
|
+
*
|
|
6
|
+
* MemoryCache provides a simple interface for storing and retrieving JSON-serializable
|
|
7
|
+
* values. It's useful for caching computed results, tracking state between events,
|
|
8
|
+
* or storing intermediate data during processing.
|
|
9
|
+
*
|
|
10
|
+
* Access the cache through the context object in your handlers:
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```typescript
|
|
14
|
+
* // Basic usage
|
|
15
|
+
* ERC20Processor.bind({ address: TOKEN_ADDRESS })
|
|
16
|
+
* .onEventTransfer(async (event, ctx) => {
|
|
17
|
+
* // Get cached total
|
|
18
|
+
* let total = await ctx.cache.get<number>('transferTotal') ?? 0
|
|
19
|
+
* total += Number(event.args.value)
|
|
20
|
+
* await ctx.cache.set('transferTotal', total)
|
|
21
|
+
* })
|
|
22
|
+
* ```
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```typescript
|
|
26
|
+
* // Block-scoped caching (values isolated per block)
|
|
27
|
+
* .onEventTransfer(async (event, ctx) => {
|
|
28
|
+
* // This value is only visible within the current block
|
|
29
|
+
* await ctx.cache.setInBlock('blockTransferCount', count)
|
|
30
|
+
* const blockCount = await ctx.cache.getInBlock<number>('blockTransferCount')
|
|
31
|
+
* })
|
|
32
|
+
* ```
|
|
33
|
+
*
|
|
34
|
+
* @remarks
|
|
35
|
+
* - Values are JSON serialized, so only JSON-compatible types are supported
|
|
36
|
+
* - Cache is enabled by default; configure via `GLOBAL_CONFIG.cache`
|
|
37
|
+
* - Block-scoped methods (`*InBlock`) prefix keys with block number for isolation
|
|
38
|
+
*/
|
|
39
|
+
export class MemoryCache {
|
|
40
|
+
storeContext;
|
|
41
|
+
context;
|
|
42
|
+
constructor(storeContext, context) {
|
|
43
|
+
this.storeContext = storeContext;
|
|
44
|
+
this.context = context;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Retrieves a value from the cache.
|
|
48
|
+
*
|
|
49
|
+
* @typeParam T - The expected type of the cached value
|
|
50
|
+
* @param key - The unique key identifying the cached value
|
|
51
|
+
* @returns The cached value deserialized as type T, or null if not found
|
|
52
|
+
*
|
|
53
|
+
* @example
|
|
54
|
+
* ```typescript
|
|
55
|
+
* const user = await ctx.cache.get<{ name: string, score: number }>('user:123')
|
|
56
|
+
* if (user) {
|
|
57
|
+
* console.log(user.name, user.score)
|
|
58
|
+
* }
|
|
59
|
+
* ```
|
|
60
|
+
*/
|
|
61
|
+
async get(key) {
|
|
62
|
+
const promise = this.storeContext.sendRequest({
|
|
63
|
+
get: {
|
|
64
|
+
entity: CacheItemEntityName,
|
|
65
|
+
id: key
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
const data = (await promise);
|
|
69
|
+
if (data.entityList?.entities[0]) {
|
|
70
|
+
const entityData = data.entityList?.entities[0]?.data;
|
|
71
|
+
const value = entityData.fields['value'];
|
|
72
|
+
return JSON.parse(value.stringValue);
|
|
73
|
+
}
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Stores a value in the cache.
|
|
78
|
+
*
|
|
79
|
+
* @typeParam T - The type of value being stored (must be JSON-serializable)
|
|
80
|
+
* @param key - The unique key to store the value under
|
|
81
|
+
* @param value - The value to cache (will be JSON serialized)
|
|
82
|
+
*
|
|
83
|
+
* @example
|
|
84
|
+
* ```typescript
|
|
85
|
+
* await ctx.cache.set('config', { threshold: 100, enabled: true })
|
|
86
|
+
* await ctx.cache.set('lastPrice', 1234.56)
|
|
87
|
+
* ```
|
|
88
|
+
*/
|
|
89
|
+
async set(key, value) {
|
|
90
|
+
const entityData = {
|
|
91
|
+
fields: {
|
|
92
|
+
id: {
|
|
93
|
+
stringValue: key
|
|
94
|
+
},
|
|
95
|
+
value: {
|
|
96
|
+
stringValue: JSON.stringify(value)
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
const request = {
|
|
101
|
+
upsert: {
|
|
102
|
+
entity: [CacheItemEntityName],
|
|
103
|
+
id: [key],
|
|
104
|
+
entityData: [entityData]
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
await this.storeContext.sendRequest(request);
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Removes a value from the cache.
|
|
111
|
+
*
|
|
112
|
+
* @param key - The key of the value to remove
|
|
113
|
+
*
|
|
114
|
+
* @example
|
|
115
|
+
* ```typescript
|
|
116
|
+
* await ctx.cache.delete('temporaryData')
|
|
117
|
+
* ```
|
|
118
|
+
*/
|
|
119
|
+
async delete(key) {
|
|
120
|
+
const request = {
|
|
121
|
+
delete: {
|
|
122
|
+
entity: [CacheItemEntityName],
|
|
123
|
+
id: [key]
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
await this.storeContext.sendRequest(request);
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Stores a value scoped to the current block number.
|
|
130
|
+
*
|
|
131
|
+
* The key is automatically prefixed with the block number, ensuring that
|
|
132
|
+
* values set in different blocks don't collide. Useful for accumulating
|
|
133
|
+
* per-block statistics or temporary computation results.
|
|
134
|
+
*
|
|
135
|
+
* @typeParam T - The type of value being stored (must be JSON-serializable)
|
|
136
|
+
* @param key - The key to store the value under (will be prefixed with block number)
|
|
137
|
+
* @param value - The value to cache
|
|
138
|
+
*
|
|
139
|
+
* @example
|
|
140
|
+
* ```typescript
|
|
141
|
+
* // Track transfers per block
|
|
142
|
+
* let count = await ctx.cache.getInBlock<number>('transferCount') ?? 0
|
|
143
|
+
* await ctx.cache.setInBlock('transferCount', count + 1)
|
|
144
|
+
* ```
|
|
145
|
+
*/
|
|
146
|
+
async setInBlock(key, value) {
|
|
147
|
+
const block = this.context.getMetaData('for cache', {}).blockNumber;
|
|
148
|
+
return this.set(`${block}-${key}`, value);
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Retrieves a value scoped to the current block number.
|
|
152
|
+
*
|
|
153
|
+
* Only returns values that were set in the same block using `setInBlock`.
|
|
154
|
+
*
|
|
155
|
+
* @typeParam T - The expected type of the cached value
|
|
156
|
+
* @param key - The key to retrieve (block number prefix is added automatically)
|
|
157
|
+
* @returns The cached value for this block, or null if not found
|
|
158
|
+
*
|
|
159
|
+
* @example
|
|
160
|
+
* ```typescript
|
|
161
|
+
* const blockVolume = await ctx.cache.getInBlock<bigint>('volume')
|
|
162
|
+
* ```
|
|
163
|
+
*/
|
|
164
|
+
async getInBlock(key) {
|
|
165
|
+
const block = this.context.getMetaData('for cache', {}).blockNumber;
|
|
166
|
+
return this.get(`${block}-${key}`);
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Removes a value scoped to the current block number.
|
|
170
|
+
*
|
|
171
|
+
* @param key - The key to delete (block number prefix is added automatically)
|
|
172
|
+
*
|
|
173
|
+
* @example
|
|
174
|
+
* ```typescript
|
|
175
|
+
* await ctx.cache.deleteInBlock('temporaryBlockData')
|
|
176
|
+
* ```
|
|
177
|
+
*/
|
|
178
|
+
async deleteInBlock(key) {
|
|
179
|
+
const block = this.context.getMetaData('for cache', {}).blockNumber;
|
|
180
|
+
return this.delete(`${block}-${key}`);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/store/cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/store/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,YAAY,EAAgB,aAAa,EAAyB,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/store/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,YAAY,EAAgB,aAAa,EAAyB,MAAM,kBAAkB,CAAA;AAgEnH,wBAAgB,WAAW,CAAC,GAAG,EAAE,YAAY,GAAG,aAAa,CAQ5D;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM;;;EAI9C"}
|
package/lib/store/schema.js
CHANGED
|
@@ -16,6 +16,7 @@ const baseSchema = buildASTSchema(parse(`
|
|
|
16
16
|
directive @jsonField on OBJECT # legacy
|
|
17
17
|
directive @aggregation(intervals: [String!]! = ["hour"], source: String!) on OBJECT
|
|
18
18
|
directive @aggregate(fn: String!, arg: String, cumulative: Boolean = false) on FIELD_DEFINITION
|
|
19
|
+
directive @cache(sizeMB: Int!) on OBJECT
|
|
19
20
|
${customScalars.map((name) => 'scalar ' + name).join('\n')}
|
|
20
21
|
`));
|
|
21
22
|
function getElemType(type) {
|
package/lib/store/schema.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/store/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAgB,YAAY,EAAiB,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACnH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAA;AAC7B,OAAO,EAAE,iBAAiB,EAAqB,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAEzF,MAAM,aAAa,GAAG,CAAC,QAAQ,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,CAAA;AAE1F,MAAM,UAAU,GAAG,cAAc,CAC/B,KAAK,CAAC
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/store/schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,6 +19,7 @@ export declare class MemoryDatabase {
|
|
|
19
19
|
private fillDerivedFromFields;
|
|
20
20
|
private processRequest;
|
|
21
21
|
reset(): void;
|
|
22
|
+
private requestRequiresSchema;
|
|
22
23
|
private listEntities;
|
|
23
24
|
}
|
|
24
25
|
export declare function withStoreContext(ctx: StoreContext, fn: () => Promise<void>): () => Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory-database.d.ts","sourceRoot":"","sources":["../../src/testing/memory-database.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EACL,SAAS,EAOV,MAAM,gBAAgB,CAAA;AACvB,OAAO,EAAgB,aAAa,EAA0B,MAAM,kBAAkB,CAAA;AAOtF,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"memory-database.d.ts","sourceRoot":"","sources":["../../src/testing/memory-database.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EACL,SAAS,EAOV,MAAM,gBAAgB,CAAA;AACvB,OAAO,EAAgB,aAAa,EAA0B,MAAM,kBAAkB,CAAA;AAOtF,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAKzC,qBAAa,cAAc;IAKb,QAAQ,CAAC,SAAS,EAAE,YAAY;IAJ5C,EAAE,mCAAyC;IACpC,aAAa,EAAE,SAAS,GAAG,SAAS,CAAA;IAC3C,OAAO,EAAE,aAAa,CAAA;gBAED,SAAS,EAAE,YAAY;IAE5C,IAAI,MAAM,kBAST;IAED,IAAI,KAAK,UAER;IAED,KAAK;IAIL,IAAI;IAKG,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM;IAK3C,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG;IAmBtD,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM;IAO3C,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM;IAU5C,OAAO,CAAC,qBAAqB;IA6C7B,OAAO,CAAC,cAAc;IAqEtB,KAAK;IAKL,OAAO,CAAC,qBAAqB;IAmB7B,OAAO,CAAC,YAAY;CAmBrB;AA8ID,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,YAAY,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,uBAI1E"}
|
|
@@ -7,6 +7,8 @@ import { PluginManager } from '@sentio/runtime';
|
|
|
7
7
|
import { BigDecimalConverter, BigIntConverter } from '../store/convert.js';
|
|
8
8
|
import { BigDecimal } from '@sentio/bigdecimal';
|
|
9
9
|
import { Store } from '../store/store.js';
|
|
10
|
+
// Internal entity name used by MemoryCache - bypasses schema validation
|
|
11
|
+
const MEMORY_CACHE_ITEM_ENTITY = 'MemoryCacheItem';
|
|
10
12
|
export class MemoryDatabase {
|
|
11
13
|
dbContext;
|
|
12
14
|
db = new Map();
|
|
@@ -43,6 +45,10 @@ export class MemoryDatabase {
|
|
|
43
45
|
const entityDB = this.db.get(entity) ?? {};
|
|
44
46
|
entityDB[id] = { entity, fields: data.fields };
|
|
45
47
|
this.db.set(entity, entityDB);
|
|
48
|
+
// Skip interface handling for MemoryCacheItem (no schema required)
|
|
49
|
+
if (entity === MEMORY_CACHE_ITEM_ENTITY || !this.schema) {
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
46
52
|
const entityClass = this.schema.getType(entity);
|
|
47
53
|
if (entityClass && entityClass instanceof GraphQLObjectType) {
|
|
48
54
|
for (const intf of entityClass.getInterfaces()) {
|
|
@@ -69,6 +75,10 @@ export class MemoryDatabase {
|
|
|
69
75
|
}
|
|
70
76
|
// a quick and dirty way to mimic how derivedFrom fields are filled in the real database
|
|
71
77
|
fillDerivedFromFields(entity, id, result) {
|
|
78
|
+
// Skip derived fields processing for MemoryCacheItem (no schema required)
|
|
79
|
+
if (entity === MEMORY_CACHE_ITEM_ENTITY || !this.schema) {
|
|
80
|
+
return result;
|
|
81
|
+
}
|
|
72
82
|
const entityClass = this.schema.getType(entity);
|
|
73
83
|
if (entityClass && entityClass instanceof GraphQLObjectType) {
|
|
74
84
|
for (const field of Object.values(entityClass.getFields())) {
|
|
@@ -110,11 +120,13 @@ export class MemoryDatabase {
|
|
|
110
120
|
return result;
|
|
111
121
|
}
|
|
112
122
|
processRequest(request) {
|
|
113
|
-
|
|
123
|
+
const req = request.dbRequest;
|
|
124
|
+
// Check if schema is required for this request
|
|
125
|
+
const requiresSchema = this.requestRequiresSchema(req);
|
|
126
|
+
if (requiresSchema && !this.schema) {
|
|
114
127
|
console.warn('No schema defined, please check if entity schema is defined and loaded');
|
|
115
128
|
return;
|
|
116
129
|
}
|
|
117
|
-
const req = request.dbRequest;
|
|
118
130
|
this.lastDbRequest = req;
|
|
119
131
|
if (req) {
|
|
120
132
|
if (req.upsert) {
|
|
@@ -173,6 +185,25 @@ export class MemoryDatabase {
|
|
|
173
185
|
reset() {
|
|
174
186
|
this.db.clear();
|
|
175
187
|
}
|
|
188
|
+
// Check if the request involves only MemoryCacheItem entity, which doesn't require schema
|
|
189
|
+
requestRequiresSchema(req) {
|
|
190
|
+
if (!req)
|
|
191
|
+
return false;
|
|
192
|
+
// Check if all entities in the request are MemoryCacheItem
|
|
193
|
+
if (req.upsert) {
|
|
194
|
+
return !req.upsert.entity.every((e) => e === MEMORY_CACHE_ITEM_ENTITY);
|
|
195
|
+
}
|
|
196
|
+
if (req.delete) {
|
|
197
|
+
return !req.delete.entity.every((e) => e === MEMORY_CACHE_ITEM_ENTITY);
|
|
198
|
+
}
|
|
199
|
+
if (req.get) {
|
|
200
|
+
return req.get.entity !== MEMORY_CACHE_ITEM_ENTITY;
|
|
201
|
+
}
|
|
202
|
+
if (req.list) {
|
|
203
|
+
return req.list.entity !== MEMORY_CACHE_ITEM_ENTITY;
|
|
204
|
+
}
|
|
205
|
+
return false;
|
|
206
|
+
}
|
|
176
207
|
listEntities(entity, filters) {
|
|
177
208
|
const entityDB = this.db.get(entity);
|
|
178
209
|
const entities = entityDB
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory-database.js","sourceRoot":"","sources":["../../src/testing/memory-database.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"memory-database.js","sourceRoot":"","sources":["../../src/testing/memory-database.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sentio/sdk",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.2.0-rc.2",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -97,8 +97,8 @@
|
|
|
97
97
|
"typechain": "^8.3.2",
|
|
98
98
|
"utility-types": "^3.11.0",
|
|
99
99
|
"yaml": "^2.3.4",
|
|
100
|
-
"@sentio/protos": "3.
|
|
101
|
-
"@sentio/runtime": "^3.
|
|
100
|
+
"@sentio/protos": "3.2.0-rc.2",
|
|
101
|
+
"@sentio/runtime": "^3.2.0-rc.2"
|
|
102
102
|
},
|
|
103
103
|
"peerDependencies": {
|
|
104
104
|
"@sentio/tsup": "^8.3.5-rc.1"
|
package/src/core/base-context.ts
CHANGED
|
@@ -6,11 +6,13 @@ import { mergeProcessResultsInPlace, PluginManager } from '@sentio/runtime'
|
|
|
6
6
|
import { Required } from 'utility-types'
|
|
7
7
|
import { ServerError, Status } from 'nice-grpc'
|
|
8
8
|
import { Store } from '../store/store.js'
|
|
9
|
+
import { MemoryCache } from '../store/cache.js'
|
|
9
10
|
|
|
10
11
|
export abstract class BaseContext {
|
|
11
12
|
meter: Meter
|
|
12
13
|
eventLogger: EventLoggerBinding
|
|
13
14
|
private _store: Store
|
|
15
|
+
private _cache: MemoryCache
|
|
14
16
|
baseLabels: Labels
|
|
15
17
|
private active: boolean
|
|
16
18
|
|
|
@@ -85,6 +87,37 @@ export abstract class BaseContext {
|
|
|
85
87
|
return this._store
|
|
86
88
|
}
|
|
87
89
|
|
|
90
|
+
/**
|
|
91
|
+
* Access the in-memory key-value cache.
|
|
92
|
+
*
|
|
93
|
+
* The cache allows storing and retrieving JSON-serializable values that persist
|
|
94
|
+
* across handler invocations. Useful for caching computed results, tracking
|
|
95
|
+
* cumulative state, or storing intermediate processing data.
|
|
96
|
+
*
|
|
97
|
+
* @returns The MemoryCache instance, or undefined if cache is not available
|
|
98
|
+
*
|
|
99
|
+
* @example
|
|
100
|
+
* ```typescript
|
|
101
|
+
* // Store and retrieve values
|
|
102
|
+
* await ctx.cache.set('totalVolume', volume)
|
|
103
|
+
* const cached = await ctx.cache.get<number>('totalVolume')
|
|
104
|
+
*
|
|
105
|
+
* // Block-scoped values (isolated per block)
|
|
106
|
+
* await ctx.cache.setInBlock('blockCount', count)
|
|
107
|
+
* ```
|
|
108
|
+
*
|
|
109
|
+
* @see {@link MemoryCache} for full API documentation
|
|
110
|
+
*/
|
|
111
|
+
get cache() {
|
|
112
|
+
if (!this._cache) {
|
|
113
|
+
const dbContext = PluginManager.INSTANCE.dbContextLocalStorage.getStore()
|
|
114
|
+
if (dbContext) {
|
|
115
|
+
this._cache = new MemoryCache(dbContext, this)
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return this._cache
|
|
119
|
+
}
|
|
120
|
+
|
|
88
121
|
// this method must be called within the dbContextLocalStorage scope
|
|
89
122
|
initStore() {
|
|
90
123
|
const dbContext = PluginManager.INSTANCE.dbContextLocalStorage.getStore()
|
package/src/core/core-plugin.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Plugin, PluginManager } from '@sentio/runtime'
|
|
1
|
+
import { GLOBAL_CONFIG, Plugin, PluginManager } from '@sentio/runtime'
|
|
2
2
|
import { InitResponse, ProcessConfigResponse } from '@sentio/protos'
|
|
3
3
|
|
|
4
4
|
import { MetricState } from './meter.js'
|
|
@@ -36,9 +36,20 @@ export class CorePlugin extends Plugin {
|
|
|
36
36
|
})
|
|
37
37
|
}
|
|
38
38
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
39
|
+
const schemas = DatabaseSchemaState.INSTANCE.getValues()
|
|
40
|
+
let mergedSources = mergeSchemas(schemas)
|
|
41
|
+
|
|
42
|
+
// Append MemoryCacheItem schema when cache is enabled
|
|
43
|
+
if (GLOBAL_CONFIG.cache?.enabled) {
|
|
44
|
+
mergedSources += `
|
|
45
|
+
type MemoryCacheItem @cache(sizeMB: ${GLOBAL_CONFIG.cache.size || 100}) {
|
|
46
|
+
id: ID!
|
|
47
|
+
value: String!
|
|
48
|
+
}
|
|
49
|
+
`
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
if (mergedSources.trim().length > 0) {
|
|
42
53
|
config.dbSchema = {
|
|
43
54
|
gqlSchema: mergedSources
|
|
44
55
|
}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
import { IStoreContext } from '@sentio/runtime'
|
|
2
|
+
import { DBRequest, DBResponse, RichStruct, RichValue } from '@sentio/protos'
|
|
3
|
+
import { BaseContext } from '../core/index.js'
|
|
4
|
+
|
|
5
|
+
/** Internal entity name used for cache storage */
|
|
6
|
+
const CacheItemEntityName = 'MemoryCacheItem'
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* A key-value cache that persists across handler invocations.
|
|
10
|
+
*
|
|
11
|
+
* MemoryCache provides a simple interface for storing and retrieving JSON-serializable
|
|
12
|
+
* values. It's useful for caching computed results, tracking state between events,
|
|
13
|
+
* or storing intermediate data during processing.
|
|
14
|
+
*
|
|
15
|
+
* Access the cache through the context object in your handlers:
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```typescript
|
|
19
|
+
* // Basic usage
|
|
20
|
+
* ERC20Processor.bind({ address: TOKEN_ADDRESS })
|
|
21
|
+
* .onEventTransfer(async (event, ctx) => {
|
|
22
|
+
* // Get cached total
|
|
23
|
+
* let total = await ctx.cache.get<number>('transferTotal') ?? 0
|
|
24
|
+
* total += Number(event.args.value)
|
|
25
|
+
* await ctx.cache.set('transferTotal', total)
|
|
26
|
+
* })
|
|
27
|
+
* ```
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* ```typescript
|
|
31
|
+
* // Block-scoped caching (values isolated per block)
|
|
32
|
+
* .onEventTransfer(async (event, ctx) => {
|
|
33
|
+
* // This value is only visible within the current block
|
|
34
|
+
* await ctx.cache.setInBlock('blockTransferCount', count)
|
|
35
|
+
* const blockCount = await ctx.cache.getInBlock<number>('blockTransferCount')
|
|
36
|
+
* })
|
|
37
|
+
* ```
|
|
38
|
+
*
|
|
39
|
+
* @remarks
|
|
40
|
+
* - Values are JSON serialized, so only JSON-compatible types are supported
|
|
41
|
+
* - Cache is enabled by default; configure via `GLOBAL_CONFIG.cache`
|
|
42
|
+
* - Block-scoped methods (`*InBlock`) prefix keys with block number for isolation
|
|
43
|
+
*/
|
|
44
|
+
export class MemoryCache {
|
|
45
|
+
constructor(
|
|
46
|
+
private readonly storeContext: IStoreContext,
|
|
47
|
+
private readonly context: BaseContext
|
|
48
|
+
) {}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Retrieves a value from the cache.
|
|
52
|
+
*
|
|
53
|
+
* @typeParam T - The expected type of the cached value
|
|
54
|
+
* @param key - The unique key identifying the cached value
|
|
55
|
+
* @returns The cached value deserialized as type T, or null if not found
|
|
56
|
+
*
|
|
57
|
+
* @example
|
|
58
|
+
* ```typescript
|
|
59
|
+
* const user = await ctx.cache.get<{ name: string, score: number }>('user:123')
|
|
60
|
+
* if (user) {
|
|
61
|
+
* console.log(user.name, user.score)
|
|
62
|
+
* }
|
|
63
|
+
* ```
|
|
64
|
+
*/
|
|
65
|
+
public async get<T>(key: string): Promise<T | null> {
|
|
66
|
+
const promise = this.storeContext.sendRequest({
|
|
67
|
+
get: {
|
|
68
|
+
entity: CacheItemEntityName,
|
|
69
|
+
id: key
|
|
70
|
+
}
|
|
71
|
+
})
|
|
72
|
+
|
|
73
|
+
const data = (await promise) as DBResponse
|
|
74
|
+
if (data.entityList?.entities[0]) {
|
|
75
|
+
const entityData = data.entityList?.entities[0]?.data as RichStruct
|
|
76
|
+
const value = entityData.fields['value'] as RichValue
|
|
77
|
+
return JSON.parse(value.stringValue!) as T
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
return null
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Stores a value in the cache.
|
|
85
|
+
*
|
|
86
|
+
* @typeParam T - The type of value being stored (must be JSON-serializable)
|
|
87
|
+
* @param key - The unique key to store the value under
|
|
88
|
+
* @param value - The value to cache (will be JSON serialized)
|
|
89
|
+
*
|
|
90
|
+
* @example
|
|
91
|
+
* ```typescript
|
|
92
|
+
* await ctx.cache.set('config', { threshold: 100, enabled: true })
|
|
93
|
+
* await ctx.cache.set('lastPrice', 1234.56)
|
|
94
|
+
* ```
|
|
95
|
+
*/
|
|
96
|
+
public async set<T>(key: string, value: T): Promise<void> {
|
|
97
|
+
const entityData: RichStruct = {
|
|
98
|
+
fields: {
|
|
99
|
+
id: {
|
|
100
|
+
stringValue: key
|
|
101
|
+
},
|
|
102
|
+
value: {
|
|
103
|
+
stringValue: JSON.stringify(value)
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
const request = {
|
|
108
|
+
upsert: {
|
|
109
|
+
entity: [CacheItemEntityName],
|
|
110
|
+
id: [key],
|
|
111
|
+
entityData: [entityData]
|
|
112
|
+
}
|
|
113
|
+
} as DBRequest
|
|
114
|
+
await this.storeContext.sendRequest(request)
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Removes a value from the cache.
|
|
119
|
+
*
|
|
120
|
+
* @param key - The key of the value to remove
|
|
121
|
+
*
|
|
122
|
+
* @example
|
|
123
|
+
* ```typescript
|
|
124
|
+
* await ctx.cache.delete('temporaryData')
|
|
125
|
+
* ```
|
|
126
|
+
*/
|
|
127
|
+
public async delete(key: string): Promise<void> {
|
|
128
|
+
const request = {
|
|
129
|
+
delete: {
|
|
130
|
+
entity: [CacheItemEntityName],
|
|
131
|
+
id: [key]
|
|
132
|
+
}
|
|
133
|
+
} as DBRequest
|
|
134
|
+
await this.storeContext.sendRequest(request)
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Stores a value scoped to the current block number.
|
|
139
|
+
*
|
|
140
|
+
* The key is automatically prefixed with the block number, ensuring that
|
|
141
|
+
* values set in different blocks don't collide. Useful for accumulating
|
|
142
|
+
* per-block statistics or temporary computation results.
|
|
143
|
+
*
|
|
144
|
+
* @typeParam T - The type of value being stored (must be JSON-serializable)
|
|
145
|
+
* @param key - The key to store the value under (will be prefixed with block number)
|
|
146
|
+
* @param value - The value to cache
|
|
147
|
+
*
|
|
148
|
+
* @example
|
|
149
|
+
* ```typescript
|
|
150
|
+
* // Track transfers per block
|
|
151
|
+
* let count = await ctx.cache.getInBlock<number>('transferCount') ?? 0
|
|
152
|
+
* await ctx.cache.setInBlock('transferCount', count + 1)
|
|
153
|
+
* ```
|
|
154
|
+
*/
|
|
155
|
+
public async setInBlock<T>(key: string, value: T): Promise<void> {
|
|
156
|
+
const block = this.context.getMetaData('for cache', {}).blockNumber
|
|
157
|
+
return this.set<T>(`${block}-${key}`, value)
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* Retrieves a value scoped to the current block number.
|
|
162
|
+
*
|
|
163
|
+
* Only returns values that were set in the same block using `setInBlock`.
|
|
164
|
+
*
|
|
165
|
+
* @typeParam T - The expected type of the cached value
|
|
166
|
+
* @param key - The key to retrieve (block number prefix is added automatically)
|
|
167
|
+
* @returns The cached value for this block, or null if not found
|
|
168
|
+
*
|
|
169
|
+
* @example
|
|
170
|
+
* ```typescript
|
|
171
|
+
* const blockVolume = await ctx.cache.getInBlock<bigint>('volume')
|
|
172
|
+
* ```
|
|
173
|
+
*/
|
|
174
|
+
public async getInBlock<T>(key: string): Promise<T | null> {
|
|
175
|
+
const block = this.context.getMetaData('for cache', {}).blockNumber
|
|
176
|
+
return this.get<T>(`${block}-${key}`)
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* Removes a value scoped to the current block number.
|
|
181
|
+
*
|
|
182
|
+
* @param key - The key to delete (block number prefix is added automatically)
|
|
183
|
+
*
|
|
184
|
+
* @example
|
|
185
|
+
* ```typescript
|
|
186
|
+
* await ctx.cache.deleteInBlock('temporaryBlockData')
|
|
187
|
+
* ```
|
|
188
|
+
*/
|
|
189
|
+
public async deleteInBlock(key: string): Promise<void> {
|
|
190
|
+
const block = this.context.getMetaData('for cache', {}).blockNumber
|
|
191
|
+
return this.delete(`${block}-${key}`)
|
|
192
|
+
}
|
|
193
|
+
}
|
package/src/store/schema.ts
CHANGED
|
@@ -19,6 +19,7 @@ const baseSchema = buildASTSchema(
|
|
|
19
19
|
directive @jsonField on OBJECT # legacy
|
|
20
20
|
directive @aggregation(intervals: [String!]! = ["hour"], source: String!) on OBJECT
|
|
21
21
|
directive @aggregate(fn: String!, arg: String, cumulative: Boolean = false) on FIELD_DEFINITION
|
|
22
|
+
directive @cache(sizeMB: Int!) on OBJECT
|
|
22
23
|
${customScalars.map((name) => 'scalar ' + name).join('\n')}
|
|
23
24
|
`)
|
|
24
25
|
)
|
|
@@ -17,6 +17,9 @@ import { BigDecimalConverter, BigIntConverter } from '../store/convert.js'
|
|
|
17
17
|
import { BigDecimal } from '@sentio/bigdecimal'
|
|
18
18
|
import { Store } from '../store/store.js'
|
|
19
19
|
|
|
20
|
+
// Internal entity name used by MemoryCache - bypasses schema validation
|
|
21
|
+
const MEMORY_CACHE_ITEM_ENTITY = 'MemoryCacheItem'
|
|
22
|
+
|
|
20
23
|
export class MemoryDatabase {
|
|
21
24
|
db = new Map<string, Record<string, any>>()
|
|
22
25
|
public lastDbRequest: DBRequest | undefined
|
|
@@ -57,6 +60,10 @@ export class MemoryDatabase {
|
|
|
57
60
|
const entityDB = this.db.get(entity) ?? {}
|
|
58
61
|
entityDB[id] = { entity, fields: data.fields }
|
|
59
62
|
this.db.set(entity, entityDB)
|
|
63
|
+
// Skip interface handling for MemoryCacheItem (no schema required)
|
|
64
|
+
if (entity === MEMORY_CACHE_ITEM_ENTITY || !this.schema) {
|
|
65
|
+
return
|
|
66
|
+
}
|
|
60
67
|
const entityClass = this.schema.getType(entity)
|
|
61
68
|
if (entityClass && entityClass instanceof GraphQLObjectType) {
|
|
62
69
|
for (const intf of entityClass.getInterfaces()) {
|
|
@@ -86,6 +93,10 @@ export class MemoryDatabase {
|
|
|
86
93
|
|
|
87
94
|
// a quick and dirty way to mimic how derivedFrom fields are filled in the real database
|
|
88
95
|
private fillDerivedFromFields(entity: string, id: string, result: any) {
|
|
96
|
+
// Skip derived fields processing for MemoryCacheItem (no schema required)
|
|
97
|
+
if (entity === MEMORY_CACHE_ITEM_ENTITY || !this.schema) {
|
|
98
|
+
return result
|
|
99
|
+
}
|
|
89
100
|
const entityClass = this.schema.getType(entity)
|
|
90
101
|
if (entityClass && entityClass instanceof GraphQLObjectType) {
|
|
91
102
|
for (const field of Object.values(entityClass.getFields())) {
|
|
@@ -127,12 +138,15 @@ export class MemoryDatabase {
|
|
|
127
138
|
}
|
|
128
139
|
|
|
129
140
|
private processRequest(request: ProcessStreamResponse) {
|
|
130
|
-
|
|
141
|
+
const req = request.dbRequest
|
|
142
|
+
|
|
143
|
+
// Check if schema is required for this request
|
|
144
|
+
const requiresSchema = this.requestRequiresSchema(req)
|
|
145
|
+
if (requiresSchema && !this.schema) {
|
|
131
146
|
console.warn('No schema defined, please check if entity schema is defined and loaded')
|
|
132
147
|
return
|
|
133
148
|
}
|
|
134
149
|
|
|
135
|
-
const req = request.dbRequest
|
|
136
150
|
this.lastDbRequest = req
|
|
137
151
|
if (req) {
|
|
138
152
|
if (req.upsert) {
|
|
@@ -196,6 +210,26 @@ export class MemoryDatabase {
|
|
|
196
210
|
this.db.clear()
|
|
197
211
|
}
|
|
198
212
|
|
|
213
|
+
// Check if the request involves only MemoryCacheItem entity, which doesn't require schema
|
|
214
|
+
private requestRequiresSchema(req: DBRequest | undefined): boolean {
|
|
215
|
+
if (!req) return false
|
|
216
|
+
|
|
217
|
+
// Check if all entities in the request are MemoryCacheItem
|
|
218
|
+
if (req.upsert) {
|
|
219
|
+
return !req.upsert.entity.every((e) => e === MEMORY_CACHE_ITEM_ENTITY)
|
|
220
|
+
}
|
|
221
|
+
if (req.delete) {
|
|
222
|
+
return !req.delete.entity.every((e) => e === MEMORY_CACHE_ITEM_ENTITY)
|
|
223
|
+
}
|
|
224
|
+
if (req.get) {
|
|
225
|
+
return req.get.entity !== MEMORY_CACHE_ITEM_ENTITY
|
|
226
|
+
}
|
|
227
|
+
if (req.list) {
|
|
228
|
+
return req.list.entity !== MEMORY_CACHE_ITEM_ENTITY
|
|
229
|
+
}
|
|
230
|
+
return false
|
|
231
|
+
}
|
|
232
|
+
|
|
199
233
|
private listEntities(entity: string, filters?: DBRequest_DBFilter[]) {
|
|
200
234
|
const entityDB = this.db.get(entity)
|
|
201
235
|
const entities = entityDB
|