---
title: "Route Flow: ssutil/src/middleware/dolater.ts"
---
flowchart TD
title["Route Flow: ssutil/src/middleware/dolater.ts"]
style title fill:none,stroke:none,color:#B4976A,font-size:18px
subgraph GET ["GET"]
getJobRoute["GET /job/{uuid}"]
style getJobRoute fill:#5E377B,color:#fff,stroke:#B4976A
getQueueRoute["GET /queue"]
style getQueueRoute fill:#5E377B,color:#fff,stroke:#B4976A
processJobsRoute["GET /jobs"]
style processJobsRoute fill:#5E377B,color:#fff,stroke:#B4976A
hono_get__ui["GET /ui"]
style hono_get__ui fill:#5E377B,color:#fff,stroke:#B4976A
end
subgraph POST ["POST"]
createJobRoute["POST /job/{delay}"]
style createJobRoute fill:#5E377B,color:#fff,stroke:#B4976A
createJobsRoute["POST /jobs"]
style createJobsRoute fill:#5E377B,color:#fff,stroke:#B4976A
end
subgraph DELETE ["DELETE"]
deleteJobRoute["DELETE /job/{uuid}"]
style deleteJobRoute fill:#5E377B,color:#fff,stroke:#B4976A
deleteJobsRoute["DELETE /jobs"]
style deleteJobsRoute fill:#5E377B,color:#fff,stroke:#B4976A
end
subgraph API ["API"]
openapi_createJobRoute["API createJobRoute"]
style openapi_createJobRoute fill:#5E377B,color:#fff,stroke:#B4976A
openapi_createJobsRoute["API createJobsRoute"]
style openapi_createJobsRoute fill:#5E377B,color:#fff,stroke:#B4976A
openapi_getJobRoute["API getJobRoute"]
style openapi_getJobRoute fill:#5E377B,color:#fff,stroke:#B4976A
openapi_deleteJobRoute["API deleteJobRoute"]
style openapi_deleteJobRoute fill:#5E377B,color:#fff,stroke:#B4976A
openapi_deleteJobsRoute["API deleteJobsRoute"]
style openapi_deleteJobsRoute fill:#5E377B,color:#fff,stroke:#B4976A
openapi_getQueueRoute["API getQueueRoute"]
style openapi_getQueueRoute fill:#5E377B,color:#fff,stroke:#B4976A
openapi_processJobsRoute["API processJobsRoute"]
style openapi_processJobsRoute fill:#5E377B,color:#fff,stroke:#B4976A
end
subgraph DOC ["DOC"]
hono_doc__doc["DOC /doc"]
style hono_doc__doc fill:#5E377B,color:#fff,stroke:#B4976A
end
subgraph ALL ["ALL"]
hono_all_processingPromises["ALL processingPromises"]
style hono_all_processingPromises fill:#5E377B,color:#fff,stroke:#B4976A
end
parseDelay{{"parseDelay"}}
style parseDelay fill:#161b22,color:#fff,stroke:#c2a35d
isUUID{{"isUUID"}}
style isUUID fill:#161b22,color:#fff,stroke:#c2a35d
createJobLogic{{"createJobLogic"}}
style createJobLogic fill:#161b22,color:#fff,stroke:#c2a35d
createJobRoute --> openapi_createJobRoute
createJobsRoute --> openapi_createJobsRoute
getJobRoute --> openapi_getJobRoute
deleteJobRoute --> openapi_deleteJobRoute
deleteJobsRoute --> openapi_deleteJobsRoute
getQueueRoute --> openapi_getQueueRoute
processJobsRoute --> openapi_processJobsRoute
D1_Database[("D1 Database")]
style D1_Database fill:#c2a35d,color:#0b0e14,stroke:#c2a35d
createJobLogic --> parseDelay
createJobLogic --> D1_Database
linkStyle default stroke:#c2a35d,stroke-width:2px,color:#fff
classDef default color:#fff
---
title: "AST Structure: ssutil/src/middleware/dolater.ts"
---
graph TD
n0["SF"]
n1["ID"]
n0 --> n1
n3["OpenAPIHono"]
n1 --> n3
n3 --> n2
style n3 stroke-dasharray:5,stroke:#B4976A
n4["createRoute"]
n1 --> n4
n4 --> n2
style n4 stroke-dasharray:5,stroke:#B4976A
n5["z"]
n1 --> n5
n5 --> n2
style n5 stroke-dasharray:5,stroke:#B4976A
n2["@hono/zod-openapi"]
style n2 fill:#ffffff10,stroke:#ffffff33,color:#a1a1a1
n6["ID"]
n0 --> n6
n8["swaggerUI"]
n6 --> n8
n8 --> n7
style n8 stroke-dasharray:5,stroke:#B4976A
n7["@hono/swagger-ui"]
style n7 fill:#ffffff10,stroke:#ffffff33,color:#a1a1a1
n9["ID"]
n0 --> n9
n11["Context"]
n9 --> n11
n11 --> n10
style n11 stroke-dasharray:5,stroke:#B4976A
n10["hono"]
style n10 fill:#ffffff10,stroke:#ffffff33,color:#a1a1a1
n12["ID"]
n0 --> n12
n14["canonAuthMiddleware"]
n12 --> n14
n14 --> n13
style n14 stroke-dasharray:5,stroke:#B4976A
n13["./canon"]
style n13 fill:#ffffff10,stroke:#ffffff33,color:#a1a1a1
n15["ID"]
n0 --> n15
n17["inspectToken"]
n15 --> n17
n17 --> n16
style n17 stroke-dasharray:5,stroke:#B4976A
n18["encryptToken"]
n15 --> n18
n18 --> n16
style n18 stroke-dasharray:5,stroke:#B4976A
n16["../utils/crypto.js"]
style n16 fill:#ffffff10,stroke:#ffffff33,color:#a1a1a1
n38["VS"]
n0 --> n38
n40["VD: TIME_UNITS"]
n38 --> n40
n62["FD: parseDelay"]
n0 --> n62
n69["IS"]
n62 --> n69
n72["RS"]
n69 --> n72
n74["RS"]
n62 --> n74
n75["CE: Array.from(delay.matchAll(/(\d+)([wdhms])/g))
.reduce"]
n74 --> n75
n77["CE: Array.from"]
n75 --> n77
n81["CE: delay.matchAll"]
n77 --> n81
n87["AF"]
n75 --> n87
n98["BE"]
n87 --> n98
n101["BE"]
n98 --> n101
n103["FD: isUUID"]
n0 --> n103
n110["VS"]
n103 --> n110
n112["VD: uuidRegex"]
n110 --> n112
n115["RS"]
n103 --> n115
n116["CE: uuidRegex.test"]
n115 --> n116
n121["FD: createJobLogic"]
n0 --> n121
n135["VS"]
n121 --> n135
n137["VD: delayMs"]
n135 --> n137
n139["CE: parseDelay"]
n137 --> n139
n143["CE: console.log"]
n121 --> n143
n156["CE: console.log"]
n121 --> n156
n163["CE: Date.now"]
n156 --> n163
n168["VS"]
n121 --> n168
n170["VD: scheduledAt"]
n168 --> n170
n172["BE"]
n170 --> n172
n173["CE: Date.now"]
n172 --> n173
n180["CE: console.log"]
n121 --> n180
n189["VS"]
n121 --> n189
n191["VD: uuid"]
n189 --> n191
n193["CE: crypto.randomUUID"]
n191 --> n193
n197["VS"]
n121 --> n197
n199["VD: clientID"]
n197 --> n199
n201["BE"]
n199 --> n201
n207["VS"]
n121 --> n207
n209["VD: batchID"]
n207 --> n209
n211["BE"]
n209 --> n211
n217["VS"]
n121 --> n217
n219["VD: title"]
n217 --> n219
n221["BE"]
n219 --> n221
n227["VS"]
n121 --> n227
n229["VD: jobtype"]
n227 --> n229
n231["BE"]
n229 --> n231
n237["VS"]
n121 --> n237
n239["VD: payload"]
n237 --> n239
n264["VS"]
n121 --> n264
n266["VD: { url, RequestInit }"]
n264 --> n266
n273["IS"]
n121 --> n273
n277["RS"]
n273 --> n277
n285["VS"]
n121 --> n285
n287["VD: method"]
n285 --> n287
n289["BE"]
n287 --> n289
n296["VS"]
n121 --> n296
n298["VD: headers"]
n296 --> n298
n300["CE: JSON.stringify"]
n298 --> n300
n304["BE"]
n300 --> n304
n311["VS"]
n121 --> n311
n313["VD: reqBody"]
n311 --> n313
n316["BE"]
n313 --> n316
n325["CE: JSON.stringify"]
n313 --> n325
n333["BE"]
n313 --> n333
n342["CE: db.prepare(
`INSERT INTO jobs (url, method, headers, body, scheduled_at, status, retries_remaining, client_id, batch_id, uuid, title, jobtype) VALUES (?, ?, ?, ?, ?, 'pending', 3, ?, ?, ?, ?, ?)`
).bind(url, method, headers, reqBody, scheduledAt, clientID, batchID, uuid, title, jobtype).run"]
n121 --> n342
n344["CE: db.prepare(
`INSERT INTO jobs (url, method, headers, body, scheduled_at, status, retries_remaining, client_id, batch_id, uuid, title, jobtype) VALUES (?, ?, ?, ?, ?, 'pending', 3, ?, ?, ?, ?, ?)`
).bind"]
n342 --> n344
n346["CE: db.prepare"]
n344 --> n346
n363["RS"]
n121 --> n363
n373["CE: new Date(scheduledAt).toISOString"]
n363 --> n373
n375["NE"]
n373 --> n375
n379["VS"]
n0 --> n379
n381["VD: JobResponseSchema"]
n379 --> n381
n383["CE: z.object"]
n381 --> n383
n390["CE: z.boolean().optional"]
n383 --> n390
n392["CE: z.boolean"]
n390 --> n392
n399["CE: z.string().openapi"]
n383 --> n399
n401["CE: z.string"]
n399 --> n401
n412["CE: z.string().optional"]
n383 --> n412
n414["CE: z.string"]
n412 --> n414
n421["CE: z.string().optional"]
n383 --> n421
n423["CE: z.string"]
n421 --> n423
n428["VS"]
n0 --> n428
n430["VD: JobInputSchema"]
n428 --> n430
n432["CE: z.object"]
n430 --> n432
n439["CE: z.string().refine(
(val) => {
// Accept absolute URLs or relative paths starting with /
try {
if (val.startsWith('/')) return true
new URL(val)
return true
} catch {
return false
}
},
{ message: 'Must be a valid URL (e.g., https://example.com/path) or a relative path (e.g., /email/v1/template)' }
).openapi"]
n432 --> n439
n441["CE: z.string().refine"]
n439 --> n441
n443["CE: z.string"]
n441 --> n443
n445["AF"]
n441 --> n445
n460["CE: z.string().optional().openapi"]
n432 --> n460
n462["CE: z.string().optional"]
n460 --> n462
n464["CE: z.string"]
n462 --> n464
n473["CE: z.string().optional().openapi"]
n432 --> n473
n475["CE: z.string().optional"]
n473 --> n475
n477["CE: z.string"]
n475 --> n477
n486["CE: z.string().optional().openapi"]
n432 --> n486
n488["CE: z.string().optional"]
n486 --> n488
n490["CE: z.string"]
n488 --> n490
n499["CE: z.string().optional().openapi"]
n432 --> n499
n501["CE: z.string().optional"]
n499 --> n501
n503["CE: z.string"]
n501 --> n503
n512["CE: z.object({
method: z.string().optional().default('POST'),
headers: z.record(z.string(), z.string()).optional(),
body: z.any().optional()
}).optional"]
n432 --> n512
n514["CE: z.object"]
n512 --> n514
n521["CE: z.string().optional().default"]
n514 --> n521
n524["CE: z.record(z.string(), z.string()).optional"]
n514 --> n524
n527["CE: z.any().optional"]
n514 --> n527
n529["VS"]
n0 --> n529
n531["VD: BulkCreateInputSchema"]
n529 --> n531
n533["CE: z.record(z.string(), JobInputSchema)
.openapi"]
n531 --> n533
n535["CE: z.record"]
n533 --> n535
n539["CE: z.string"]
n535 --> n539
n561["VS"]
n0 --> n561
n563["VD: QueueJobSchema"]
n561 --> n563
n565["CE: z.object"]
n563 --> n565
n572["CE: z.number"]
n565 --> n572
n578["CE: z.string"]
n565 --> n578
n584["CE: z.string().nullable"]
n565 --> n584
n586["CE: z.string"]
n584 --> n586
n593["CE: z.string().nullable"]
n565 --> n593
n595["CE: z.string"]
n593 --> n595
n602["CE: z.number"]
n565 --> n602
n608["CE: z.string().optional"]
n565 --> n608
n610["CE: z.string"]
n608 --> n610
n617["CE: z.string"]
n565 --> n617
n623["CE: z.number().nullable"]
n565 --> n623
n625["CE: z.number"]
n623 --> n625
n632["CE: z.string().nullable"]
n565 --> n632
n634["CE: z.string"]
n632 --> n634
n641["CE: z.string().nullable"]
n565 --> n641
n643["CE: z.string"]
n641 --> n643
n650["CE: z.string().nullable"]
n565 --> n650
n652["CE: z.string"]
n650 --> n652
n657["VS"]
n0 --> n657
n659["VD: QueueResponseSchema"]
n657 --> n659
n661["CE: z.object"]
n659 --> n661
n668["CE: z.number"]
n661 --> n668
n674["CE: z.array"]
n661 --> n674
n679["VS"]
n0 --> n679
n681["VD: ProcessResponseSchema"]
n679 --> n681
n683["CE: z.object"]
n681 --> n683
n690["CE: z.number"]
n683 --> n690
n696["CE: z.array(z.any()).optional"]
n683 --> n696
n698["CE: z.array"]
n696 --> n698
n702["CE: z.any"]
n698 --> n702
n704["VS"]
n0 --> n704
n706["VD: app"]
n704 --> n706
n708["NE"]
n706 --> n708
n716["CE: app.openAPIRegistry.registerComponent"]
n0 --> n716
n737["VS"]
n0 --> n737
n739["VD: createJobRoute"]
n737 --> n739
n741["CE: createRoute"]
n739 --> n741
n769["CE: z.object"]
n741 --> n769
n776["CE: z.string().openapi"]
n769 --> n776
n778["CE: z.string"]
n776 --> n778
n836["CE: app.openapi"]
n0 --> n836
n841["AF"]
n836 --> n841
n847["TS"]
n841 --> n847
n849["VS"]
n847 --> n849
n851["VD: { delay }"]
n849 --> n851
n855["CE: c.req.valid"]
n851 --> n855
n856["VS"]
n847 --> n856
n858["VD: body"]
n856 --> n858
n860["CE: c.req.valid"]
n858 --> n860
n861["VS"]
n847 --> n861
n863["VD: result"]
n861 --> n863
n866["CE: createJobLogic"]
n863 --> n866
n867["IS"]
n847 --> n867
n871["RS"]
n867 --> n871
n872["CE: c.json"]
n871 --> n872
n873["RS"]
n847 --> n873
n874["CE: c.json"]
n873 --> n874
n882["VD: error"]
n847 --> n882
n887["CE: console.error"]
n847 --> n887
n893["VS"]
n847 --> n893
n895["VD: rawBody"]
n893 --> n895
n898["CE: c.req.raw.clone().json().catch"]
n895 --> n898
n900["CE: console.error"]
n847 --> n900
n907["CE: console.error"]
n847 --> n907
n912["CE: c.req.header"]
n907 --> n912
n919["RS"]
n847 --> n919
n920["CE: c.json"]
n919 --> n920
n930["BE"]
n920 --> n930
n933["BE"]
n920 --> n933
n935["VS"]
n0 --> n935
n937["VD: createJobsRoute"]
n935 --> n937
n939["CE: createRoute"]
n937 --> n939
n987["CE: app.openapi"]
n0 --> n987
n992["AF"]
n987 --> n992
n998["VS"]
n992 --> n998
n1000["VD: body"]
n998 --> n1000
n1002["CE: c.req.valid"]
n1000 --> n1002
n1009["VS"]
n992 --> n1009
n1011["VD: results"]
n1009 --> n1011
n1016["VD: [delay, jobBody]"]
n992 --> n1016
n1022["CE: Object.entries"]
n992 --> n1022
n1028["VS"]
n992 --> n1028
n1030["VD: res"]
n1028 --> n1030
n1033["CE: createJobLogic"]
n1030 --> n1033
n1043["CE: results.push"]
n992 --> n1043
n1052["RS"]
n992 --> n1052
n1053["CE: c.json"]
n1052 --> n1053
n1066["VS"]
n0 --> n1066
n1068["VD: getJobRoute"]
n1066 --> n1068
n1070["CE: createRoute"]
n1068 --> n1070
n1098["CE: z.object"]
n1070 --> n1098
n1105["CE: z.string().uuid"]
n1098 --> n1105
n1107["CE: z.string"]
n1105 --> n1107
n1125["CE: app.openapi"]
n0 --> n1125
n1130["AF"]
n1125 --> n1130
n1136["VS"]
n1130 --> n1136
n1138["VD: { uuid }"]
n1136 --> n1138
n1142["CE: c.req.valid"]
n1138 --> n1142
n1149["VS"]
n1130 --> n1149
n1151["VD: job"]
n1149 --> n1151
n1154["CE: c.env.JOBSDB.prepare('SELECT * FROM jobs WHERE uuid = ?').bind(uuid).first"]
n1151 --> n1154
n1156["CE: c.env.JOBSDB.prepare('SELECT * FROM jobs WHERE uuid = ?').bind"]
n1154 --> n1156
n1158["IS"]
n1130 --> n1158
n1161["RS"]
n1158 --> n1161
n1162["CE: c.json"]
n1161 --> n1162
n1171["RS"]
n1130 --> n1171
n1172["CE: c.json"]
n1171 --> n1172
n1179["VS"]
n0 --> n1179
n1181["VD: deleteJobRoute"]
n1179 --> n1181
n1183["CE: createRoute"]
n1181 --> n1183
n1211["CE: z.object"]
n1183 --> n1211
n1218["CE: z.string().uuid"]
n1211 --> n1218
n1220["CE: z.string"]
n1218 --> n1220
n1232["CE: app.openapi"]
n0 --> n1232
n1237["AF"]
n1232 --> n1237
n1243["VS"]
n1237 --> n1243
n1245["VD: { uuid }"]
n1243 --> n1245
n1249["CE: c.req.valid"]
n1245 --> n1249
n1256["VS"]
n1237 --> n1256
n1258["VD: result"]
n1256 --> n1258
n1261["CE: c.env.JOBSDB.prepare(`UPDATE jobs SET status = 'deleted' WHERE uuid = ?`).bind(uuid).run"]
n1258 --> n1261
n1263["CE: c.env.JOBSDB.prepare(`UPDATE jobs SET status = 'deleted' WHERE uuid = ?`).bind"]
n1261 --> n1263
n1265["RS"]
n1237 --> n1265
n1266["CE: c.json"]
n1265 --> n1266
n1281["VS"]
n0 --> n1281
n1283["VD: deleteJobsRoute"]
n1281 --> n1283
n1285["CE: createRoute"]
n1283 --> n1285
n1313["CE: z.object"]
n1285 --> n1313
n1320["CE: z.string().optional"]
n1313 --> n1320
n1322["CE: z.string"]
n1320 --> n1322
n1326["CE: z.string().optional"]
n1313 --> n1326
n1328["CE: z.string"]
n1326 --> n1328
n1332["CE: z.string().optional"]
n1313 --> n1332
n1334["CE: z.string"]
n1332 --> n1334
n1352["CE: app.openapi"]
n0 --> n1352
n1357["AF"]
n1352 --> n1357
n1363["VS"]
n1357 --> n1363
n1365["VD: query"]
n1363 --> n1365
n1367["CE: c.req.valid"]
n1365 --> n1367
n1374["VS"]
n1357 --> n1374
n1376["VD: keys"]
n1374 --> n1376
n1378["CE: ['client_id', 'batch_id', 'jobtype'].filter"]
n1376 --> n1378
n1385["AF"]
n1378 --> n1385
n1386["IS"]
n1357 --> n1386
n1387["BE"]
n1386 --> n1387
n1394["RS"]
n1386 --> n1394
n1395["CE: c.json"]
n1394 --> n1395
n1406["VS"]
n1357 --> n1406
n1408["VD: sql"]
n1406 --> n1408
n1410["BE"]
n1408 --> n1410
n1413["CE: keys.map(k => `${k} = ?`).join"]
n1410 --> n1413
n1414["VS"]
n1357 --> n1414
n1416["VD: params"]
n1414 --> n1416
n1418["CE: keys.map"]
n1416 --> n1418
n1422["AF"]
n1418 --> n1422
n1423["VS"]
n1357 --> n1423
n1425["VD: result"]
n1423 --> n1425
n1428["CE: c.env.JOBSDB.prepare(sql).bind(...params).run"]
n1425 --> n1428
n1430["CE: c.env.JOBSDB.prepare(sql).bind"]
n1428 --> n1430
n1432["RS"]
n1357 --> n1432
n1433["CE: c.json"]
n1432 --> n1433
n1448["VS"]
n0 --> n1448
n1450["VD: getQueueRoute"]
n1448 --> n1450
n1452["CE: createRoute"]
n1450 --> n1452
n1480["CE: z.object"]
n1452 --> n1480
n1487["CE: z.string().optional"]
n1480 --> n1487
n1489["CE: z.string"]
n1487 --> n1489
n1493["CE: z.string().optional"]
n1480 --> n1493
n1495["CE: z.string"]
n1493 --> n1495
n1516["CE: app.openapi"]
n0 --> n1516
n1521["AF"]
n1516 --> n1521
n1527["VS"]
n1521 --> n1527
n1529["VD: { client_id, batch_id }"]
n1527 --> n1529
n1535["CE: c.req.valid"]
n1529 --> n1535
n1542["VS"]
n1521 --> n1542
n1544["VD: sql"]
n1542 --> n1544
n1547["VS"]
n1521 --> n1547
n1549["VD: params"]
n1547 --> n1549
n1554["VS"]
n1521 --> n1554
n1556["VD: conditions"]
n1554 --> n1556
n1561["IS"]
n1521 --> n1561
n1565["CE: conditions.push"]
n1561 --> n1565
n1571["CE: params.push"]
n1561 --> n1571
n1576["IS"]
n1521 --> n1576
n1580["CE: conditions.push"]
n1576 --> n1580
n1586["CE: params.push"]
n1576 --> n1586
n1592["CE: conditions.push"]
n1521 --> n1592
n1597["IS"]
n1521 --> n1597
n1598["BE"]
n1597 --> n1598
n1606["BE"]
n1597 --> n1606
n1609["BE"]
n1606 --> n1609
n1612["CE: conditions.join"]
n1609 --> n1612
n1614["BE"]
n1521 --> n1614
n1618["VS"]
n1521 --> n1618
n1620["VD: { results }"]
n1618 --> n1620
n1625["CE: c.env.JOBSDB.prepare(sql).bind(...params).all"]
n1620 --> n1625
n1627["CE: c.env.JOBSDB.prepare(sql).bind"]
n1625 --> n1627
n1629["VS"]
n1521 --> n1629
n1631["VD: formattedResults"]
n1629 --> n1631
n1633["CE: results.map"]
n1631 --> n1633
n1637["AF"]
n1633 --> n1637
n1638["RS"]
n1521 --> n1638
n1639["CE: c.json"]
n1638 --> n1639
n1654["VS"]
n0 --> n1654
n1656["VD: processJobsRoute"]
n1654 --> n1656
n1658["CE: createRoute"]
n1656 --> n1658
n1686["CE: z.object"]
n1658 --> n1686
n1693["CE: z.string().optional"]
n1686 --> n1693
n1695["CE: z.string"]
n1693 --> n1695
n1699["CE: z.string().optional"]
n1686 --> n1699
n1701["CE: z.string"]
n1699 --> n1701
n1722["CE: app.openapi"]
n0 --> n1722
n1727["AF"]
n1722 --> n1727
n1733["VS"]
n1727 --> n1733
n1735["VD: { client_id, batch_id }"]
n1733 --> n1735
n1741["CE: c.req.valid"]
n1735 --> n1741
n1748["VS"]
n1727 --> n1748
n1750["VD: db"]
n1748 --> n1750
n1757["VS"]
n1727 --> n1757
n1759["VD: now"]
n1757 --> n1759
n1761["CE: Date.now"]
n1759 --> n1761
n1765["VS"]
n1727 --> n1765
n1767["VD: sql"]
n1765 --> n1767
n1770["VS"]
n1727 --> n1770
n1772["VD: params"]
n1770 --> n1772
n1778["IS"]
n1727 --> n1778
n1782["BE"]
n1778 --> n1782
n1787["CE: params.push"]
n1778 --> n1787
n1792["IS"]
n1727 --> n1792
n1796["BE"]
n1792 --> n1796
n1801["CE: params.push"]
n1792 --> n1801
n1806["VS"]
n1727 --> n1806
n1808["VD: { results }"]
n1806 --> n1808
n1813["CE: db.prepare(sql).bind(...params).all"]
n1808 --> n1813
n1815["CE: db.prepare(sql).bind"]
n1813 --> n1815
n1817["IS"]
n1727 --> n1817
n1818["BE"]
n1817 --> n1818
n1822["BE"]
n1818 --> n1822
n1829["RS"]
n1817 --> n1829
n1830["CE: c.json"]
n1829 --> n1830
n1838["VS"]
n1727 --> n1838
n1840["VD: processingPromises"]
n1838 --> n1840
n1842["CE: results.map"]
n1840 --> n1842
n1846["AF"]
n1842 --> n1846
n1847["VS"]
n1727 --> n1847
n1849["VD: outcomes"]
n1847 --> n1849
n1852["CE: Promise.all"]
n1849 --> n1852
n1857["RS"]
n1727 --> n1857
n1858["CE: c.json"]
n1857 --> n1858
n1871["CE: app.doc"]
n0 --> n1871
n1903["CE: app.get"]
n0 --> n1903
n1908["CE: swaggerUI"]
n1903 --> n1908
style n0 fill:#5E377B,color:#fff,stroke:#B4976A
linkStyle default stroke:#c2a35d,stroke-width:1px,opacity:0.6
AF ArrowFunctionBE BinaryExpressionCE CallExpressionFD FunctionDeclarationIS IfStatementID ImportDeclarationNE NewExpressionRS ReturnStatementSF SourceFileTS TryStatementVD VariableDeclarationVS VariableStatement