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