您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
none
// ==UserScript== // @name lib:indexeddb ls // @version 10 // @description none // @license GPLv3 // @run-at document-start // @author rssaromeo // @match *://*/* // @include * // @tag lib // @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEgAAABICAMAAABiM0N1AAAAAXNSR0IB2cksfwAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAHJQTFRFAAAAEIijAo2yAI60BYyuF4WaFIifAY6zBI2wB4usGIaZEYigIoiZCIyrE4igG4iYD4mjEomhFoedCoqpDIqnDomlBYyvE4efEYmiDYqlA42xBoytD4mkCYqqGYSUFYidC4qoC4upAo6yCoupDYqmCYur4zowOQAAACZ0Uk5TAO////9vr////1+/D/+/L+/Pf/////+f3///////H4////////+5G91rAAACgUlEQVR4nM2Y22KjIBCGidg1264liZqDadK03X3/V2wNKHMC7MpF/xthHD5mgERAqZhWhfYqH6K+Qf2qNNf625hCoFj9/gblMUi5q5jLkXLCKudgyiRm0FMK82cWJp1fLbV5VmvJbCIc0GCYaFqqlDJgADdBjncqAXYobm1xh72aFMflbysteFfdy2Yi1XGOm5HGBzQ1dq7TzEoxjeNTjQZb7VA3e1c7+ImgasAgQ9+xusNVNZIo5xmOMgihIS2PbCQIiHEUdTvhxCcS/kPomfFI2zHy2PkWmA6aNatIJpKFJyekyy02xh5Y3DI9T4aOT6VhIUrsNTFp1pf79Z4SIIVDegl6IJO6cHiL/GimIZDhgTu/BlYWCQzHMl0zBWT/T3KAhtxOuUB9FtBrpsz0RV4xsjHmW+UCaffcSy/5viMGer0/6HdFNMZBq/vjJL38H9Dqx4Fuy0Em12DbZy+9pGtiDijbglwAehyj11n0tRD3WUBm+lwulE/8h4BuA+iWAQQnteg2Xm63WQLTpnMnpjdge0Mgu/GRPsV4xdjQ94Lfi624fabhDkfUqIKNrM64Q837v8yL0prasepCgrtvw1sJpoqanGEX7b5mQboNW8eawXaWXTMfMGxub472hzWzHSn6Sg2G9+6TAyRruE71s+zAzjWaknoyJCQzwxrghH2k5FDT4eqWunuNxyN9QCGcxVod5oADbYnIUkDTGZEf1xDJnSFteQ3KdsT8zYDMQXcHxsevcLH1TrsABzkNPyA/L7b0jg704viMMlpQI96WsHknCt/3YH0kOEo9zcGkwrFK39ck72rmoehmKqo2RKlilzSy/nJKEV45CT38myJp456fezktHjN5aeMAAAAASUVORK5CYII= // @grant none // @exclude /livereload.net\/files\/ffopen\/index.html$/ // @namespace https://greasyfork.org/users/1184528 // ==/UserScript== ;(() => { function isFilesystemHandle(obj) { return ( obj && (obj instanceof FileSystemFileHandle || obj instanceof FileSystemDirectoryHandle) ) } var x = loadlib("libloader") const a = loadlib("allfuncs", "indexeddb ls") x.savelib("indexeddb ls", async function newdbproxy(name) { var db = await a.indexeddb_setup({ storeName: name, keyPath: "id", }) let indexedData = await a.indexeddb_getall(db) var localData = {} indexedData.forEach((item) => { localData[item.id] = item.val }) function set(prop, val) { if (prop == "all") { return new Promise(async (done) => { await proxy.clear() Object.entries(val).forEach((item) => { localData[item[0]] = item[1] }) await proxy.saveall() return done(true) }) } else { localData[prop] = val a.indexeddb_set(db, { id: prop, val: val }) // log("indexeddb ls", "setting", prop, "to", val) } } function remove(prop) { delete localData[prop] a.indexeddb_remove(db, prop) } const dbProxyHandler = { set(target, prop, value) { target[prop] = value set(prop, value) return true }, get(target, prop) { switch (prop) { case Symbol.iterator: var ld = Object.entries(localData).map(([id, val]) => { return { id, val } }) return function* () { for (var i in ld) { yield ld[i] } } case Symbol.toStringTag: return "ls" case "clear": return async function () { Object.keys(localData).forEach((key) => { Reflect.deleteProperty(localData, key) }) await a.indexeddb_clearall(db) return localData } case "all": return localData case "loadall": return async function () { localData = {} var temp = await a.indexeddb_getall(db) temp.forEach((item) => { localData[item.id] = item.val }) return localData } case "saveall": return async function () { Object.entries(localData) .map((e) => { return { id: e[0], val: e[1] } }) .forEach((item) => a.indexeddb_set(db, item)) } default: var value = Reflect.get(target, prop) if ( a.gettype(value, ["object", "array"]) && !isFilesystemHandle(value) ) { value = new Proxy( value, newnestedProxyHandler(prop, value) ) } return value } }, deleteProperty(target, prop) { var val = Reflect.deleteProperty(target, prop) remove(prop) return val }, } let proxy = new Proxy(localData, dbProxyHandler) function newnestedProxyHandler(mainprop, mainval) { return { mainprop, mainval, set(target, prop, value) { // trace( // "nested", // prop, // value, // this.mainprop, // this.mainval, // this // ) target[prop] = value set(this.mainprop, this.mainval) return true }, get(target, prop) { var val = target[prop] if ( a.gettype(val, ["object", "array"]) && !isFilesystemHandle(val) ) { return new Proxy( val, newnestedProxyHandler(mainprop, mainval) ) } return val }, deleteProperty(target, prop) { var val = Reflect.deleteProperty(target, prop) set(this.mainprop, this.mainval) return val }, } } return proxy }) })()