67 lines
3.2 KiB
JavaScript
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 };
|