diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..504afef --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +node_modules/ +package-lock.json diff --git a/README.md b/README.md index a1c212a..6fd7958 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,36 @@ # PCDN -P2P CDN \ No newline at end of file +P2P CDN + + +持有资源变动时, 通知节点列表 +获取一个资源时, 先查找拥有此资源的节点列表 + +增量列表 + +节点列表伺服器记录每个节点持有的资源, +假设有 ABCDE 节点在线, 当 E 节点请求资源 a, +向伺服器查询没有任何节点持有此资源, 则从 CDN 下载此资源, 并通知伺服器将持有此资源 48 h +如果此节点持有资源过多, 将主动过期部分资源 + +O1双向查询 +获取和修改某个节点持有的所有资源 +获取和修改持有某个资源的所有节点 +节点的上线和下线状态变动 + +应用于大量用户在线的网站或游戏以及图床, 当然也可以存储网站本身的 JS 文件 + + +### 安全 +资源污染: 某些节点发放虚假资源(使用hash校验) +空壳节点: 某些节点上报资源却拒绝分享资源(节点可用性上报) +虚假上报: 可用节点报告为不可用, 不可用节点报告为可用(伺服器要求指定节点上报指定节点可用性) + + +### 节点 +某终端连接 8 个节点, 查询某资源信息 +8x8=64 节点 +64x8=512 节点 + +建立连接后交换资源列表及过期时间 + diff --git a/index.html b/index.html new file mode 100644 index 0000000..cd473e0 --- /dev/null +++ b/index.html @@ -0,0 +1,3 @@ + +PCDN + diff --git a/main.js b/main.js new file mode 100644 index 0000000..b1d7e59 --- /dev/null +++ b/main.js @@ -0,0 +1,29 @@ +//export class Node { +// id: '' +// name: '' +// assets: new Map() +// get(name) {} +// set(name) {} +// del(name) {} +//} +// +//export const nodes = new Map() // 在线的节点 +//export const assets = new Map() // 在线的资源 +// +//// 示例: 查询持有某个资源的节点列表 +//const list = query('xxx.jpg').map(item => 'node id') +//const 测速排序 = () => {} +// +//// 查询某个 +// +//// 示例: 通过PCDN节点网络获取某个资源 +//const pcdn = new PCDN({ server: '/pcdn' }) +//pcdn.get('xxx.jpg').then(file => {}) + +if ('serviceWorker' in navigator) { + navigator.serviceWorker.register('/sw.js').then((registration) => { + console.log('Service Worker 注册成功: ', registration) + }).catch((error) => { + console.log('Service Worker 注册失败: ', error) + }) +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..c30cf7c --- /dev/null +++ b/package.json @@ -0,0 +1,14 @@ +{ + "name": "pcdn", + "version": "1.0.0", + "description": "P2P CDN", + "main": "index.js", + "scripts": { + "dev": "vite --open" + }, + "author": "satori.love", + "license": "GPL-3.0-only", + "devDependencies": { + "vite": "^5.2.12" + } +} diff --git a/sw.js b/sw.js new file mode 100644 index 0000000..20e74d2 --- /dev/null +++ b/sw.js @@ -0,0 +1,11 @@ +self.addEventListener('install', (event) => { + console.log('Service Worker 安装') +}) + +self.addEventListener('activate', (event) => { + console.log('Service Worker 激活') +}) + +self.addEventListener('fetch', (event) => { + console.log('Fetch intercepted for:', event.request.url) +}) \ No newline at end of file