wrapper-coil-extension是 Coil 的 Web Monetization 浏览器扩展的封装,允许从 node.js 中使用它。
安装
npm install --save wrapper-coil-extension
用法
const{ login, logout, monetize }=require("wrapper-coil-extension");// To Login with your Coil Accountlogin();// To Logoutlogout();// To start Monetizationmonetize(monetizationPackages);
constmonetization=(()=>{letpackages=[];constwalletHash={};constnameHash={};return{getpackages(){returnpackages;},setpackages(val){packages=val;val.forEach((p,index)=>{if (walletHash[p.webMonetization.wallet]===undefined)walletHash[p.webMonetization.wallet]=[index];elsewalletHash[p.webMonetization.wallet].push(index);nameHash[`${p.name}@${p.version}`]=index;});},getState(name,version){if (nameHash[`${name}@${version}`]!==undefined){returnpackages[nameHash[`${name}@${version}`]].state;}console.log(`No package ${name}@${version} found\n`);returnundefined;},addEventListener(name,version,listener,foo){if (!(listener==="monetizationpending"||listener==="monetizationstart"||listener==="monetizationstop"||listener==="monetizationprogress")){console.log(`${listener} is not a valid event name\n`);returnfalse;}if (nameHash[`${name}@${version}`]!==undefined){packages[nameHash[`${name}@${version}`]][listener].push(foo);returntrue;}console.log(`No package ${name}@${version} found\n`);returnfalse;},removeEventListener(name,version,listener,foo=undefined){if (!(listener==="monetizationpending"||listener==="monetizationstart"||listener==="monetizationstop"||listener==="monetizationprogress")){console.log(`${listener} is not a valid event name\n`);returnfalse;}if (nameHash[`${name}@${version}`]!==undefined){if (!foo){packages[nameHash[`${name}@${version}`]][listener]=[];}else{packages[nameHash[`${name}@${version}`]][listener]=packages[nameHash[`${name}@${version}`]][listener].filter((found)=>foo!==found);}returntrue;}console.log(`No package ${name}@${version} found\n`);returnfalse;},invokeEventListener(data){walletHash[data.detail.paymentPointer].forEach((index)=>{packages[index].state=data.type==="monetizationstart"||data.type==="monetizationprogress"?"started":data.type==="monetizationpending"?"pending":"stopped";packages[index][data.type].forEach((listener)=>{listener(data);});});},};})();
globalThis.monetization它是通过类似这样的代理实现的
globalThis.monetization=newProxy(monetization,{set:()=>{console.log("Not allowed to mutate values\n");},get(target,key,receiver){if (key==="getState"||key==="addEventListener"||key==="removeEventListener"){returnReflect.get(...arguments);}else{console.log(`Not allowed to access monetization.${key}\n`);returnnull;}},});
这样既能防止篡改原始对象,又能只展现所需的功能。
模块提供者会收到另一个代理,用于相同的目的。
newProxy(monetization,{set:()=>{console.log("Not allowed to mutate values\n");},get(target,key,receiver){if (key==="packages"||key==="invokeEventListener"){returnReflect.get(...arguments);}else{console.log(`Not allowed to access monetization.${key}\n`);returnnull;}},}),