@orkify/cli 1.0.0-beta.5 → 1.0.0-beta.6
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 +10 -5
- package/package.json +8 -31
- package/packages/cache/README.md +0 -114
- package/packages/cache/dist/CacheClient.d.ts +0 -26
- package/packages/cache/dist/CacheClient.d.ts.map +0 -1
- package/packages/cache/dist/CacheClient.js +0 -174
- package/packages/cache/dist/CacheClient.js.map +0 -1
- package/packages/cache/dist/CacheFileStore.d.ts +0 -45
- package/packages/cache/dist/CacheFileStore.d.ts.map +0 -1
- package/packages/cache/dist/CacheFileStore.js +0 -446
- package/packages/cache/dist/CacheFileStore.js.map +0 -1
- package/packages/cache/dist/CachePersistence.d.ts +0 -9
- package/packages/cache/dist/CachePersistence.d.ts.map +0 -1
- package/packages/cache/dist/CachePersistence.js +0 -67
- package/packages/cache/dist/CachePersistence.js.map +0 -1
- package/packages/cache/dist/CachePrimary.d.ts +0 -25
- package/packages/cache/dist/CachePrimary.d.ts.map +0 -1
- package/packages/cache/dist/CachePrimary.js +0 -155
- package/packages/cache/dist/CachePrimary.js.map +0 -1
- package/packages/cache/dist/CacheStore.d.ts +0 -50
- package/packages/cache/dist/CacheStore.d.ts.map +0 -1
- package/packages/cache/dist/CacheStore.js +0 -271
- package/packages/cache/dist/CacheStore.js.map +0 -1
- package/packages/cache/dist/constants.d.ts +0 -6
- package/packages/cache/dist/constants.d.ts.map +0 -1
- package/packages/cache/dist/constants.js +0 -9
- package/packages/cache/dist/constants.js.map +0 -1
- package/packages/cache/dist/index.d.ts +0 -16
- package/packages/cache/dist/index.d.ts.map +0 -1
- package/packages/cache/dist/index.js +0 -86
- package/packages/cache/dist/index.js.map +0 -1
- package/packages/cache/dist/serialize.d.ts +0 -9
- package/packages/cache/dist/serialize.d.ts.map +0 -1
- package/packages/cache/dist/serialize.js +0 -40
- package/packages/cache/dist/serialize.js.map +0 -1
- package/packages/cache/dist/types.d.ts +0 -123
- package/packages/cache/dist/types.d.ts.map +0 -1
- package/packages/cache/dist/types.js +0 -2
- package/packages/cache/dist/types.js.map +0 -1
- package/packages/cache/package.json +0 -27
- package/packages/cache/src/CacheClient.ts +0 -227
- package/packages/cache/src/CacheFileStore.ts +0 -528
- package/packages/cache/src/CachePersistence.ts +0 -89
- package/packages/cache/src/CachePrimary.ts +0 -172
- package/packages/cache/src/CacheStore.ts +0 -308
- package/packages/cache/src/constants.ts +0 -10
- package/packages/cache/src/index.ts +0 -100
- package/packages/cache/src/serialize.ts +0 -49
- package/packages/cache/src/types.ts +0 -156
- package/packages/cache/tsconfig.json +0 -18
- package/packages/cache/tsconfig.tsbuildinfo +0 -1
- package/packages/next/README.md +0 -166
- package/packages/next/dist/error-capture.d.ts +0 -34
- package/packages/next/dist/error-capture.d.ts.map +0 -1
- package/packages/next/dist/error-capture.js +0 -130
- package/packages/next/dist/error-capture.js.map +0 -1
- package/packages/next/dist/error-handler.d.ts +0 -10
- package/packages/next/dist/error-handler.d.ts.map +0 -1
- package/packages/next/dist/error-handler.js +0 -186
- package/packages/next/dist/error-handler.js.map +0 -1
- package/packages/next/dist/isr-cache.d.ts +0 -9
- package/packages/next/dist/isr-cache.d.ts.map +0 -1
- package/packages/next/dist/isr-cache.js +0 -86
- package/packages/next/dist/isr-cache.js.map +0 -1
- package/packages/next/dist/stream.d.ts +0 -5
- package/packages/next/dist/stream.d.ts.map +0 -1
- package/packages/next/dist/stream.js +0 -22
- package/packages/next/dist/stream.js.map +0 -1
- package/packages/next/dist/types.d.ts +0 -33
- package/packages/next/dist/types.d.ts.map +0 -1
- package/packages/next/dist/types.js +0 -6
- package/packages/next/dist/types.js.map +0 -1
- package/packages/next/dist/use-cache.d.ts +0 -4
- package/packages/next/dist/use-cache.d.ts.map +0 -1
- package/packages/next/dist/use-cache.js +0 -86
- package/packages/next/dist/use-cache.js.map +0 -1
- package/packages/next/dist/utils.d.ts +0 -32
- package/packages/next/dist/utils.d.ts.map +0 -1
- package/packages/next/dist/utils.js +0 -88
- package/packages/next/dist/utils.js.map +0 -1
- package/packages/next/package.json +0 -52
- package/packages/next/src/error-capture.ts +0 -177
- package/packages/next/src/error-handler.ts +0 -221
- package/packages/next/src/isr-cache.ts +0 -100
- package/packages/next/src/stream.ts +0 -23
- package/packages/next/src/types.ts +0 -33
- package/packages/next/src/use-cache.ts +0 -99
- package/packages/next/src/utils.ts +0 -102
- package/packages/next/tsconfig.json +0 -19
- package/packages/next/tsconfig.tsbuildinfo +0 -1
package/README.md
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
[](https://github.com/orkify/orkify)
|
|
4
4
|
[](https://github.com/orkify/orkify/actions/workflows/ci.yml)
|
|
5
|
-
[](https://www.npmjs.com/package/@orkify/cli)
|
|
6
|
+
[](https://nodejs.org/)
|
|
7
|
+
[](https://github.com/orkify/orkify/blob/main/LICENSE)
|
|
8
8
|
[](https://www.typescriptlang.org/)
|
|
9
9
|
|
|
10
10
|
Modern JS process orchestration and deployment for your own infrastructure.
|
|
@@ -59,8 +59,13 @@ Modern JS process orchestration and deployment for your own infrastructure.
|
|
|
59
59
|
## Installation
|
|
60
60
|
|
|
61
61
|
```bash
|
|
62
|
-
npm install
|
|
63
|
-
|
|
62
|
+
npm install -g @orkify/cli
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Or run directly with npx:
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
npx @orkify/cli up app.js
|
|
64
69
|
```
|
|
65
70
|
|
|
66
71
|
## Quick Start
|
package/package.json
CHANGED
|
@@ -1,36 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@orkify/cli",
|
|
3
|
-
"version": "1.0.0-beta.
|
|
3
|
+
"version": "1.0.0-beta.6",
|
|
4
4
|
"description": "Modern JS process orchestration and deployment for your own infrastructure",
|
|
5
5
|
"type": "module",
|
|
6
|
+
"workspaces": [
|
|
7
|
+
"packages/*"
|
|
8
|
+
],
|
|
6
9
|
"main": "dist/cli/index.js",
|
|
7
10
|
"exports": {
|
|
8
|
-
".": "./dist/cli/index.js"
|
|
9
|
-
"./cache": {
|
|
10
|
-
"types": "./packages/cache/src/index.ts",
|
|
11
|
-
"import": "./packages/cache/dist/index.js",
|
|
12
|
-
"default": "./packages/cache/dist/index.js"
|
|
13
|
-
},
|
|
14
|
-
"./next/use-cache": {
|
|
15
|
-
"types": "./packages/next/src/use-cache.ts",
|
|
16
|
-
"import": "./packages/next/dist/use-cache.js",
|
|
17
|
-
"default": "./packages/next/dist/use-cache.js"
|
|
18
|
-
},
|
|
19
|
-
"./next/isr-cache": {
|
|
20
|
-
"types": "./packages/next/src/isr-cache.ts",
|
|
21
|
-
"import": "./packages/next/dist/isr-cache.js",
|
|
22
|
-
"default": "./packages/next/dist/isr-cache.js"
|
|
23
|
-
},
|
|
24
|
-
"./next/error-capture": {
|
|
25
|
-
"types": "./packages/next/src/error-capture.ts",
|
|
26
|
-
"import": "./packages/next/dist/error-capture.js",
|
|
27
|
-
"default": "./packages/next/dist/error-capture.js"
|
|
28
|
-
},
|
|
29
|
-
"./next/error-handler": {
|
|
30
|
-
"types": "./packages/next/src/error-handler.ts",
|
|
31
|
-
"import": "./packages/next/dist/error-handler.js",
|
|
32
|
-
"default": "./packages/next/dist/error-handler.js"
|
|
33
|
-
}
|
|
11
|
+
".": "./dist/cli/index.js"
|
|
34
12
|
},
|
|
35
13
|
"bin": {
|
|
36
14
|
"orkify": "./bin/orkify"
|
|
@@ -39,8 +17,7 @@
|
|
|
39
17
|
"bin/",
|
|
40
18
|
"boot/",
|
|
41
19
|
"dist/**/*.js",
|
|
42
|
-
"dist/**/*.d.ts"
|
|
43
|
-
"packages/"
|
|
20
|
+
"dist/**/*.d.ts"
|
|
44
21
|
],
|
|
45
22
|
"scripts": {
|
|
46
23
|
"build": "tsc -p packages/cache/tsconfig.json && tsc -p packages/next/tsconfig.json && tsc",
|
|
@@ -96,8 +73,8 @@
|
|
|
96
73
|
},
|
|
97
74
|
"dependencies": {
|
|
98
75
|
"@modelcontextprotocol/sdk": "^1.25.3",
|
|
99
|
-
"@orkify/cache": "
|
|
100
|
-
"@orkify/next": "
|
|
76
|
+
"@orkify/cache": "^1.0.0-beta.6",
|
|
77
|
+
"@orkify/next": "^1.0.0-beta.6",
|
|
101
78
|
"@socket.io/cluster-adapter": "^0.3.0",
|
|
102
79
|
"@socket.io/sticky": "^1.0.4",
|
|
103
80
|
"chalk": "^5.3.0",
|
package/packages/cache/README.md
DELETED
|
@@ -1,114 +0,0 @@
|
|
|
1
|
-
# @orkify/cache
|
|
2
|
-
|
|
3
|
-
[](https://www.npmjs.com/package/@orkify/cache)
|
|
4
|
-
[](https://nodejs.org/)
|
|
5
|
-
[](https://github.com/orkify/orkify/blob/main/LICENSE)
|
|
6
|
-
[](https://www.typescriptlang.org/)
|
|
7
|
-
|
|
8
|
-
Framework-agnostic shared cache for [orkify](https://orkify.com)-managed Node.js processes.
|
|
9
|
-
|
|
10
|
-
## Installation
|
|
11
|
-
|
|
12
|
-
```bash
|
|
13
|
-
npm install @orkify/cache
|
|
14
|
-
```
|
|
15
|
-
|
|
16
|
-
## Usage
|
|
17
|
-
|
|
18
|
-
```typescript
|
|
19
|
-
import { cache } from '@orkify/cache';
|
|
20
|
-
|
|
21
|
-
// Set a value
|
|
22
|
-
cache.set('user:123', { name: 'Alice', role: 'admin' });
|
|
23
|
-
|
|
24
|
-
// Set with TTL (seconds) and tags
|
|
25
|
-
cache.set('post:456', postData, { ttl: 300, tags: ['posts', 'user:123'] });
|
|
26
|
-
|
|
27
|
-
// Get a value (synchronous, local memory)
|
|
28
|
-
const user = cache.get<User>('user:123');
|
|
29
|
-
|
|
30
|
-
// Get with async fallback (checks file-backed cold layer)
|
|
31
|
-
const post = await cache.getAsync<Post>('post:456');
|
|
32
|
-
|
|
33
|
-
// Check existence
|
|
34
|
-
cache.has('user:123');
|
|
35
|
-
|
|
36
|
-
// Delete + broadcast to all workers
|
|
37
|
-
cache.delete('user:123');
|
|
38
|
-
|
|
39
|
-
// Clear all entries + broadcast
|
|
40
|
-
cache.clear();
|
|
41
|
-
|
|
42
|
-
// Invalidate all entries with a tag + record timestamp
|
|
43
|
-
cache.invalidateTag('posts');
|
|
44
|
-
|
|
45
|
-
// Query when a tag was last invalidated
|
|
46
|
-
cache.getTagExpiration(['posts']);
|
|
47
|
-
|
|
48
|
-
// Record a timestamp without deleting entries (stale-while-revalidate)
|
|
49
|
-
cache.updateTagTimestamp('posts');
|
|
50
|
-
|
|
51
|
-
// Cache stats
|
|
52
|
-
const stats = cache.stats();
|
|
53
|
-
// { size, hits, misses, hitRate, totalBytes, diskSize }
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
`get()` reads from memory only — always sync, zero overhead. `getAsync()` checks memory first, then falls back to disk if file-backed mode is enabled.
|
|
57
|
-
|
|
58
|
-
## Configuration
|
|
59
|
-
|
|
60
|
-
Optional — call `cache.configure()` before the first use, or defaults apply:
|
|
61
|
-
|
|
62
|
-
```typescript
|
|
63
|
-
import { cache } from '@orkify/cache';
|
|
64
|
-
|
|
65
|
-
cache.configure({
|
|
66
|
-
maxEntries: 50_000, // Default: 10,000
|
|
67
|
-
defaultTtl: 300, // Default: undefined (no expiry, seconds)
|
|
68
|
-
maxMemorySize: 128 * 1024 * 1024, // Default: 64 MB per worker
|
|
69
|
-
maxValueSize: 2 << 20, // Default: 1 MB
|
|
70
|
-
fileBacked: true, // Default: true — evicted entries spill to disk
|
|
71
|
-
});
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
| Option | Default | Description |
|
|
75
|
-
| --------------- | ----------------------- | ------------------------------------------------------------------------ |
|
|
76
|
-
| `maxEntries` | `10,000` | Maximum entries before LRU eviction kicks in |
|
|
77
|
-
| `defaultTtl` | `undefined` (no expiry) | Default TTL in seconds for entries without an explicit `ttl` |
|
|
78
|
-
| `maxMemorySize` | `64 MB` | Maximum memory per worker before byte-based LRU eviction |
|
|
79
|
-
| `maxValueSize` | `1 MB` | Maximum byte size of a single value (rejects larger with an error) |
|
|
80
|
-
| `fileBacked` | `true` | Persist evicted entries to disk, survive restarts, read via `getAsync()` |
|
|
81
|
-
|
|
82
|
-
## How It Works
|
|
83
|
-
|
|
84
|
-
| Mode | Behavior |
|
|
85
|
-
| -------------------------- | ------------------------------------------------------- |
|
|
86
|
-
| `npm run dev` (standalone) | Local cache + disk cold layer, no IPC |
|
|
87
|
-
| `orkify up -w 1` (fork) | Local cache + disk cold layer, no IPC |
|
|
88
|
-
| `orkify up -w 4` (cluster) | Broadcast cache — writes sync via IPC, reads stay local |
|
|
89
|
-
| `orkify run` (foreground) | Local cache + disk cold layer, no IPC |
|
|
90
|
-
|
|
91
|
-
The API is identical in every mode. In standalone or fork mode, it degrades gracefully to a plain local cache — no errors, no code changes needed. Deploy with `orkify up -w 4` and the same code syncs across workers automatically.
|
|
92
|
-
|
|
93
|
-
## Features
|
|
94
|
-
|
|
95
|
-
- LRU eviction (entry-count and byte-based)
|
|
96
|
-
- TTL expiration
|
|
97
|
-
- Tag-based group invalidation with timestamps
|
|
98
|
-
- V8 serialization (supports Map, Set, Date, RegExp, Error, ArrayBuffer, TypedArray)
|
|
99
|
-
- Value validation — rejects functions, symbols, and oversized values with descriptive errors
|
|
100
|
-
- Two-tier architecture: hot memory layer + cold file-backed layer
|
|
101
|
-
- Cluster-safe: automatic IPC synchronization across workers
|
|
102
|
-
- Snapshots sent to new workers on spawn
|
|
103
|
-
- Eventual consistency: other workers may read stale values for one IPC round trip after a write
|
|
104
|
-
|
|
105
|
-
For full details on eviction, persistence lifecycle, and cluster behavior, see the [main orkify README](https://github.com/orkify/orkify#shared-cluster-cache).
|
|
106
|
-
|
|
107
|
-
## Requirements
|
|
108
|
-
|
|
109
|
-
- Node.js 22+
|
|
110
|
-
- Must run under [orkify](https://github.com/orkify/orkify) for cluster mode features
|
|
111
|
-
|
|
112
|
-
## License
|
|
113
|
-
|
|
114
|
-
Apache-2.0
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import type { CacheConfig, CacheSetOptions, CacheStats } from './types.js';
|
|
2
|
-
export declare class CacheClient {
|
|
3
|
-
private clusterMode;
|
|
4
|
-
private defaultTtl;
|
|
5
|
-
private maxValueSize;
|
|
6
|
-
private messageHandler;
|
|
7
|
-
private store;
|
|
8
|
-
constructor(config?: CacheConfig, bufferedMessages?: unknown[]);
|
|
9
|
-
/** Configure cache options. Must be called before any other method. Intercepted by the proxy in `cache/index.ts`. */
|
|
10
|
-
configure(_config: CacheConfig): void;
|
|
11
|
-
get<T>(key: string): T | undefined;
|
|
12
|
-
getAsync<T>(key: string): Promise<T | undefined>;
|
|
13
|
-
set(key: string, value: unknown, opts?: CacheSetOptions): void;
|
|
14
|
-
delete(key: string): void;
|
|
15
|
-
clear(): void;
|
|
16
|
-
has(key: string): boolean;
|
|
17
|
-
stats(): CacheStats;
|
|
18
|
-
getTagExpiration(tags: string[]): number;
|
|
19
|
-
invalidateTag(tag: string): void;
|
|
20
|
-
updateTagTimestamp(tag: string, timestamp?: number): void;
|
|
21
|
-
destroy(): void;
|
|
22
|
-
/** Send an IPC message to the cluster primary, silently ignoring failures (e.g. closed channel). */
|
|
23
|
-
private trySend;
|
|
24
|
-
private handleMessage;
|
|
25
|
-
}
|
|
26
|
-
//# sourceMappingURL=CacheClient.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"CacheClient.d.ts","sourceRoot":"","sources":["../src/CacheClient.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAMV,WAAW,EACX,eAAe,EAEf,UAAU,EAEX,MAAM,YAAY,CAAC;AAcpB,qBAAa,WAAW;IACtB,OAAO,CAAC,WAAW,CAAU;IAC7B,OAAO,CAAC,UAAU,CAAqB;IACvC,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,cAAc,CAAuC;IAC7D,OAAO,CAAC,KAAK,CAAc;gBAEf,MAAM,CAAC,EAAE,WAAW,EAAE,gBAAgB,CAAC,EAAE,OAAO,EAAE;IAiE9D,qHAAqH;IACrH,SAAS,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI;IAIrC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IAI5B,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IAItD,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,eAAe,GAAG,IAAI;IAwB9D,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAQzB,KAAK,IAAI,IAAI;IAQb,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIzB,KAAK,IAAI,UAAU;IAInB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM;IAIxC,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAQhC,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI;IASzD,OAAO,IAAI,IAAI;IAQf,oGAAoG;IACpG,OAAO,CAAC,OAAO;IAQf,OAAO,CAAC,aAAa;CA8BtB"}
|
|
@@ -1,174 +0,0 @@
|
|
|
1
|
-
import { CACHE_DEFAULT_MAX_VALUE_SIZE } from './constants.js';
|
|
2
|
-
import { CacheFileStore } from './CacheFileStore.js';
|
|
3
|
-
import { CacheStore } from './CacheStore.js';
|
|
4
|
-
import { serialize, serializedByteLength } from './serialize.js';
|
|
5
|
-
export class CacheClient {
|
|
6
|
-
clusterMode;
|
|
7
|
-
defaultTtl;
|
|
8
|
-
maxValueSize;
|
|
9
|
-
messageHandler;
|
|
10
|
-
store;
|
|
11
|
-
constructor(config, bufferedMessages) {
|
|
12
|
-
this.defaultTtl = config?.defaultTtl;
|
|
13
|
-
this.maxValueSize = config?.maxValueSize ?? CACHE_DEFAULT_MAX_VALUE_SIZE;
|
|
14
|
-
this.clusterMode =
|
|
15
|
-
process.env.ORKIFY_CLUSTER_MODE === 'true' && typeof process.send === 'function';
|
|
16
|
-
// File-backed: CacheFileStore for disk cold layer.
|
|
17
|
-
// In cluster mode workers are readOnly (reads from disk, writes go through IPC to primary).
|
|
18
|
-
// In standalone/fork mode the store has full read/write access.
|
|
19
|
-
const fileBacked = config?.fileBacked === true;
|
|
20
|
-
this.store = fileBacked
|
|
21
|
-
? new CacheFileStore(process.env.ORKIFY_PROCESS_NAME ?? 'default', config, this.clusterMode ? { readOnly: true } : undefined)
|
|
22
|
-
: new CacheStore(config);
|
|
23
|
-
// In fork/standalone mode, flush file-backed cache on process exit so all
|
|
24
|
-
// entries (not just evicted ones) survive restarts. Uses synchronous I/O
|
|
25
|
-
// since the 'exit' event doesn't support async operations.
|
|
26
|
-
if (!this.clusterMode && fileBacked) {
|
|
27
|
-
const fileStore = this.store;
|
|
28
|
-
// IPC flush for graceful shutdown (works cross-platform including Windows
|
|
29
|
-
// where SIGTERM doesn't trigger exit handlers)
|
|
30
|
-
process.on('message', (msg) => {
|
|
31
|
-
const m = msg;
|
|
32
|
-
if (m?.__orkify && m.type === 'cache:flush') {
|
|
33
|
-
fileStore.flushSync();
|
|
34
|
-
try {
|
|
35
|
-
process.send?.({ __orkify: true, type: 'cache:flushed' });
|
|
36
|
-
}
|
|
37
|
-
catch {
|
|
38
|
-
// parent may have disconnected
|
|
39
|
-
}
|
|
40
|
-
process.exit(0);
|
|
41
|
-
}
|
|
42
|
-
});
|
|
43
|
-
// Fallback: also flush on exit event (works on Unix via SIGTERM → exit)
|
|
44
|
-
process.on('exit', () => fileStore.flushSync());
|
|
45
|
-
}
|
|
46
|
-
if (this.clusterMode) {
|
|
47
|
-
this.messageHandler = (msg) => this.handleMessage(msg);
|
|
48
|
-
process.on('message', this.messageHandler);
|
|
49
|
-
// Drain any IPC messages that arrived before this client was created
|
|
50
|
-
if (bufferedMessages) {
|
|
51
|
-
for (const msg of bufferedMessages) {
|
|
52
|
-
this.handleMessage(msg);
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
// Notify the cluster primary about file-backed config so it can upgrade its store
|
|
56
|
-
if (process.send && fileBacked) {
|
|
57
|
-
this.trySend({
|
|
58
|
-
__orkify: true,
|
|
59
|
-
type: 'cache:configure',
|
|
60
|
-
config: { ...config, fileBacked: true },
|
|
61
|
-
});
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
/** Configure cache options. Must be called before any other method. Intercepted by the proxy in `cache/index.ts`. */
|
|
66
|
-
configure(_config) {
|
|
67
|
-
throw new Error('orkify/cache: configure() must be called via the cache singleton proxy');
|
|
68
|
-
}
|
|
69
|
-
get(key) {
|
|
70
|
-
return this.store.get(key);
|
|
71
|
-
}
|
|
72
|
-
async getAsync(key) {
|
|
73
|
-
return this.store.getAsync(key);
|
|
74
|
-
}
|
|
75
|
-
set(key, value, opts) {
|
|
76
|
-
if (opts?.ttl !== undefined && opts.ttl <= 0) {
|
|
77
|
-
throw new Error(`cache.set(): ttl must be positive, got ${opts.ttl}`);
|
|
78
|
-
}
|
|
79
|
-
// Validate serializability and size
|
|
80
|
-
const serialized = serialize(value);
|
|
81
|
-
const byteLength = serializedByteLength(serialized);
|
|
82
|
-
if (byteLength > this.maxValueSize) {
|
|
83
|
-
throw new Error(`cache.set(): value for key "${key}" is ${byteLength} bytes, exceeds max ${this.maxValueSize} bytes`);
|
|
84
|
-
}
|
|
85
|
-
const ttl = opts?.ttl ?? this.defaultTtl;
|
|
86
|
-
const expiresAt = ttl ? Date.now() + ttl * 1000 : undefined;
|
|
87
|
-
const tags = opts?.tags;
|
|
88
|
-
this.store.set(key, value, expiresAt, tags, byteLength);
|
|
89
|
-
if (this.clusterMode) {
|
|
90
|
-
this.trySend({ __orkify: true, type: 'cache:set', key, value, ttl, tags });
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
delete(key) {
|
|
94
|
-
this.store.delete(key);
|
|
95
|
-
if (this.clusterMode) {
|
|
96
|
-
this.trySend({ __orkify: true, type: 'cache:delete', key });
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
clear() {
|
|
100
|
-
this.store.clear();
|
|
101
|
-
if (this.clusterMode) {
|
|
102
|
-
this.trySend({ __orkify: true, type: 'cache:clear' });
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
has(key) {
|
|
106
|
-
return this.store.has(key);
|
|
107
|
-
}
|
|
108
|
-
stats() {
|
|
109
|
-
return this.store.stats();
|
|
110
|
-
}
|
|
111
|
-
getTagExpiration(tags) {
|
|
112
|
-
return this.store.getTagExpiration(tags);
|
|
113
|
-
}
|
|
114
|
-
invalidateTag(tag) {
|
|
115
|
-
this.store.invalidateTag(tag);
|
|
116
|
-
if (this.clusterMode) {
|
|
117
|
-
this.trySend({ __orkify: true, type: 'cache:invalidate-tag', tag });
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
updateTagTimestamp(tag, timestamp) {
|
|
121
|
-
const ts = timestamp ?? Date.now();
|
|
122
|
-
this.store.applyTagTimestamp(tag, ts);
|
|
123
|
-
if (this.clusterMode) {
|
|
124
|
-
this.trySend({ __orkify: true, type: 'cache:update-tag-timestamp', tag, tagTimestamp: ts });
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
destroy() {
|
|
128
|
-
if (this.messageHandler) {
|
|
129
|
-
process.removeListener('message', this.messageHandler);
|
|
130
|
-
this.messageHandler = undefined;
|
|
131
|
-
}
|
|
132
|
-
this.store.destroy();
|
|
133
|
-
}
|
|
134
|
-
/** Send an IPC message to the cluster primary, silently ignoring failures (e.g. closed channel). */
|
|
135
|
-
trySend(msg) {
|
|
136
|
-
try {
|
|
137
|
-
process.send?.(msg);
|
|
138
|
-
}
|
|
139
|
-
catch {
|
|
140
|
-
// IPC channel closed — primary died or worker is shutting down
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
handleMessage(msg) {
|
|
144
|
-
const m = msg;
|
|
145
|
-
if (!m?.__orkify || !m.type?.startsWith('cache:'))
|
|
146
|
-
return;
|
|
147
|
-
const message = msg;
|
|
148
|
-
switch (message.type) {
|
|
149
|
-
case 'cache:set':
|
|
150
|
-
this.store.applySet(message.key, message.value, message.expiresAt, message.tags);
|
|
151
|
-
break;
|
|
152
|
-
case 'cache:delete':
|
|
153
|
-
this.store.applyDelete(message.key);
|
|
154
|
-
break;
|
|
155
|
-
case 'cache:clear':
|
|
156
|
-
this.store.clear();
|
|
157
|
-
break;
|
|
158
|
-
case 'cache:invalidate-tag':
|
|
159
|
-
this.store.invalidateTag(message.tag);
|
|
160
|
-
this.store.applyTagTimestamp(message.tag, message.tagTimestamp);
|
|
161
|
-
break;
|
|
162
|
-
case 'cache:update-tag-timestamp':
|
|
163
|
-
this.store.applyTagTimestamp(message.tag, message.tagTimestamp);
|
|
164
|
-
break;
|
|
165
|
-
case 'cache:snapshot':
|
|
166
|
-
this.store.applySnapshot({
|
|
167
|
-
entries: message.entries,
|
|
168
|
-
tagTimestamps: message.tagTimestamps,
|
|
169
|
-
});
|
|
170
|
-
break;
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
//# sourceMappingURL=CacheClient.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"CacheClient.js","sourceRoot":"","sources":["../src/CacheClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
import type { CacheConfig, CacheSnapshot, CacheStats, ICacheStore } from './types.js';
|
|
2
|
-
export declare class CacheFileStore implements ICacheStore {
|
|
3
|
-
private cacheDir;
|
|
4
|
-
private diskIndex;
|
|
5
|
-
private diskSweepTimer;
|
|
6
|
-
private diskTagIndex;
|
|
7
|
-
private entriesDir;
|
|
8
|
-
private indexPath;
|
|
9
|
-
private indexDirty;
|
|
10
|
-
private loadIndexPromise;
|
|
11
|
-
private persistPromise;
|
|
12
|
-
private readOnly;
|
|
13
|
-
private store;
|
|
14
|
-
private tagTimestamps;
|
|
15
|
-
constructor(processName: string, config?: CacheConfig, options?: {
|
|
16
|
-
readOnly?: boolean;
|
|
17
|
-
});
|
|
18
|
-
get<T>(key: string): T | undefined;
|
|
19
|
-
getAsync<T>(key: string): Promise<T | undefined>;
|
|
20
|
-
set(key: string, value: unknown, expiresAt?: number, tags?: string[], precomputedByteSize?: number): void;
|
|
21
|
-
delete(key: string): boolean;
|
|
22
|
-
clear(): void;
|
|
23
|
-
has(key: string): boolean;
|
|
24
|
-
stats(): CacheStats;
|
|
25
|
-
invalidateTag(tag: string): string[];
|
|
26
|
-
getTagExpiration(tags: string[]): number;
|
|
27
|
-
applyTagTimestamp(tag: string, timestamp: number): void;
|
|
28
|
-
applySet(key: string, value: unknown, expiresAt?: number, tags?: string[]): void;
|
|
29
|
-
applyDelete(key: string): void;
|
|
30
|
-
applySnapshot(snapshot: CacheSnapshot): void;
|
|
31
|
-
serialize(): CacheSnapshot;
|
|
32
|
-
destroy(): void;
|
|
33
|
-
/** Flush all in-memory entries to disk (called on graceful shutdown). No-op in readOnly mode. */
|
|
34
|
-
flush(): Promise<void>;
|
|
35
|
-
/** Synchronous flush for use in process 'exit' handlers where async I/O is unavailable. */
|
|
36
|
-
flushSync(): void;
|
|
37
|
-
/** Load disk index on startup (values are loaded lazily on access). No-op in readOnly mode. */
|
|
38
|
-
loadIndex(): Promise<void>;
|
|
39
|
-
private writeToDisk;
|
|
40
|
-
private deleteFromDisk;
|
|
41
|
-
private removeDiskMeta;
|
|
42
|
-
private sweepDisk;
|
|
43
|
-
private persistIndex;
|
|
44
|
-
}
|
|
45
|
-
//# sourceMappingURL=CacheFileStore.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"CacheFileStore.d.ts","sourceRoot":"","sources":["../src/CacheFileStore.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAc,aAAa,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AA4BlG,qBAAa,cAAe,YAAW,WAAW;IAChD,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,SAAS,CAA+B;IAChD,OAAO,CAAC,cAAc,CAA6C;IACnE,OAAO,CAAC,YAAY,CAAkC;IACtD,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,gBAAgB,CAA4B;IACpD,OAAO,CAAC,cAAc,CAA4B;IAClD,OAAO,CAAC,QAAQ,CAAU;IAC1B,OAAO,CAAC,KAAK,CAAa;IAC1B,OAAO,CAAC,aAAa,CAA6B;gBAEtC,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE;IAuCvF,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IAI5B,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IA+DtD,GAAG,CACD,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,OAAO,EACd,SAAS,CAAC,EAAE,MAAM,EAClB,IAAI,CAAC,EAAE,MAAM,EAAE,EACf,mBAAmB,CAAC,EAAE,MAAM,GAC3B,IAAI;IAQP,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAS5B,KAAK,IAAI,IAAI;IAcb,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAWzB,KAAK,IAAI,UAAU;IAKnB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE;IAkBpC,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM;IAaxC,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAKvD,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI;IAOhF,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAO9B,aAAa,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI;IAiB5C,SAAS,IAAI,aAAa;IAI1B,OAAO,IAAI,IAAI;IAaf,iGAAiG;IAC3F,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAmB5B,2FAA2F;IAC3F,SAAS,IAAI,IAAI;IA2CjB,+FAA+F;IACzF,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;YA8ClB,WAAW;YA+CX,cAAc;IAmB5B,OAAO,CAAC,cAAc;YAqBR,SAAS;YAST,YAAY;CA+B3B"}
|