---
title: "Route Flow: ssutil/src/index.ts"
---
flowchart TD
title["Route Flow: ssutil/src/index.ts"]
style title fill:none,stroke:none,color:#B4976A,font-size:18px
subgraph USE ["USE"]
hono_use__["USE *"]
style hono_use__ fill:#5E377B,color:#fff,stroke:#B4976A
hono_use__["USE *"]
style hono_use__ fill:#5E377B,color:#fff,stroke:#B4976A
hono_use__dolater_v1__["USE /dolater/v1/*"]
style hono_use__dolater_v1__ fill:#5E377B,color:#fff,stroke:#B4976A
hono_use__slack_v1__["USE /slack/v1/*"]
style hono_use__slack_v1__ fill:#5E377B,color:#fff,stroke:#B4976A
hono_use__email_v1__["USE /email/v1/*"]
style hono_use__email_v1__ fill:#5E377B,color:#fff,stroke:#B4976A
end
subgraph GET ["GET"]
hono_get__platform_webflow_js["GET /platform-webflow.js"]
style hono_get__platform_webflow_js fill:#5E377B,color:#fff,stroke:#B4976A
hono_get__canonclient_js["GET /canonclient.js"]
style hono_get__canonclient_js fill:#5E377B,color:#fff,stroke:#B4976A
hono_get__domain_to_id["GET /domain-to-id"]
style hono_get__domain_to_id fill:#5E377B,color:#fff,stroke:#B4976A
end
subgraph ROUTE ["ROUTE"]
hono_route__canon_v1["ROUTE /canon/v1"]
style hono_route__canon_v1 fill:#5E377B,color:#fff,stroke:#B4976A
hono_route__dolater_v1["ROUTE /dolater/v1"]
style hono_route__dolater_v1 fill:#5E377B,color:#fff,stroke:#B4976A
hono_route__slack_v1["ROUTE /slack/v1"]
style hono_route__slack_v1 fill:#5E377B,color:#fff,stroke:#B4976A
hono_route__email_v1["ROUTE /email/v1"]
style hono_route__email_v1 fill:#5E377B,color:#fff,stroke:#B4976A
end
subgraph ALL ["ALL"]
hono_all__platformscrape["ALL /platformscrape"]
style hono_all__platformscrape fill:#5E377B,color:#fff,stroke:#B4976A
end
linkStyle default stroke:#c2a35d,stroke-width:2px,color:#fff
classDef default color:#fff
---
title: "AST Structure: ssutil/src/index.ts"
---
graph TD
n0["SF"]
n1["ID"]
n0 --> n1
n3["Hono"]
n1 --> n3
n3 --> n2
style n3 stroke-dasharray:5,stroke:#B4976A
n2["hono"]
style n2 fill:#ffffff10,stroke:#ffffff33,color:#a1a1a1
n4["ID"]
n0 --> n4
n6["cors"]
n4 --> n6
n6 --> n5
style n6 stroke-dasharray:5,stroke:#B4976A
n5["hono/cors"]
style n5 fill:#ffffff10,stroke:#ffffff33,color:#a1a1a1
n7["ID"]
n0 --> n7
n9["protectAdminRoutes"]
n7 --> n9
n9 --> n8
style n9 stroke-dasharray:5,stroke:#B4976A
n8["./middleware/guard"]
style n8 fill:#ffffff10,stroke:#ffffff33,color:#a1a1a1
n10["ID"]
n0 --> n10
n12["encryptToken"]
n10 --> n12
n12 --> n11
style n12 stroke-dasharray:5,stroke:#B4976A
n13["inspectToken"]
n10 --> n13
n13 --> n11
style n13 stroke-dasharray:5,stroke:#B4976A
n11["./utils/crypto.js"]
style n11 fill:#ffffff10,stroke:#ffffff33,color:#a1a1a1
n14["ID"]
n0 --> n14
n16["adminAuthMiddleware"]
n14 --> n16
n16 --> n15
style n16 stroke-dasharray:5,stroke:#B4976A
n15["./middleware/adminauth"]
style n15 fill:#ffffff10,stroke:#ffffff33,color:#a1a1a1
n17["ID"]
n0 --> n17
n19["platformscrapeMiddleware"]
n17 --> n19
n19 --> n18
style n19 stroke-dasharray:5,stroke:#B4976A
n18["./middleware/platformscrape"]
style n18 fill:#ffffff10,stroke:#ffffff33,color:#a1a1a1
n20["ID"]
n0 --> n20
n20 --> n21
n21["./middleware/slackhandler"]
style n21 fill:#ffffff10,stroke:#ffffff33,color:#a1a1a1
n22["ID"]
n0 --> n22
n22 --> n23
n23["./middleware/mailhandler"]
style n23 fill:#ffffff10,stroke:#ffffff33,color:#a1a1a1
n24["ID"]
n0 --> n24
n26["domainToIdHandler"]
n24 --> n26
n26 --> n25
style n26 stroke-dasharray:5,stroke:#B4976A
n25["./utils/domain-to-id-handler"]
style n25 fill:#ffffff10,stroke:#ffffff33,color:#a1a1a1
n27["ID"]
n0 --> n27
n27 --> n28
n28["./middleware/dolater"]
style n28 fill:#ffffff10,stroke:#ffffff33,color:#a1a1a1
n29["ID"]
n0 --> n29
n31["canonAuthMiddleware"]
n29 --> n31
n31 --> n30
style n31 stroke-dasharray:5,stroke:#B4976A
n30["./middleware/canon"]
style n30 fill:#ffffff10,stroke:#ffffff33,color:#a1a1a1
n32["ID"]
n0 --> n32
n32 --> n33
n33["mustache"]
style n33 fill:#ffffff10,stroke:#ffffff33,color:#a1a1a1
n34["ID"]
n0 --> n34
n36["domaintopassword"]
n34 --> n36
n36 --> n35
style n36 stroke-dasharray:5,stroke:#B4976A
n37["saltpassword"]
n34 --> n37
n37 --> n35
style n37 stroke-dasharray:5,stroke:#B4976A
n35["./middleware/auth"]
style n35 fill:#ffffff10,stroke:#ffffff33,color:#a1a1a1
n38["ID"]
n0 --> n38
n38 --> n39
n39["./scripts/platform-webflow.js.txt"]
style n39 fill:#ffffff10,stroke:#ffffff33,color:#a1a1a1
n40["ID"]
n0 --> n40
n40 --> n41
n41["./scripts/canonclient.js.txt"]
style n41 fill:#ffffff10,stroke:#ffffff33,color:#a1a1a1
n56["VS"]
n0 --> n56
n58["VD: app"]
n56 --> n58
n60["NE"]
n58 --> n60
n63["CE: app.use"]
n0 --> n63
n68["CE: protectAdminRoutes"]
n63 --> n68
n71["CE: app.use"]
n0 --> n71
n76["CE: cors"]
n71 --> n76
n106["CE: app.get"]
n0 --> n106
n111["AF"]
n106 --> n111
n116["RS"]
n111 --> n116
n117["CE: c.text"]
n116 --> n117
n131["CE: app.get"]
n0 --> n131
n136["AF"]
n131 --> n136
n141["RS"]
n136 --> n141
n142["CE: c.text"]
n141 --> n142
n156["CE: app.route"]
n0 --> n156
n163["CE: app.use"]
n0 --> n163
n170["CE: app.route"]
n0 --> n170
n177["CE: app.get"]
n0 --> n177
n185["CE: app.all"]
n0 --> n185
n193["CE: app.use"]
n0 --> n193
n200["CE: app.route"]
n0 --> n200
n207["CE: app.use"]
n0 --> n207
n214["CE: app.route"]
n0 --> n214
n220["VS"]
n0 --> n220
n222["VD: cronEndpoints"]
n220 --> n222
n240["MD: fetch"]
n0 --> n240
n260["RS"]
n240 --> n260
n261["CE: app.fetch"]
n260 --> n261
n268["MD: scheduled"]
n0 --> n268
n287["VS"]
n268 --> n287
n289["VD: expiry"]
n287 --> n289
n291["BE"]
n289 --> n291
n292["CE: Date.now"]
n291 --> n292
n298["BE"]
n291 --> n298
n299["BE"]
n298 --> n299
n302["VS"]
n268 --> n302
n304["VD: token"]
n302 --> n304
n307["CE: encryptToken"]
n304 --> n307
n309["CE: expiry.toString"]
n307 --> n309
n316["VS"]
n268 --> n316
n318["VD: endpoints"]
n316 --> n318
n325["IS"]
n268 --> n325
n326["BE"]
n325 --> n326
n330["BE"]
n326 --> n330
n338["CE: console.error"]
n325 --> n338
n346["RS"]
n325 --> n346
n348["CE: endpoints.forEach"]
n268 --> n348
n352["AF"]
n348 --> n352
n357["VS"]
n352 --> n357
n359["VD: url"]
n357 --> n359
n361["NE"]
n359 --> n361
n362["VS"]
n352 --> n362
n364["VD: request"]
n362 --> n364
n366["NE"]
n364 --> n366
n368["CE: ctx.waitUntil"]
n352 --> n368
n372["CE: Promise.resolve(app.fetch(request, env, ctx)).catch"]
n368 --> n372
n374["CE: Promise.resolve"]
n372 --> n374
n376["AF"]
n372 --> n376
style n0 fill:#5E377B,color:#fff,stroke:#B4976A
linkStyle default stroke:#c2a35d,stroke-width:1px,opacity:0.6
AF ArrowFunctionBE BinaryExpressionCE CallExpressionIS IfStatementID ImportDeclarationMD MethodDeclarationNE NewExpressionRS ReturnStatementSF SourceFileVD VariableDeclarationVS VariableStatement