-
Notifications
You must be signed in to change notification settings - Fork 0
/
client.ts
103 lines (92 loc) · 3.16 KB
/
client.ts
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
import * as api from "./api/mod.ts"
export interface EagleClientOptions {
server?: string
}
const clientDefaultOptions: Required<EagleClientOptions> = {
server: "http://localhost:41595",
}
export interface Application {
info: () => Promise<api.Application.Info>
}
export interface Folder {
list: (payload?: api.Folder.ListPayload) => Promise<api.Folder.List>
listRecent: () => Promise<api.Folder.ListRecent>
}
export interface Item {
info: (payload: api.Item.InfoPayload) => Promise<api.Item.Info>
list: (payload?: api.Item.ListPayload) => Promise<api.Item.List>
}
export class EagleClient {
readonly server: string
constructor(readonly options?: EagleClient) {
const { server } = { ...clientDefaultOptions, ...options }
this.server = server
}
application: Application = {
info: async () => {
const request = api.Application.InfoRequest
const res = await fetch(this.server + request.path)
return await this.parseRes(res)
},
}
folder: Folder = {
list: async (payload) => {
const request = api.Folder.ListRequest
const url = new URL(this.server + request.path)
if (payload?.id) {
url.searchParams.set("id", payload.id)
}
const res = await fetch(url)
return await this.parseRes(res)
},
listRecent: async () => {
const request = api.Folder.ListRecentRequest
const url = new URL(this.server + request.path)
const res = await fetch(url)
return await this.parseRes(res)
},
}
item: Item = {
info: async (payload) => {
const request = api.Item.InfoRequest
const url = new URL(this.server + request.path)
url.searchParams.set("id", payload.id)
const res = await fetch(url)
return await this.parseRes(res)
},
list: async (payload) => {
const request = api.Item.ListRequest
const url = new URL(this.server + request.path)
if (payload) {
Object.entries(payload).forEach(([key, value]) => {
switch (key) {
case "tags":
case "folders": {
url.searchParams.set(key, value.join(","))
break
}
default: {
url.searchParams.set(key, value)
break
}
}
})
}
const res = await fetch(url)
return await this.parseRes(res)
},
}
private parseRes = async <T>(res: Response) => {
try {
const payload = await res.json()
if (payload.status === "error") {
const error = payload as api.EagleErrorRes
throw new Error(`Error code ${error.code}: ${error.message}`)
} else {
return payload.data as T
}
} catch (error) {
throw new Error("Error: " + error)
}
}
}