-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsweetness.js
116 lines (100 loc) · 3.87 KB
/
sweetness.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
/*!
* Sugar v0.1.0 - Rapid web UI prototyping with no server
* https://github.com/calogxro/sugar
* Copyright (C) 2021 Calogero Miraglia <[email protected]>
* Licensed under GNU General Public License v3.0
* See file https://github.com/calogxro/sugar/LICENSE
*/
// Service worker
//console.log("service worker")
self.importScripts("localforage.min.js")
self.oninstall = function(event) {
//console.log("oninstall")
event.waitUntil(self.skipWaiting()) // Activate worker immediately
}
self.onactivate = function(event) {
//console.log("onactivate")
event.waitUntil(self.clients.claim()) // Become available to all pages
}
self.onfetch = function(event) {
var req = event.request
var regexCollection = new RegExp(`\/api\/[a-z]+\/?$`)
var regexSingleton = new RegExp(`\/api\/[a-z]+\/[0-9]+\/?$`)
var regexId = new RegExp(`[0-9]+$`)
var collectionReq = regexCollection.test(req.url)
var singletonReq = regexSingleton.test(req.url)
if (!collectionReq && !singletonReq) {
// It's not a call to api/{resource}
fetch(req)
return
}
var resourceName = ""
var urlParts = req.url.split('/')
if (collectionReq) {
resourceName = urlParts[urlParts.length-1]
} else if (singletonReq) {
resourceName = urlParts[urlParts.length-2]
}
event.respondWith(async function() {
var nextId = 1
var collection = await localforage.getItem(resourceName)
if (! collection) {
collection = new Map()
} else {
for (const [id, resource] of collection) {
if (id >= nextId) {
nextId = id + 1
}
}
}
if (collectionReq) {
switch(req.method) {
case 'GET':
//console.log(collection)
var json = JSON.stringify([...collection.values()])
return new Response(json, {
headers: { 'Content-Type': 'application/json' }
})
case 'POST':
var resource = await req.json()
//console.log(resource)
resource.id = nextId++
collection.set(resource.id, resource)
await localforage.setItem(resourceName, collection)
return new Response(JSON.stringify(resource), {
status: 201
})
}
} else if (singletonReq) {
var found = req.url.match(regexId)
var id = parseInt(found[0])
if (! collection.has(id)) {
return new Response({ status: 404 })
}
switch(req.method) {
case 'GET':
var resource = collection.get(id)
var json = JSON.stringify(resource)
return new Response(json, {
headers: { 'Content-Type': 'application/json' }
})
case 'DELETE':
collection.delete(id)
await localforage.setItem(resourceName, collection)
return new Response({ status: 204 })
case 'PUT':
var resource = await req.json()
collection.set(id, resource)
await localforage.setItem(resourceName, collection)
return new Response({ status: 204 })
case 'PATCH':
var resource = await req.json()
let targetResource = collection.get(id)
targetResource = Object.assign(targetResource, resource)
collection.set(id, targetResource)
await localforage.setItem(resourceName, collection)
return new Response({ status: 204 })
}
}
}())
}