tangled
alpha
login
or
join now
finxol.io
/
hooks
0
fork
atom
Simple API gateway for webhooks
0
fork
atom
overview
issues
pulls
pipelines
save data to deno kv
finxol.io
6 months ago
1b6bfad6
d71ba0ab
verified
This commit was signed with the committer's
known signature
.
finxol.io
SSH Key Fingerprint:
SHA256:olFE3asYdoBMScuJOt60UxXdJ0RFdGv5kVKrdOtIcPI=
1/1
deploy.yaml
success
15s
+104
-11
3 changed files
expand all
collapse all
unified
split
deno.json
deno.lock
src
sensors.ts
+2
-1
deno.json
···
1
1
{
2
2
"imports": {
3
3
"@hono/ua-blocker": "npm:@hono/ua-blocker@^0.1.9",
4
4
-
"hono": "npm:hono@^4.9.6"
4
4
+
"hono": "npm:hono@^4.9.6",
5
5
+
"zod": "npm:zod@^4.1.5"
5
6
},
6
7
"tasks": {
7
8
"start": "deno run --allow-net src/main.ts"
+7
-2
deno.lock
···
3
3
"specifiers": {
4
4
"npm:@hono/ua-blocker@~0.1.9": "0.1.9_hono@4.9.6",
5
5
"npm:@types/node@*": "24.2.0",
6
6
-
"npm:hono@^4.9.6": "4.9.6"
6
6
+
"npm:hono@^4.9.6": "4.9.6",
7
7
+
"npm:zod@^4.1.5": "4.1.5"
7
8
},
8
9
"npm": {
9
10
"@hono/ua-blocker@0.1.9_hono@4.9.6": {
···
23
24
},
24
25
"undici-types@7.10.0": {
25
26
"integrity": "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag=="
27
27
+
},
28
28
+
"zod@4.1.5": {
29
29
+
"integrity": "sha512-rcUUZqlLJgBC33IT3PNMgsCq6TzLQEG/Ei/KTCU0PedSWRMAXoOUN+4t/0H+Q8bdnLPdqUYnvboJT0bn/229qg=="
26
30
}
27
31
},
28
32
"workspace": {
29
33
"dependencies": [
30
34
"npm:@hono/ua-blocker@~0.1.9",
31
31
-
"npm:hono@^4.9.6"
35
35
+
"npm:hono@^4.9.6",
36
36
+
"npm:zod@^4.1.5"
32
37
]
33
38
}
34
39
}
+95
-8
src/sensors.ts
···
1
1
import { Hono } from "hono"
2
2
+
import { validator } from "hono/validator"
3
3
+
import { z } from "zod"
2
4
3
3
-
const sensors = new Hono().get("/get", (c) => c.text("Hello World!")).post(
4
4
-
"/set",
5
5
-
async (c) => {
6
6
-
const body = await c.req.text()
7
7
-
console.log(body)
8
8
-
return c.text(`Received: ${body}`)
9
9
-
},
10
10
-
)
5
5
+
const SensorsSchema = z.object({
6
6
+
sensorData: z.array(
7
7
+
z.discriminatedUnion("sensorType", [
8
8
+
z.object({
9
9
+
timestamp: z.string(),
10
10
+
sensorType: z.literal("location"),
11
11
+
data: z.object({
12
12
+
altitude: z.number(),
13
13
+
speed: z.number(),
14
14
+
horizontalAccuracy: z.number(),
15
15
+
verticalAccuracy: z.number(),
16
16
+
longitude: z.number(),
17
17
+
course: z.number(),
18
18
+
floor: z.number().nullable(),
19
19
+
latitude: z.number(),
20
20
+
}),
21
21
+
}),
22
22
+
z.object({
23
23
+
timestamp: z.string(),
24
24
+
sensorType: z.literal("gyroscope"),
25
25
+
data: z.object({
26
26
+
x: z.number(),
27
27
+
y: z.number(),
28
28
+
z: z.number(),
29
29
+
}),
30
30
+
}),
31
31
+
z.object({
32
32
+
timestamp: z.string(),
33
33
+
sensorType: z.literal("battery"),
34
34
+
data: z.object({
35
35
+
batteryState: z.string(),
36
36
+
batteryLevel: z.number(),
37
37
+
}),
38
38
+
}),
39
39
+
z.object({
40
40
+
timestamp: z.string(),
41
41
+
sensorType: z.literal("altitude"),
42
42
+
data: z.object({
43
43
+
altitude: z.number(),
44
44
+
}),
45
45
+
}),
46
46
+
z.object({
47
47
+
timestamp: z.string(),
48
48
+
sensorType: z.literal("heading"),
49
49
+
data: z.object({
50
50
+
x: z.number(),
51
51
+
y: z.number(),
52
52
+
z: z.number(),
53
53
+
trueHeading: z.number(),
54
54
+
headingAccuracy: z.number(),
55
55
+
magneticHeading: z.number(),
56
56
+
}),
57
57
+
}),
58
58
+
]),
59
59
+
),
60
60
+
isSuccess: z.boolean(),
61
61
+
deviceId: z.string(),
62
62
+
timestamp: z.coerce.date(),
63
63
+
deviceName: z.string(),
64
64
+
})
65
65
+
66
66
+
type Sensors = z.infer<typeof SensorsSchema>
67
67
+
68
68
+
const kv = await Deno.openKv()
69
69
+
70
70
+
const sensors = new Hono()
71
71
+
.get("/get", async (c) => {
72
72
+
const data = await kv.get<Sensors>(["sensors", "latest"])
73
73
+
if (!data.value) {
74
74
+
return c.text("No data found", 404)
75
75
+
}
76
76
+
return c.json(data.value)
77
77
+
})
78
78
+
.post(
79
79
+
"/set",
80
80
+
validator("json", (value, c) => {
81
81
+
const parsed = SensorsSchema.safeParse(value)
82
82
+
if (!parsed.success) {
83
83
+
return c.text("Invalid!", 401)
84
84
+
}
85
85
+
return parsed.data
86
86
+
}),
87
87
+
async (c) => {
88
88
+
const body = c.req.valid("json")
89
89
+
console.log(`Receiving sensor data at ${body.timestamp.toISOString()}`)
90
90
+
91
91
+
// save data to kv store
92
92
+
await kv.set(["sensors", body.timestamp.toISOString()], body)
93
93
+
await kv.set(["sensors", "latest"], body)
94
94
+
95
95
+
return c.json(body)
96
96
+
},
97
97
+
)
11
98
12
99
export { sensors }