offheap 0.1.0
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/.github/workflows/CI.yml +115 -0
- package/Cargo.toml +35 -0
- package/LICENSE-APACHE +201 -0
- package/LICENSE-MIT +21 -0
- package/README.md +161 -0
- package/artifacts/bindings-aarch64-apple-darwin/index.d.ts +30 -0
- package/artifacts/bindings-aarch64-apple-darwin/index.js +316 -0
- package/artifacts/bindings-x86_64-apple-darwin/index.d.ts +30 -0
- package/artifacts/bindings-x86_64-apple-darwin/index.js +316 -0
- package/artifacts/bindings-x86_64-pc-windows-msvc/index.d.ts +30 -0
- package/artifacts/bindings-x86_64-pc-windows-msvc/index.js +316 -0
- package/artifacts/bindings-x86_64-unknown-linux-gnu/index.d.ts +30 -0
- package/artifacts/bindings-x86_64-unknown-linux-gnu/index.js +316 -0
- package/benches/rust_bench.rs +96 -0
- package/benchmarks/js_bench.js +67 -0
- package/build.rs +3 -0
- package/index.d.ts +30 -0
- package/index.js +316 -0
- package/package.json +35 -0
- package/src/algorithms/arc.rs +355 -0
- package/src/algorithms/lru.rs +212 -0
- package/src/algorithms/mod.rs +42 -0
- package/src/algorithms/tinylfu.rs +499 -0
- package/src/cache.rs +172 -0
- package/src/lib.rs +6 -0
- package/src/manager.rs +50 -0
- package/tests/index.test.js +135 -0
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
use criterion::{criterion_group, criterion_main, Criterion};
|
|
2
|
+
use offheap::algorithms::{
|
|
3
|
+
CacheImpl,
|
|
4
|
+
lru::LruCache,
|
|
5
|
+
arc::ArcCache,
|
|
6
|
+
tinylfu::TinyLfuCache,
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
fn bench_sets(c: &mut Criterion) {
|
|
10
|
+
let mut group = c.benchmark_group("Cache Set");
|
|
11
|
+
let capacity = 10000;
|
|
12
|
+
|
|
13
|
+
group.bench_function("LRU Set", |b| {
|
|
14
|
+
let mut cache = LruCache::new(capacity);
|
|
15
|
+
let mut i = 0;
|
|
16
|
+
b.iter(|| {
|
|
17
|
+
let key = format!("key-{}", i);
|
|
18
|
+
cache.set(&key, vec![1, 2, 3], None);
|
|
19
|
+
i += 1;
|
|
20
|
+
});
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
group.bench_function("ARC Set", |b| {
|
|
24
|
+
let mut cache = ArcCache::new(capacity);
|
|
25
|
+
let mut i = 0;
|
|
26
|
+
b.iter(|| {
|
|
27
|
+
let key = format!("key-{}", i);
|
|
28
|
+
cache.set(&key, vec![1, 2, 3], None);
|
|
29
|
+
i += 1;
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
group.bench_function("W-TinyLFU Set", |b| {
|
|
34
|
+
let mut cache = TinyLfuCache::new(capacity);
|
|
35
|
+
let mut i = 0;
|
|
36
|
+
b.iter(|| {
|
|
37
|
+
let key = format!("key-{}", i);
|
|
38
|
+
cache.set(&key, vec![1, 2, 3], None);
|
|
39
|
+
i += 1;
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
group.finish();
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
fn bench_gets(c: &mut Criterion) {
|
|
47
|
+
let mut group = c.benchmark_group("Cache Get");
|
|
48
|
+
let capacity = 10000;
|
|
49
|
+
|
|
50
|
+
// LRU Warm up
|
|
51
|
+
let mut lru = LruCache::new(capacity);
|
|
52
|
+
for i in 0..capacity {
|
|
53
|
+
lru.set(&format!("key-{}", i), vec![1, 2, 3], None);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
group.bench_function("LRU Get Hit", |b| {
|
|
57
|
+
let mut i = 0;
|
|
58
|
+
b.iter(|| {
|
|
59
|
+
lru.get(&format!("key-{}", i % capacity));
|
|
60
|
+
i += 1;
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
// ARC Warm up
|
|
65
|
+
let mut arc = ArcCache::new(capacity);
|
|
66
|
+
for i in 0..capacity {
|
|
67
|
+
arc.set(&format!("key-{}", i), vec![1, 2, 3], None);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
group.bench_function("ARC Get Hit", |b| {
|
|
71
|
+
let mut i = 0;
|
|
72
|
+
b.iter(|| {
|
|
73
|
+
arc.get(&format!("key-{}", i % capacity));
|
|
74
|
+
i += 1;
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
// TinyLFU Warm up
|
|
79
|
+
let mut tinylfu = TinyLfuCache::new(capacity);
|
|
80
|
+
for i in 0..capacity {
|
|
81
|
+
tinylfu.set(&format!("key-{}", i), vec![1, 2, 3], None);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
group.bench_function("W-TinyLFU Get Hit", |b| {
|
|
85
|
+
let mut i = 0;
|
|
86
|
+
b.iter(|| {
|
|
87
|
+
tinylfu.get(&format!("key-{}", i % capacity));
|
|
88
|
+
i += 1;
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
group.finish();
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
criterion_group!(benches, bench_sets, bench_gets);
|
|
96
|
+
criterion_main!(benches);
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
const { Bench } = require('tinybench');
|
|
2
|
+
const { CacheManager } = require('../index.js');
|
|
3
|
+
|
|
4
|
+
async function runBenchmark() {
|
|
5
|
+
const manager = new CacheManager();
|
|
6
|
+
const capacity = 10000;
|
|
7
|
+
|
|
8
|
+
// Instantiate caches
|
|
9
|
+
const lruCache = manager.createCache('bench-lru', { policy: 'lru', capacity });
|
|
10
|
+
const arcCache = manager.createCache('bench-arc', { policy: 'arc', capacity });
|
|
11
|
+
const tinyLfuCache = manager.createCache('bench-tinylfu', { policy: 'tinylfu', capacity });
|
|
12
|
+
|
|
13
|
+
// Prepare benchmark keys and values
|
|
14
|
+
const keys = Array.from({ length: 20000 }, (_, i) => `key-${i}`);
|
|
15
|
+
const val = { data: 'a'.repeat(100) }; // 100 char string object
|
|
16
|
+
let writeIdx = 0;
|
|
17
|
+
let readIdx = 0;
|
|
18
|
+
|
|
19
|
+
const benchSet = new Bench({ time: 1000 });
|
|
20
|
+
|
|
21
|
+
benchSet
|
|
22
|
+
.add('OffHeap LRU - Set', () => {
|
|
23
|
+
lruCache.set(keys[writeIdx % keys.length], val);
|
|
24
|
+
writeIdx++;
|
|
25
|
+
})
|
|
26
|
+
.add('OffHeap ARC - Set', () => {
|
|
27
|
+
arcCache.set(keys[writeIdx % keys.length], val);
|
|
28
|
+
writeIdx++;
|
|
29
|
+
})
|
|
30
|
+
.add('OffHeap W-TinyLFU - Set', () => {
|
|
31
|
+
tinyLfuCache.set(keys[writeIdx % keys.length], val);
|
|
32
|
+
writeIdx++;
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
console.log('=== Benchmarking SET operations (10k capacity, 20k unique keys) ===');
|
|
36
|
+
await benchSet.run();
|
|
37
|
+
console.table(benchSet.table());
|
|
38
|
+
|
|
39
|
+
// Warm up caches for GET benchmarks
|
|
40
|
+
for (let i = 0; i < capacity; i++) {
|
|
41
|
+
lruCache.set(keys[i], val);
|
|
42
|
+
arcCache.set(keys[i], val);
|
|
43
|
+
tinyLfuCache.set(keys[i], val);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const benchGet = new Bench({ time: 1000 });
|
|
47
|
+
|
|
48
|
+
benchGet
|
|
49
|
+
.add('OffHeap LRU - Get', () => {
|
|
50
|
+
lruCache.get(keys[readIdx % capacity]);
|
|
51
|
+
readIdx++;
|
|
52
|
+
})
|
|
53
|
+
.add('OffHeap ARC - Get', () => {
|
|
54
|
+
arcCache.get(keys[readIdx % capacity]);
|
|
55
|
+
readIdx++;
|
|
56
|
+
})
|
|
57
|
+
.add('OffHeap W-TinyLFU - Get', () => {
|
|
58
|
+
tinyLfuCache.get(keys[readIdx % capacity]);
|
|
59
|
+
readIdx++;
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
console.log('\n=== Benchmarking GET operations (100% Cache Hits) ===');
|
|
63
|
+
await benchGet.run();
|
|
64
|
+
console.table(benchGet.table());
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
runBenchmark().catch(console.error);
|
package/build.rs
ADDED
package/index.d.ts
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/* tslint:disable */
|
|
2
|
+
/* eslint-disable */
|
|
3
|
+
|
|
4
|
+
/* auto-generated by NAPI-RS */
|
|
5
|
+
|
|
6
|
+
export interface CacheConfig {
|
|
7
|
+
policy: string
|
|
8
|
+
capacity: number
|
|
9
|
+
}
|
|
10
|
+
export interface CacheStatsJs {
|
|
11
|
+
hits: number
|
|
12
|
+
misses: number
|
|
13
|
+
capacity: number
|
|
14
|
+
size: number
|
|
15
|
+
}
|
|
16
|
+
export declare class Cache {
|
|
17
|
+
get(key: string): unknown
|
|
18
|
+
set(key: string, value: unknown, ttlMs?: number | undefined | null): unknown
|
|
19
|
+
delete(key: string): boolean
|
|
20
|
+
clear(): void
|
|
21
|
+
stats(): CacheStatsJs
|
|
22
|
+
keys(): Array<string>
|
|
23
|
+
}
|
|
24
|
+
export declare class CacheManager {
|
|
25
|
+
constructor()
|
|
26
|
+
createCache(name: string, config: CacheConfig): Cache
|
|
27
|
+
getCache(name: string): Cache | null
|
|
28
|
+
deleteCache(name: string): boolean
|
|
29
|
+
clear(): void
|
|
30
|
+
}
|
package/index.js
ADDED
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
/* tslint:disable */
|
|
2
|
+
/* eslint-disable */
|
|
3
|
+
/* prettier-ignore */
|
|
4
|
+
|
|
5
|
+
/* auto-generated by NAPI-RS */
|
|
6
|
+
|
|
7
|
+
const { existsSync, readFileSync } = require('fs')
|
|
8
|
+
const { join } = require('path')
|
|
9
|
+
|
|
10
|
+
const { platform, arch } = process
|
|
11
|
+
|
|
12
|
+
let nativeBinding = null
|
|
13
|
+
let localFileExisted = false
|
|
14
|
+
let loadError = null
|
|
15
|
+
|
|
16
|
+
function isMusl() {
|
|
17
|
+
// For Node 10
|
|
18
|
+
if (!process.report || typeof process.report.getReport !== 'function') {
|
|
19
|
+
try {
|
|
20
|
+
const lddPath = require('child_process').execSync('which ldd').toString().trim()
|
|
21
|
+
return readFileSync(lddPath, 'utf8').includes('musl')
|
|
22
|
+
} catch (e) {
|
|
23
|
+
return true
|
|
24
|
+
}
|
|
25
|
+
} else {
|
|
26
|
+
const { glibcVersionRuntime } = process.report.getReport().header
|
|
27
|
+
return !glibcVersionRuntime
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
switch (platform) {
|
|
32
|
+
case 'android':
|
|
33
|
+
switch (arch) {
|
|
34
|
+
case 'arm64':
|
|
35
|
+
localFileExisted = existsSync(join(__dirname, 'offheap.android-arm64.node'))
|
|
36
|
+
try {
|
|
37
|
+
if (localFileExisted) {
|
|
38
|
+
nativeBinding = require('./offheap.android-arm64.node')
|
|
39
|
+
} else {
|
|
40
|
+
nativeBinding = require('offheap-android-arm64')
|
|
41
|
+
}
|
|
42
|
+
} catch (e) {
|
|
43
|
+
loadError = e
|
|
44
|
+
}
|
|
45
|
+
break
|
|
46
|
+
case 'arm':
|
|
47
|
+
localFileExisted = existsSync(join(__dirname, 'offheap.android-arm-eabi.node'))
|
|
48
|
+
try {
|
|
49
|
+
if (localFileExisted) {
|
|
50
|
+
nativeBinding = require('./offheap.android-arm-eabi.node')
|
|
51
|
+
} else {
|
|
52
|
+
nativeBinding = require('offheap-android-arm-eabi')
|
|
53
|
+
}
|
|
54
|
+
} catch (e) {
|
|
55
|
+
loadError = e
|
|
56
|
+
}
|
|
57
|
+
break
|
|
58
|
+
default:
|
|
59
|
+
throw new Error(`Unsupported architecture on Android ${arch}`)
|
|
60
|
+
}
|
|
61
|
+
break
|
|
62
|
+
case 'win32':
|
|
63
|
+
switch (arch) {
|
|
64
|
+
case 'x64':
|
|
65
|
+
localFileExisted = existsSync(
|
|
66
|
+
join(__dirname, 'offheap.win32-x64-msvc.node')
|
|
67
|
+
)
|
|
68
|
+
try {
|
|
69
|
+
if (localFileExisted) {
|
|
70
|
+
nativeBinding = require('./offheap.win32-x64-msvc.node')
|
|
71
|
+
} else {
|
|
72
|
+
nativeBinding = require('offheap-win32-x64-msvc')
|
|
73
|
+
}
|
|
74
|
+
} catch (e) {
|
|
75
|
+
loadError = e
|
|
76
|
+
}
|
|
77
|
+
break
|
|
78
|
+
case 'ia32':
|
|
79
|
+
localFileExisted = existsSync(
|
|
80
|
+
join(__dirname, 'offheap.win32-ia32-msvc.node')
|
|
81
|
+
)
|
|
82
|
+
try {
|
|
83
|
+
if (localFileExisted) {
|
|
84
|
+
nativeBinding = require('./offheap.win32-ia32-msvc.node')
|
|
85
|
+
} else {
|
|
86
|
+
nativeBinding = require('offheap-win32-ia32-msvc')
|
|
87
|
+
}
|
|
88
|
+
} catch (e) {
|
|
89
|
+
loadError = e
|
|
90
|
+
}
|
|
91
|
+
break
|
|
92
|
+
case 'arm64':
|
|
93
|
+
localFileExisted = existsSync(
|
|
94
|
+
join(__dirname, 'offheap.win32-arm64-msvc.node')
|
|
95
|
+
)
|
|
96
|
+
try {
|
|
97
|
+
if (localFileExisted) {
|
|
98
|
+
nativeBinding = require('./offheap.win32-arm64-msvc.node')
|
|
99
|
+
} else {
|
|
100
|
+
nativeBinding = require('offheap-win32-arm64-msvc')
|
|
101
|
+
}
|
|
102
|
+
} catch (e) {
|
|
103
|
+
loadError = e
|
|
104
|
+
}
|
|
105
|
+
break
|
|
106
|
+
default:
|
|
107
|
+
throw new Error(`Unsupported architecture on Windows: ${arch}`)
|
|
108
|
+
}
|
|
109
|
+
break
|
|
110
|
+
case 'darwin':
|
|
111
|
+
localFileExisted = existsSync(join(__dirname, 'offheap.darwin-universal.node'))
|
|
112
|
+
try {
|
|
113
|
+
if (localFileExisted) {
|
|
114
|
+
nativeBinding = require('./offheap.darwin-universal.node')
|
|
115
|
+
} else {
|
|
116
|
+
nativeBinding = require('offheap-darwin-universal')
|
|
117
|
+
}
|
|
118
|
+
break
|
|
119
|
+
} catch {}
|
|
120
|
+
switch (arch) {
|
|
121
|
+
case 'x64':
|
|
122
|
+
localFileExisted = existsSync(join(__dirname, 'offheap.darwin-x64.node'))
|
|
123
|
+
try {
|
|
124
|
+
if (localFileExisted) {
|
|
125
|
+
nativeBinding = require('./offheap.darwin-x64.node')
|
|
126
|
+
} else {
|
|
127
|
+
nativeBinding = require('offheap-darwin-x64')
|
|
128
|
+
}
|
|
129
|
+
} catch (e) {
|
|
130
|
+
loadError = e
|
|
131
|
+
}
|
|
132
|
+
break
|
|
133
|
+
case 'arm64':
|
|
134
|
+
localFileExisted = existsSync(
|
|
135
|
+
join(__dirname, 'offheap.darwin-arm64.node')
|
|
136
|
+
)
|
|
137
|
+
try {
|
|
138
|
+
if (localFileExisted) {
|
|
139
|
+
nativeBinding = require('./offheap.darwin-arm64.node')
|
|
140
|
+
} else {
|
|
141
|
+
nativeBinding = require('offheap-darwin-arm64')
|
|
142
|
+
}
|
|
143
|
+
} catch (e) {
|
|
144
|
+
loadError = e
|
|
145
|
+
}
|
|
146
|
+
break
|
|
147
|
+
default:
|
|
148
|
+
throw new Error(`Unsupported architecture on macOS: ${arch}`)
|
|
149
|
+
}
|
|
150
|
+
break
|
|
151
|
+
case 'freebsd':
|
|
152
|
+
if (arch !== 'x64') {
|
|
153
|
+
throw new Error(`Unsupported architecture on FreeBSD: ${arch}`)
|
|
154
|
+
}
|
|
155
|
+
localFileExisted = existsSync(join(__dirname, 'offheap.freebsd-x64.node'))
|
|
156
|
+
try {
|
|
157
|
+
if (localFileExisted) {
|
|
158
|
+
nativeBinding = require('./offheap.freebsd-x64.node')
|
|
159
|
+
} else {
|
|
160
|
+
nativeBinding = require('offheap-freebsd-x64')
|
|
161
|
+
}
|
|
162
|
+
} catch (e) {
|
|
163
|
+
loadError = e
|
|
164
|
+
}
|
|
165
|
+
break
|
|
166
|
+
case 'linux':
|
|
167
|
+
switch (arch) {
|
|
168
|
+
case 'x64':
|
|
169
|
+
if (isMusl()) {
|
|
170
|
+
localFileExisted = existsSync(
|
|
171
|
+
join(__dirname, 'offheap.linux-x64-musl.node')
|
|
172
|
+
)
|
|
173
|
+
try {
|
|
174
|
+
if (localFileExisted) {
|
|
175
|
+
nativeBinding = require('./offheap.linux-x64-musl.node')
|
|
176
|
+
} else {
|
|
177
|
+
nativeBinding = require('offheap-linux-x64-musl')
|
|
178
|
+
}
|
|
179
|
+
} catch (e) {
|
|
180
|
+
loadError = e
|
|
181
|
+
}
|
|
182
|
+
} else {
|
|
183
|
+
localFileExisted = existsSync(
|
|
184
|
+
join(__dirname, 'offheap.linux-x64-gnu.node')
|
|
185
|
+
)
|
|
186
|
+
try {
|
|
187
|
+
if (localFileExisted) {
|
|
188
|
+
nativeBinding = require('./offheap.linux-x64-gnu.node')
|
|
189
|
+
} else {
|
|
190
|
+
nativeBinding = require('offheap-linux-x64-gnu')
|
|
191
|
+
}
|
|
192
|
+
} catch (e) {
|
|
193
|
+
loadError = e
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
break
|
|
197
|
+
case 'arm64':
|
|
198
|
+
if (isMusl()) {
|
|
199
|
+
localFileExisted = existsSync(
|
|
200
|
+
join(__dirname, 'offheap.linux-arm64-musl.node')
|
|
201
|
+
)
|
|
202
|
+
try {
|
|
203
|
+
if (localFileExisted) {
|
|
204
|
+
nativeBinding = require('./offheap.linux-arm64-musl.node')
|
|
205
|
+
} else {
|
|
206
|
+
nativeBinding = require('offheap-linux-arm64-musl')
|
|
207
|
+
}
|
|
208
|
+
} catch (e) {
|
|
209
|
+
loadError = e
|
|
210
|
+
}
|
|
211
|
+
} else {
|
|
212
|
+
localFileExisted = existsSync(
|
|
213
|
+
join(__dirname, 'offheap.linux-arm64-gnu.node')
|
|
214
|
+
)
|
|
215
|
+
try {
|
|
216
|
+
if (localFileExisted) {
|
|
217
|
+
nativeBinding = require('./offheap.linux-arm64-gnu.node')
|
|
218
|
+
} else {
|
|
219
|
+
nativeBinding = require('offheap-linux-arm64-gnu')
|
|
220
|
+
}
|
|
221
|
+
} catch (e) {
|
|
222
|
+
loadError = e
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
break
|
|
226
|
+
case 'arm':
|
|
227
|
+
if (isMusl()) {
|
|
228
|
+
localFileExisted = existsSync(
|
|
229
|
+
join(__dirname, 'offheap.linux-arm-musleabihf.node')
|
|
230
|
+
)
|
|
231
|
+
try {
|
|
232
|
+
if (localFileExisted) {
|
|
233
|
+
nativeBinding = require('./offheap.linux-arm-musleabihf.node')
|
|
234
|
+
} else {
|
|
235
|
+
nativeBinding = require('offheap-linux-arm-musleabihf')
|
|
236
|
+
}
|
|
237
|
+
} catch (e) {
|
|
238
|
+
loadError = e
|
|
239
|
+
}
|
|
240
|
+
} else {
|
|
241
|
+
localFileExisted = existsSync(
|
|
242
|
+
join(__dirname, 'offheap.linux-arm-gnueabihf.node')
|
|
243
|
+
)
|
|
244
|
+
try {
|
|
245
|
+
if (localFileExisted) {
|
|
246
|
+
nativeBinding = require('./offheap.linux-arm-gnueabihf.node')
|
|
247
|
+
} else {
|
|
248
|
+
nativeBinding = require('offheap-linux-arm-gnueabihf')
|
|
249
|
+
}
|
|
250
|
+
} catch (e) {
|
|
251
|
+
loadError = e
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
break
|
|
255
|
+
case 'riscv64':
|
|
256
|
+
if (isMusl()) {
|
|
257
|
+
localFileExisted = existsSync(
|
|
258
|
+
join(__dirname, 'offheap.linux-riscv64-musl.node')
|
|
259
|
+
)
|
|
260
|
+
try {
|
|
261
|
+
if (localFileExisted) {
|
|
262
|
+
nativeBinding = require('./offheap.linux-riscv64-musl.node')
|
|
263
|
+
} else {
|
|
264
|
+
nativeBinding = require('offheap-linux-riscv64-musl')
|
|
265
|
+
}
|
|
266
|
+
} catch (e) {
|
|
267
|
+
loadError = e
|
|
268
|
+
}
|
|
269
|
+
} else {
|
|
270
|
+
localFileExisted = existsSync(
|
|
271
|
+
join(__dirname, 'offheap.linux-riscv64-gnu.node')
|
|
272
|
+
)
|
|
273
|
+
try {
|
|
274
|
+
if (localFileExisted) {
|
|
275
|
+
nativeBinding = require('./offheap.linux-riscv64-gnu.node')
|
|
276
|
+
} else {
|
|
277
|
+
nativeBinding = require('offheap-linux-riscv64-gnu')
|
|
278
|
+
}
|
|
279
|
+
} catch (e) {
|
|
280
|
+
loadError = e
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
break
|
|
284
|
+
case 's390x':
|
|
285
|
+
localFileExisted = existsSync(
|
|
286
|
+
join(__dirname, 'offheap.linux-s390x-gnu.node')
|
|
287
|
+
)
|
|
288
|
+
try {
|
|
289
|
+
if (localFileExisted) {
|
|
290
|
+
nativeBinding = require('./offheap.linux-s390x-gnu.node')
|
|
291
|
+
} else {
|
|
292
|
+
nativeBinding = require('offheap-linux-s390x-gnu')
|
|
293
|
+
}
|
|
294
|
+
} catch (e) {
|
|
295
|
+
loadError = e
|
|
296
|
+
}
|
|
297
|
+
break
|
|
298
|
+
default:
|
|
299
|
+
throw new Error(`Unsupported architecture on Linux: ${arch}`)
|
|
300
|
+
}
|
|
301
|
+
break
|
|
302
|
+
default:
|
|
303
|
+
throw new Error(`Unsupported OS: ${platform}, architecture: ${arch}`)
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
if (!nativeBinding) {
|
|
307
|
+
if (loadError) {
|
|
308
|
+
throw loadError
|
|
309
|
+
}
|
|
310
|
+
throw new Error(`Failed to load native binding`)
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
const { Cache, CacheManager } = nativeBinding
|
|
314
|
+
|
|
315
|
+
module.exports.Cache = Cache
|
|
316
|
+
module.exports.CacheManager = CacheManager
|
package/package.json
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "offheap",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "High-performance off-heap caching framework for Node.js written in Rust",
|
|
5
|
+
"main": "index.js",
|
|
6
|
+
"types": "index.d.ts",
|
|
7
|
+
"napi": {
|
|
8
|
+
"name": "offheap",
|
|
9
|
+
"triple": {
|
|
10
|
+
"defaults": true,
|
|
11
|
+
"additional": []
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"scripts": {
|
|
15
|
+
"artifacts": "napi artifacts",
|
|
16
|
+
"build": "napi build --platform --release",
|
|
17
|
+
"build:debug": "napi build --platform",
|
|
18
|
+
"prepublishOnly": "napi prepublish -t npm --skip-gh-release",
|
|
19
|
+
"test": "node --test tests/index.test.js",
|
|
20
|
+
"benchmark": "node benchmarks/js_bench.js"
|
|
21
|
+
},
|
|
22
|
+
"devDependencies": {
|
|
23
|
+
"@napi-rs/cli": "^2.18.4",
|
|
24
|
+
"tinybench": "^2.9.0"
|
|
25
|
+
},
|
|
26
|
+
"engines": {
|
|
27
|
+
"node": ">= 18"
|
|
28
|
+
},
|
|
29
|
+
"license": "MIT OR Apache-2.0",
|
|
30
|
+
"optionalDependencies": {
|
|
31
|
+
"offheap-win32-x64-msvc": "0.1.0",
|
|
32
|
+
"offheap-darwin-x64": "0.1.0",
|
|
33
|
+
"offheap-linux-x64-gnu": "0.1.0"
|
|
34
|
+
}
|
|
35
|
+
}
|