crudjt 1.0.0-beta.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/FUNDING.yml +15 -0
- package/.github/workflows/build.yml +42 -0
- package/CHANGELOG.md +12 -0
- package/Cache.js +82 -0
- package/Cargo.lock +176 -0
- package/Cargo.toml +16 -0
- package/LICENSE.txt +21 -0
- package/README.md +215 -0
- package/cargo.log +30 -0
- package/crudjt-1.0.0-beta.0.tgz +0 -0
- package/errors/internal_error.js +12 -0
- package/errors/invalid_state.js +12 -0
- package/errors.js +13 -0
- package/index.js +440 -0
- package/index.node +0 -0
- package/logos/buy_me_a_coffee_orange.svg +1 -0
- package/logos/crud_jt_logo.png +0 -0
- package/logos/crud_jt_logo_black.png +0 -0
- package/logos/crud_jt_logo_favicon_black.png +0 -0
- package/logos/crud_jt_logo_favicon_black_160.png +0 -0
- package/logos/crud_jt_logo_favicon_white.png +0 -0
- package/logos/crud_jt_logo_favicon_white_160.png +0 -0
- package/logos/crudjt_favicon_160x160_dark_on_white.svg +18 -0
- package/logos/crudjt_favicon_160x160_white.png +0 -0
- package/logos/crudjt_favicon_160x160_white_on_dark.svg +18 -0
- package/logos/crudjt_favicon_white_on_dark.png +0 -0
- package/logos/crudjt_logo_dark.png +0 -0
- package/logos/crudjt_logo_dark_on_white.svg +19 -0
- package/logos/crudjt_logo_white_on_dark.svg +26 -0
- package/native/linux/store_jt_arm64.so +0 -0
- package/native/linux/store_jt_x86_64.so +0 -0
- package/native/macos/store_jt_arm64.dylib +0 -0
- package/native/macos/store_jt_x86_64.dylib +0 -0
- package/native/windows/store_jt_arm64.dll +0 -0
- package/native/windows/store_jt_x86_64.dll +0 -0
- package/package/.github/workflows/build.yml +43 -0
- package/package/Cache.js +78 -0
- package/package/Cargo.lock +217 -0
- package/package/Cargo.toml +16 -0
- package/package/README.md +90 -0
- package/package/Validation.js +26 -0
- package/package/cargo.log +24 -0
- package/package/index.js +197 -0
- package/package/index.node +0 -0
- package/package/native/linux/store_jt_arm64.so +0 -0
- package/package/native/linux/store_jt_x86_64.so +0 -0
- package/package/native/macos/store_jt_arm64.dylib +0 -0
- package/package/native/macos/store_jt_x86_64.dylib +0 -0
- package/package/native/windows/store_jt_arm64.dll +0 -0
- package/package/native/windows/store_jt_x86_64.dll +0 -0
- package/package/package.json +26 -0
- package/package/src/lib.rs +190 -0
- package/package/test-neon-package/package-lock.json +942 -0
- package/package/test-neon-package/package.json +15 -0
- package/package/test-neon-package/test.js +178 -0
- package/package/test.js +202 -0
- package/package.json +41 -0
- package/src/lib.rs +288 -0
- package/test-neon-package/package-lock.json +1135 -0
- package/test-neon-package/package.json +15 -0
- package/test-neon-package/test.js +198 -0
- package/token_service.proto +47 -0
- package/token_service_client.js +33 -0
- package/validation.js +72 -0
package/package/index.js
ADDED
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
module.exports = require('./index.node');
|
|
2
|
+
|
|
3
|
+
const fs = require('fs');
|
|
4
|
+
// const path = require('path');
|
|
5
|
+
const { promisify } = require('util');
|
|
6
|
+
const sleep = promisify(setTimeout);
|
|
7
|
+
|
|
8
|
+
const os = require('os');
|
|
9
|
+
const path = require('path');
|
|
10
|
+
|
|
11
|
+
// Визначаємо ОС та архітектуру
|
|
12
|
+
const platform = os.platform(); // 'darwin', 'linux', 'win32'
|
|
13
|
+
const arch = os.arch(); // 'x64', 'arm64', 'ia32', тощо
|
|
14
|
+
|
|
15
|
+
function copyFileWithCheck(srcPath, destPath) {
|
|
16
|
+
try {
|
|
17
|
+
// Перевіряємо існування файлу джерела
|
|
18
|
+
if (!fs.existsSync(srcPath)) {
|
|
19
|
+
console.log(`Файл не знайдено: ${srcPath}`);
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// Отримуємо назву файлу та шлях до файлу призначення
|
|
24
|
+
const fileName = path.basename(srcPath);
|
|
25
|
+
const destFilePath = path.join(destPath, fileName);
|
|
26
|
+
|
|
27
|
+
// Перевіряємо існування файлу призначення
|
|
28
|
+
if (fs.existsSync(destFilePath)) {
|
|
29
|
+
// Отримуємо інформацію про файли
|
|
30
|
+
const srcStats = fs.statSync(srcPath);
|
|
31
|
+
const destStats = fs.statSync(destFilePath);
|
|
32
|
+
|
|
33
|
+
// Якщо назва і розмір збігаються, виходимо з функції
|
|
34
|
+
if (srcStats.size === destStats.size) {
|
|
35
|
+
console.log(`Файл вже існує з такою ж назвою та розміром: ${destFilePath}`);
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// Копіюємо файл
|
|
41
|
+
if (!fs.existsSync(destPath)) {
|
|
42
|
+
fs.copyFileSync(sourcePath, targetPath);
|
|
43
|
+
console.log(`Файл успішно скопійовано в: ${destFilePath}`);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
} catch (error) {
|
|
47
|
+
console.error(`Помилка: ${error.message}`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
///
|
|
52
|
+
// Визначаємо sourcePath
|
|
53
|
+
function getSourcePath() {
|
|
54
|
+
let archDir;
|
|
55
|
+
let platformDir;
|
|
56
|
+
|
|
57
|
+
// Визначаємо архітектуру
|
|
58
|
+
switch (arch) {
|
|
59
|
+
case 'x64':
|
|
60
|
+
archDir = 'x86_64';
|
|
61
|
+
break;
|
|
62
|
+
case 'arm64':
|
|
63
|
+
archDir = 'arm64';
|
|
64
|
+
break;
|
|
65
|
+
default:
|
|
66
|
+
throw new Error(`Unsupported architecture: ${arch}`);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// Визначаємо директорію для платформи
|
|
70
|
+
switch (platform) {
|
|
71
|
+
case 'darwin':
|
|
72
|
+
platformDir = 'macos';
|
|
73
|
+
break;
|
|
74
|
+
case 'linux':
|
|
75
|
+
platformDir = 'linux';
|
|
76
|
+
break;
|
|
77
|
+
case 'win32':
|
|
78
|
+
platformDir = 'windows';
|
|
79
|
+
break;
|
|
80
|
+
default:
|
|
81
|
+
throw new Error(`Unsupported platform: ${platform}`);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// Формуємо шлях до бібліотеки
|
|
85
|
+
return path.join(__dirname, 'native', platformDir, archDir, 'libstore_jt.dylib');
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// Визначаємо targetPath
|
|
89
|
+
function getTargetPath() {
|
|
90
|
+
let systemLibDir;
|
|
91
|
+
let libName;
|
|
92
|
+
|
|
93
|
+
switch (platform) {
|
|
94
|
+
case 'darwin':
|
|
95
|
+
systemLibDir = '/usr/local/lib';
|
|
96
|
+
libName = 'libstore_jt.dylib';
|
|
97
|
+
break;
|
|
98
|
+
case 'linux':
|
|
99
|
+
systemLibDir = '/usr/lib';
|
|
100
|
+
libName = 'libstore_jt.so';
|
|
101
|
+
break;
|
|
102
|
+
case 'win32':
|
|
103
|
+
systemLibDir = 'C:\\Windows\\System32';
|
|
104
|
+
libName = 'libstore_jt.dll';
|
|
105
|
+
break;
|
|
106
|
+
default:
|
|
107
|
+
throw new Error(`Unsupported platform: ${platform}`);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
return path.join(systemLibDir, libName);
|
|
111
|
+
}
|
|
112
|
+
///
|
|
113
|
+
|
|
114
|
+
// const sourcePath = getSourcePath();
|
|
115
|
+
// const targetPath = getTargetPath();
|
|
116
|
+
//
|
|
117
|
+
// copyFileWithCheck(sourcePath, targetPath);
|
|
118
|
+
|
|
119
|
+
const native = require('.'); // Require the compiled native module
|
|
120
|
+
const msgpack = require('msgpack-lite');
|
|
121
|
+
const { Buffer } = require('buffer');
|
|
122
|
+
const LRUCache = require('./Cache');
|
|
123
|
+
const Validation = require('./Validation');
|
|
124
|
+
|
|
125
|
+
const lruCache = new LRUCache((value) => native.read(value));
|
|
126
|
+
|
|
127
|
+
function create(hash, ttl = -1, silence_read = -1) {
|
|
128
|
+
Validation.validateInsertion(hash, ttl, silence_read);
|
|
129
|
+
|
|
130
|
+
// Serialize hash into the format Msgpack
|
|
131
|
+
const packedData = msgpack.encode(hash);
|
|
132
|
+
|
|
133
|
+
// Call native function create, passing it a pointer and the size of the data
|
|
134
|
+
let token = native.create(packedData, packedData.length, ttl, silence_read);
|
|
135
|
+
lruCache.insert(token, hash, ttl, silence_read);
|
|
136
|
+
|
|
137
|
+
return token;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
function read(token) {
|
|
141
|
+
Validation.validateToken(token);
|
|
142
|
+
|
|
143
|
+
let output = lruCache.get(token);
|
|
144
|
+
if (output) {
|
|
145
|
+
return output
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
let result_str = native.read(token);
|
|
149
|
+
if (result_str === "") {
|
|
150
|
+
return null;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
let result = JSON.parse(result_str);
|
|
154
|
+
lruCache.forceInsert(token, result);
|
|
155
|
+
|
|
156
|
+
return result;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
function update(token, hash, ttl = -1, silence_read = -1) {
|
|
160
|
+
Validation.validateToken(token);
|
|
161
|
+
Validation.validateInsertion(hash, ttl, silence_read);
|
|
162
|
+
|
|
163
|
+
// Serialize hash into the format Msgpack
|
|
164
|
+
const packedData = msgpack.encode(hash);
|
|
165
|
+
|
|
166
|
+
// Call native function update, passing it a pointer and the size of the data
|
|
167
|
+
let result = native.update(token, packedData, packedData.length, ttl, silence_read);
|
|
168
|
+
if (result) {
|
|
169
|
+
lruCache.insert(token, hash, ttl, silence_read)
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
return result;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
function __delete(token) {
|
|
176
|
+
Validation.validateToken(token);
|
|
177
|
+
|
|
178
|
+
lruCache.delete(token);
|
|
179
|
+
|
|
180
|
+
return native.delete(token);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// native.encrypted_key("414243");
|
|
184
|
+
// let token = create({qwe: 124});
|
|
185
|
+
// read(token);
|
|
186
|
+
// update(token, {sadsad: 324});
|
|
187
|
+
// __delete(token);
|
|
188
|
+
|
|
189
|
+
const CRUD_JT = {
|
|
190
|
+
create,
|
|
191
|
+
read,
|
|
192
|
+
update,
|
|
193
|
+
delete: __delete,
|
|
194
|
+
encrypted_key: native.encrypted_key
|
|
195
|
+
};
|
|
196
|
+
|
|
197
|
+
module.exports = CRUD_JT;
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "crud_jt",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "",
|
|
5
|
+
"main": "index.js",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"test": "cargo test",
|
|
8
|
+
"cargo-build": "cargo build --message-format=json-render-diagnostics > cargo.log",
|
|
9
|
+
"cross-build": "cross build --message-format=json-render-diagnostics > cross.log",
|
|
10
|
+
"postcargo-build": "neon dist < cargo.log",
|
|
11
|
+
"postcross-build": "neon dist -m /target < cross.log",
|
|
12
|
+
"debug": "npm run cargo-build --",
|
|
13
|
+
"build": "npm run cargo-build -- --release",
|
|
14
|
+
"cross": "npm run cross-build -- --release"
|
|
15
|
+
},
|
|
16
|
+
"author": "",
|
|
17
|
+
"license": "MIT",
|
|
18
|
+
"devDependencies": {
|
|
19
|
+
"@neon-rs/cli": "0.1.73"
|
|
20
|
+
},
|
|
21
|
+
"dependencies": {
|
|
22
|
+
"lru-cache": "^11.0.1",
|
|
23
|
+
"msgpack-lite": "^0.1.26",
|
|
24
|
+
"neon-cli": "^0.10.1"
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
use std::ffi::CString;
|
|
2
|
+
use core::ffi::CStr;
|
|
3
|
+
use std::os::raw::{c_char, c_int};
|
|
4
|
+
use neon::prelude::*;
|
|
5
|
+
use neon::types::buffer::TypedArray;
|
|
6
|
+
use std::ptr;
|
|
7
|
+
|
|
8
|
+
///
|
|
9
|
+
use libloading::{Library, Symbol};
|
|
10
|
+
use std::sync::{Mutex, Once};
|
|
11
|
+
use lazy_static::lazy_static;
|
|
12
|
+
use std::sync::Arc;
|
|
13
|
+
|
|
14
|
+
use std::path::{Path, PathBuf};
|
|
15
|
+
|
|
16
|
+
fn get_library_path() -> PathBuf {
|
|
17
|
+
let project_root = Path::new(env!("CARGO_MANIFEST_DIR"));
|
|
18
|
+
|
|
19
|
+
let library_subpath = {
|
|
20
|
+
#[cfg(target_os = "linux")]
|
|
21
|
+
{
|
|
22
|
+
if cfg!(target_arch = "x86_64") {
|
|
23
|
+
"native/linux/store_jt_x86_64.so"
|
|
24
|
+
} else if cfg!(target_arch = "aarch64") {
|
|
25
|
+
"native/linux/store_jt_arm64.so"
|
|
26
|
+
} else {
|
|
27
|
+
panic!("Unsupported architecture for Linux");
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
#[cfg(target_os = "macos")]
|
|
32
|
+
{
|
|
33
|
+
if cfg!(target_arch = "x86_64") {
|
|
34
|
+
"native/macos/store_jt_x86_64.dylib"
|
|
35
|
+
} else if cfg!(target_arch = "aarch64") {
|
|
36
|
+
"native/macos/store_jt_arm64.dylib"
|
|
37
|
+
} else {
|
|
38
|
+
panic!("Unsupported architecture for macOS");
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
#[cfg(target_os = "windows")]
|
|
43
|
+
{
|
|
44
|
+
if cfg!(target_arch = "x86_64") {
|
|
45
|
+
"native/windows/store_jt_x86_64.dll"
|
|
46
|
+
} else if cfg!(target_arch = "aarch64") {
|
|
47
|
+
"native/windows/store_jt_arm64.dll"
|
|
48
|
+
} else {
|
|
49
|
+
panic!("Unsupported architecture for Windows");
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
#[cfg(not(any(target_os = "linux", target_os = "macos", target_os = "windows")))]
|
|
54
|
+
{
|
|
55
|
+
panic!("Unsupported OS");
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
project_root.join(library_subpath)
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
lazy_static! {
|
|
63
|
+
pub static ref LIB: Library = {
|
|
64
|
+
unsafe { Library::new(get_library_path()).expect("Failed to load library") }
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
fn _encrypted_key(key: *const c_char) -> Result<u32, Box<dyn std::error::Error>> {
|
|
69
|
+
unsafe {
|
|
70
|
+
let func: libloading::Symbol<unsafe extern fn(*const c_char) -> u32> = LIB.get(b"encrypted_key")?;
|
|
71
|
+
Ok(func(key))
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
fn _create(data: *const u8, len: usize, ttl: i64, silence_read: i32) -> Result<*const c_char, Box<dyn std::error::Error>> {
|
|
76
|
+
unsafe {
|
|
77
|
+
let func: libloading::Symbol<unsafe extern fn(*const u8, usize, i64, i32) -> *const c_char> = LIB.get(b"__create")?;
|
|
78
|
+
Ok(func(data, len, ttl, silence_read))
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
fn _read(token: *const c_char) -> Result<*const c_char, Box<dyn std::error::Error>> {
|
|
83
|
+
unsafe {
|
|
84
|
+
let func: libloading::Symbol<unsafe extern fn(*const c_char) -> *const c_char> = LIB.get(b"__read")?;
|
|
85
|
+
Ok(func(token))
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
fn _update(token: *const c_char, data: *const u8, len: usize, ttl: i64, silence_read: i32) -> Result<*const c_int, Box<dyn std::error::Error>> {
|
|
90
|
+
unsafe {
|
|
91
|
+
let func: libloading::Symbol<unsafe extern fn(*const c_char, *const u8, usize, i64, i32) -> *const c_int> = LIB.get(b"__update")?;
|
|
92
|
+
Ok(func(token, data, len, ttl, silence_read))
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
fn _delete(token: *const c_char) -> Result<*const c_int, Box<dyn std::error::Error>> {
|
|
97
|
+
unsafe {
|
|
98
|
+
let func: libloading::Symbol<unsafe extern fn(*const c_char) -> *const c_int> = LIB.get(b"__delete")?;
|
|
99
|
+
Ok(func(token))
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
104
|
+
|
|
105
|
+
fn call_encrypted_key(mut cx: FunctionContext) -> JsResult<JsUndefined> {
|
|
106
|
+
let key = cx.argument::<JsString>(0)?.value(&mut cx);
|
|
107
|
+
let c_key = CString::new(key).expect("Failed to create CString");
|
|
108
|
+
|
|
109
|
+
_encrypted_key(c_key.as_ptr()).unwrap();
|
|
110
|
+
Ok(cx.undefined())
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
fn call_create(mut cx: FunctionContext) -> JsResult<JsString> {
|
|
114
|
+
let js_buffer = cx.argument::<JsBuffer>(0)?;
|
|
115
|
+
let data_size = cx.argument::<JsNumber>(1)?;
|
|
116
|
+
let data_usize = data_size.value(&mut cx) as usize;
|
|
117
|
+
|
|
118
|
+
let ttl = cx.argument::<JsNumber>(2)?;
|
|
119
|
+
let silence_read = cx.argument::<JsNumber>(3)?;
|
|
120
|
+
|
|
121
|
+
let ttl_int = ttl.value(&mut cx) as i64;
|
|
122
|
+
let silence_read_int = silence_read.value(&mut cx) as i32;
|
|
123
|
+
|
|
124
|
+
let data = js_buffer.as_slice(&cx);
|
|
125
|
+
let data_ptr: *const u8 = data.as_ptr();
|
|
126
|
+
|
|
127
|
+
let result_ptr = _create(data_ptr, data_usize, ttl_int, silence_read_int).unwrap();
|
|
128
|
+
|
|
129
|
+
unsafe {
|
|
130
|
+
let result_str = CStr::from_ptr(result_ptr).to_string_lossy().into_owned();
|
|
131
|
+
|
|
132
|
+
Ok(cx.string(result_str))
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
fn call_read(mut cx: FunctionContext) -> JsResult<JsString> {
|
|
137
|
+
let token = cx.argument::<JsString>(0)?.value(&mut cx);
|
|
138
|
+
let c_token = CString::new(token).expect("Failed to create CString");
|
|
139
|
+
|
|
140
|
+
unsafe {
|
|
141
|
+
let result = _read(c_token.as_ptr()).unwrap();
|
|
142
|
+
let result_str = CStr::from_ptr(result).to_string_lossy().into_owned();
|
|
143
|
+
|
|
144
|
+
Ok(cx.string(result_str))
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
fn call_update(mut cx: FunctionContext) -> JsResult<JsBoolean> {
|
|
149
|
+
let token = cx.argument::<JsString>(0)?.value(&mut cx);
|
|
150
|
+
let c_token = CString::new(token).expect("Failed to create CString");
|
|
151
|
+
|
|
152
|
+
let js_buffer = cx.argument::<JsBuffer>(1)?;
|
|
153
|
+
let data_size = cx.argument::<JsNumber>(2)?;
|
|
154
|
+
let data_usize = data_size.value(&mut cx) as usize;
|
|
155
|
+
|
|
156
|
+
let ttl = cx.argument::<JsNumber>(3)?;
|
|
157
|
+
let silence_read = cx.argument::<JsNumber>(4)?;
|
|
158
|
+
|
|
159
|
+
let ttl_int = ttl.value(&mut cx) as i64;
|
|
160
|
+
let silence_read_int = silence_read.value(&mut cx) as i32;
|
|
161
|
+
|
|
162
|
+
let data = js_buffer.as_slice(&cx);
|
|
163
|
+
let data_ptr: *const u8 = data.as_ptr();
|
|
164
|
+
|
|
165
|
+
let output: *const c_int = _update(c_token.as_ptr(), data_ptr, data_usize, ttl_int, silence_read_int).unwrap();
|
|
166
|
+
let bool: bool = output as usize == 1;
|
|
167
|
+
|
|
168
|
+
Ok(cx.boolean(bool))
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
fn call_delete(mut cx: FunctionContext) -> JsResult<JsBoolean> {
|
|
172
|
+
let token = cx.argument::<JsString>(0)?.value(&mut cx);
|
|
173
|
+
let c_token = CString::new(token).expect("Failed to create CString");
|
|
174
|
+
|
|
175
|
+
let output: *const c_int = _delete(c_token.as_ptr()).unwrap();
|
|
176
|
+
let bool: bool = output as usize == 1;
|
|
177
|
+
|
|
178
|
+
Ok(cx.boolean(bool))
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
#[neon::main]
|
|
182
|
+
fn main(mut cx: ModuleContext) -> NeonResult<()> {
|
|
183
|
+
cx.export_function("encrypted_key", call_encrypted_key)?;
|
|
184
|
+
cx.export_function("create", call_create)?;
|
|
185
|
+
cx.export_function("read", call_read)?;
|
|
186
|
+
cx.export_function("update", call_update)?;
|
|
187
|
+
cx.export_function("delete", call_delete)?;
|
|
188
|
+
|
|
189
|
+
Ok(())
|
|
190
|
+
}
|