'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 };