--- tags: airaConnect --- ## 架構解析 ### Entrypoints `src/main.js`。 --- ### Bootstraps 設定的初始化: `src/main.js`。 依賴的初始化: `src/spidermain/index.js` 對依賴作包裝: `src/domain/index.js` 資料的初始化: `src/domain/initdb.js` --- ### Presentation Layer #### REST 1. 在 `src/main.js` 註冊 `middlewares`。 2. 其中在 `/${global.params.server.prefix}` 的 middleware 引入 `src/interface/api/airaconnect.js` 裡面的內容。 3. 如果是 `publicCgi` 的其中一個,將不作 `token` 的檢查。 #### UDP Server(Message Worker) 目前單純只是在收到訊息時往 socket 推送(透過 `socket.broadcastMessage`)。 > workerMsgSender 以及 workerFriendTrolGateway 目前沒用到。 --- ### Application Layer #### Authentication 1. 在 `src/interface/api/index.js` 定義了 `authorize` 方法,這個方法會嘗試從 `headers["token"]` 取出 token,並呼叫 `global.spiderman.token.decryptToAccountInTime()` 解析出 `profile`。 2. 如果解析不出來就會拋出 `Unauthorized` 錯誤。 #### Application Services 在 `src/api/airaconnect` 定義了許多 `CRUD` 方法。他們都沿用了 `src/api/airaconnect/crud.js` 提供的基礎方法,並對接收到的資料作驗證(使用 `src/spiderman/validate.js`)。 #### Use Cases CRUD: - devicegroup - devices - devicetype - eventhandle - map Analysis/Aggregation: - report --- ### Domain Layer 目前是空的。 其實可以把領域模型的產生,驗證作在這層。 --- ### Adapters - express server - mongo client - udp server - socket - file system --- ### infrastructure - worker-nx/nxdriver: 負責產生影音串流的 `token`。 - decryptToAccount/encryptFromAccount/decryptToAccountInTime: 將使用者的 `profile` 打成 token/嘗試解開 token 的方法。 - parse: 解析 json 時額外作了防呆。 - mailer: 寄 Mail 通知的方法。 - systemlog: 可能是想要抽 logger interface。 - request: 作 Server to server API Call 的包裝。 --- ## 設定 設定最後會存回 global commands > dotenv 雖然有但是是空的 ### argObject - process.env.UV_THREADPOOL_SIZE - process.env.NODE_TLS_REJECT_UNAUTHORIZED - process.env.NODE_TLS_MIN_PROTOCOL_VERSION --- ### hardcoded 的部分 ### 能指定的部分 - fileroot - localhost --- ### 寫在設定檔的部分 - server - httpEnable - httpPort - httpsEnable - httpsPort - prefix - session - checkTimer - timeOut - godSession - mongodb - ip - port - user - pass - db - mqtt - mqttServerEnable - mqttClientEnable - ip - port - user - pass - create_date - last_modify_date - vms - authorization - host - port - username - password - smtp - host - secure - port - user - pass - from - enable - security - security - account - password - sender - email --- ### 自動衍生的部分 - dataPath - swPath - fwPath - importPath - wwwdist --- ## 其他 ### 目前看起來用不到的依賴 `src/spiderman/index.js`: - dayjs - calculate - image - tcpclient - tcpserver - encryption - nxdriver `src/domain/index.js`: - workerMsgSender > 另外,express() 執行了多次。 --- ## 一些想法 - [ ] 1. 目前路由載入有點 Tricky(而且看得出有想抽 Application Services),改為一個一個指定比較明確(且不用集中在同一個檔案改完)。 - [x] 2. 把 Credentials 打成 Token 或者從 Token 解析出來的這段中間可以過 Redis(不然流量上來的時候會比較吃 CPU)。Authentication 的邏輯可以擺在 Application Services 或 Utils 下。 - [ ] 3. 資料驗證可以作成每一支路由有各自的驗證(太抽象會比較不好寫且沒那麼好用)。 - [ ] 4. 看得出有想要分層,譬如 spiderman 是偏 infrastructure、utils 和 adapters,而 domain 比較像 Application Layer。 - [x] 5. Adapter 有點包太多層(spiderman 一層, domain 又一層),然後 File System 的 Adapter 也包了 proxy。 - [ ] 6. 現在 module export 的時候可以個別分開 export 了,功能比較雜的時候應該切開成不同檔案,不要直接 export { ... }。 - [x] 7. 設定檔可以集中到 .env。 - [ ] 8. logs 可以考慮寫到別的地方(最好能設定 alert manager)。 - [ ] 9. 用 typescript 改寫(定義了什麼、有什麼能用會比較清楚)。 - [x] 10. 可以用 prettier 幫助程式碼排版。