Files
hcapEnv/src/sandbox/mocks/crypto.js
2026-02-21 18:27:49 +08:00

67 lines
3.2 KiB
JavaScript

'use strict';
/**
* P1: Crypto / Storage / IDBFactory / atob / btoa mock
*/
const { createNative, nativeClass } = require('./native');
const nodeCrypto = require('crypto');
// ── Crypto ───────────────────────────────────────────────────
const cryptoMock = {
getRandomValues: createNative('getRandomValues', function (array) {
return nodeCrypto.randomFillSync(array);
}),
randomUUID: createNative('randomUUID', function () {
return nodeCrypto.randomUUID();
}),
subtle: {
digest: createNative('digest', function () { return Promise.resolve(new ArrayBuffer(32)); }),
encrypt: createNative('encrypt', function () { return Promise.resolve(new ArrayBuffer(0)); }),
decrypt: createNative('decrypt', function () { return Promise.resolve(new ArrayBuffer(0)); }),
sign: createNative('sign', function () { return Promise.resolve(new ArrayBuffer(32)); }),
verify: createNative('verify', function () { return Promise.resolve(true); }),
generateKey: createNative('generateKey', function () { return Promise.resolve({}); }),
importKey: createNative('importKey', function () { return Promise.resolve({}); }),
exportKey: createNative('exportKey', function () { return Promise.resolve({}); }),
},
};
// ── Storage (localStorage / sessionStorage) ──────────────────
class Storage {
constructor() { this._store = {}; }
get length() { return Object.keys(this._store).length; }
key(i) { return Object.keys(this._store)[i] || null; }
getItem(k) { return Object.prototype.hasOwnProperty.call(this._store, k) ? this._store[k] : null; }
setItem(k, v) { this._store[String(k)] = String(v); }
removeItem(k) { delete this._store[k]; }
clear() { this._store = {}; }
}
nativeClass(Storage);
// ── IDBFactory (indexedDB) ────────────────────────────────────
class IDBFactory {
open() { return { result: null, onerror: null, onsuccess: null }; }
deleteDatabase() { return {}; }
databases() { return Promise.resolve([]); }
cmp() { return 0; }
}
nativeClass(IDBFactory);
// ── Notification ──────────────────────────────────────────────
class Notification {
constructor(title, opts) {
this.title = title;
this.options = opts || {};
}
close() {}
static get permission() { return 'denied'; } // P2: denied 或 default
static requestPermission() { return Promise.resolve('denied'); }
}
nativeClass(Notification);
// ── atob / btoa ───────────────────────────────────────────────
const atob = createNative('atob', (str) => Buffer.from(str, 'base64').toString('binary'));
const btoa = createNative('btoa', (str) => Buffer.from(str, 'binary').toString('base64'));
module.exports = { cryptoMock, Storage, IDBFactory, Notification, atob, btoa };