NodeGet 插件机制
NodeGet 是一个具有细粒度 token 模型的软件,对于不同的操作定义了详细的权限限制
为了方便基于 NodeGet 的 api 和 token 设计的辅助程序,官方提供一个将程序嵌入到 dashboard 上的方法
这个工作其实并不复杂,原则上相当于在 server 上实现了一个静态文件储存器
前端通过iframe加载对应的储存器,然后支持注册到 dashboard 的路由上即可
先说场景
在介绍具体的插件工作原理前,先说一个具体的插件的目录结构和文件内容,有一个大体的印象
文件结构
demo-extension
├── app.json
├── readme.md
├── resources
│ ├── assets
│ │ ├── icon.svg
│ │ ├── main.js
│ │ ├── route-icon.svg
│ │ └── style.css
│ └── index.html
└── worker.jsapp.json
json
{
"name":"my-extenstion",
"icon":"assets/icon.svg",
"routes":[
{
"type":"node",
"name":"extension-test-1",
"icon":"assets/route-icon.svg",
"entry":"index.html"
},
{
"type":"global",
"name":"extension-test-2",
"icon":"assets/route-icon.svg",
"entry":"index.html"
}
],
"limits":[
// 这里由用户输入,token所需要的权限列表
],
// 非关键字段,仅记录用
"version": "1.0",
"description": "Just an extension demo.",
"extension_version": 1,
"author":"",
"repository":"",
"homepage":"",
"license":"",
}插件安装流程介绍
插件的安装流程很简单,简述如下
- 用户在前端的插件安装界面打开本地文件夹或者zip文件
- 获取到所有文件,读取app.json,弹出确认创建指定权限token的提示框
- 用户确认后创建对应的token
- 生成一个随机的uuid代表扩展的id,这里暂定为 Extension_UUID
- 把resource目录下的静态文件利用后文提到的静态文件服务上传到
https://主控域名/worker-route/static-worker-route/Extension_UUID/路由下 - 动态注册前端路由
- 把 app.json 和 Extension_UUID, token等信息储存到kv内,namaspace为extension-infomation,key是Extension_UUID
静态文件托管worker
为了实现静态文件托管到kv,实现了一个简易的js扩展worker,名称为static-worker,这个worker会在添加server时预装
下面是这个worker暴露的接口
js
const resourceURL = 'https://WS_HOST/worker-route/static-worker-route/{Extension_UUID}/hello';
// 储存静态资源
fetch(resourceURL,{
method:'POST',
body:'你好世界',
headers:{
// Bearer + nodeget token
'Authorization':'Bearer Token'
}
}).then(r => r.text()).then(console.log)
// 获取静态资源(无需token)
fetch(resourceURL).then(r => r.text()).then(console.log)因此,在文件上传完成后,其实只是在网页上开一个iframe,类似于:
html
<iframe src="https://WS_HOST/worker-route/static-worker-route/Extension_UUID/{entry}#?token={}&node=${AGENT_UUID}&theme={theme}"></iframe>插件开发及分发
插件开发时应该尽量使用相对路径,比如在vite开发时将base设为"./"
这里提供一个 demo-extension 的vite项目
分发时可以提供打包好的文件的zip包
