@f3liz/rescript-misskey-api 0.6.8 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/es6/src/Misskey.mjs +133 -156
- package/lib/es6/src/bindings/Ofetch.mjs +2 -0
- package/lib/es6/src/generated/kokonect-link/api/KokonectLinkAccount.mjs +70 -48
- package/lib/es6/src/generated/kokonect-link/api/KokonectLinkAdmin.mjs +133 -98
- package/lib/es6/src/generated/kokonect-link/api/KokonectLinkAntennas.mjs +9 -6
- package/lib/es6/src/generated/kokonect-link/api/KokonectLinkApp.mjs +6 -4
- package/lib/es6/src/generated/kokonect-link/api/KokonectLinkAuth.mjs +6 -4
- package/lib/es6/src/generated/kokonect-link/api/KokonectLinkChannels.mjs +18 -12
- package/lib/es6/src/generated/kokonect-link/api/KokonectLinkCharts.mjs +6 -4
- package/lib/es6/src/generated/kokonect-link/api/KokonectLinkChat.mjs +70 -54
- package/lib/es6/src/generated/kokonect-link/api/KokonectLinkClips.mjs +12 -8
- package/lib/es6/src/generated/kokonect-link/api/KokonectLinkDefault.mjs +27 -20
- package/lib/es6/src/generated/kokonect-link/api/KokonectLinkDrive.mjs +35 -24
- package/lib/es6/src/generated/kokonect-link/api/KokonectLinkFederation.mjs +18 -12
- package/lib/es6/src/generated/kokonect-link/api/KokonectLinkFlash.mjs +9 -6
- package/lib/es6/src/generated/kokonect-link/api/KokonectLinkFlashs.mjs +3 -2
- package/lib/es6/src/generated/kokonect-link/api/KokonectLinkFollowing.mjs +21 -14
- package/lib/es6/src/generated/kokonect-link/api/KokonectLinkGallery.mjs +12 -8
- package/lib/es6/src/generated/kokonect-link/api/KokonectLinkGroups.mjs +30 -24
- package/lib/es6/src/generated/kokonect-link/api/KokonectLinkHashtags.mjs +6 -4
- package/lib/es6/src/generated/kokonect-link/api/KokonectLinkLists.mjs +9 -6
- package/lib/es6/src/generated/kokonect-link/api/KokonectLinkMeta.mjs +27 -18
- package/lib/es6/src/generated/kokonect-link/api/KokonectLinkNotes.mjs +85 -58
- package/lib/es6/src/generated/kokonect-link/api/KokonectLinkNotifications.mjs +2 -2
- package/lib/es6/src/generated/kokonect-link/api/KokonectLinkPages.mjs +8 -6
- package/lib/es6/src/generated/kokonect-link/api/KokonectLinkRole.mjs +9 -6
- package/lib/es6/src/generated/kokonect-link/api/KokonectLinkUsers.mjs +35 -24
- package/lib/es6/src/generated/kokonect-link/api/KokonectLinkWebhooks.mjs +7 -6
- package/lib/es6/src/generated/misskey-io/api/MisskeyIoAccount.mjs +92 -68
- package/lib/es6/src/generated/misskey-io/api/MisskeyIoAdmin.mjs +266 -214
- package/lib/es6/src/generated/misskey-io/api/MisskeyIoAntennas.mjs +17 -12
- package/lib/es6/src/generated/misskey-io/api/MisskeyIoApp.mjs +6 -4
- package/lib/es6/src/generated/misskey-io/api/MisskeyIoAuth.mjs +14 -10
- package/lib/es6/src/generated/misskey-io/api/MisskeyIoChannels.mjs +35 -26
- package/lib/es6/src/generated/misskey-io/api/MisskeyIoCharts.mjs +72 -48
- package/lib/es6/src/generated/misskey-io/api/MisskeyIoClip.mjs +4 -4
- package/lib/es6/src/generated/misskey-io/api/MisskeyIoClips.mjs +17 -12
- package/lib/es6/src/generated/misskey-io/api/MisskeyIoDefault.mjs +133 -110
- package/lib/es6/src/generated/misskey-io/api/MisskeyIoDrive.mjs +51 -36
- package/lib/es6/src/generated/misskey-io/api/MisskeyIoFederation.mjs +32 -22
- package/lib/es6/src/generated/misskey-io/api/MisskeyIoFlash.mjs +12 -10
- package/lib/es6/src/generated/misskey-io/api/MisskeyIoFlashs.mjs +5 -4
- package/lib/es6/src/generated/misskey-io/api/MisskeyIoFollowing.mjs +27 -20
- package/lib/es6/src/generated/misskey-io/api/MisskeyIoGallery.mjs +24 -18
- package/lib/es6/src/generated/misskey-io/api/MisskeyIoHashtags.mjs +18 -12
- package/lib/es6/src/generated/misskey-io/api/MisskeyIoLists.mjs +23 -18
- package/lib/es6/src/generated/misskey-io/api/MisskeyIoMeta.mjs +71 -48
- package/lib/es6/src/generated/misskey-io/api/MisskeyIoNonProductive.mjs +5 -4
- package/lib/es6/src/generated/misskey-io/api/MisskeyIoNotes.mjs +96 -70
- package/lib/es6/src/generated/misskey-io/api/MisskeyIoNotifications.mjs +8 -8
- package/lib/es6/src/generated/misskey-io/api/MisskeyIoPages.mjs +17 -14
- package/lib/es6/src/generated/misskey-io/api/MisskeyIoReactions.mjs +4 -4
- package/lib/es6/src/generated/misskey-io/api/MisskeyIoResetPassword.mjs +4 -4
- package/lib/es6/src/generated/misskey-io/api/MisskeyIoRole.mjs +12 -8
- package/lib/es6/src/generated/misskey-io/api/MisskeyIoUsers.mjs +83 -56
- package/lib/es6/src/generated/misskey-io/api/MisskeyIoWebhooks.mjs +17 -14
- package/package.json +3 -2
- package/src/Misskey.res +92 -149
- package/src/bindings/Ofetch.res +14 -0
- package/src/generated/kokonect-link/api/KokonectLinkAccount.res +241 -313
- package/src/generated/kokonect-link/api/KokonectLinkAdmin.res +485 -632
- package/src/generated/kokonect-link/api/KokonectLinkAntennas.res +30 -39
- package/src/generated/kokonect-link/api/KokonectLinkApp.res +20 -26
- package/src/generated/kokonect-link/api/KokonectLinkAuth.res +20 -26
- package/src/generated/kokonect-link/api/KokonectLinkChannels.res +60 -78
- package/src/generated/kokonect-link/api/KokonectLinkCharts.res +20 -26
- package/src/generated/kokonect-link/api/KokonectLinkChat.res +260 -341
- package/src/generated/kokonect-link/api/KokonectLinkClips.res +40 -52
- package/src/generated/kokonect-link/api/KokonectLinkDefault.res +101 -131
- package/src/generated/kokonect-link/api/KokonectLinkDrive.res +119 -155
- package/src/generated/kokonect-link/api/KokonectLinkFederation.res +60 -78
- package/src/generated/kokonect-link/api/KokonectLinkFlash.res +31 -40
- package/src/generated/kokonect-link/api/KokonectLinkFlashs.res +10 -13
- package/src/generated/kokonect-link/api/KokonectLinkFollowing.res +70 -91
- package/src/generated/kokonect-link/api/KokonectLinkGallery.res +40 -52
- package/src/generated/kokonect-link/api/KokonectLinkGroups.res +116 -152
- package/src/generated/kokonect-link/api/KokonectLinkHashtags.res +20 -26
- package/src/generated/kokonect-link/api/KokonectLinkLists.res +30 -39
- package/src/generated/kokonect-link/api/KokonectLinkMeta.res +94 -121
- package/src/generated/kokonect-link/api/KokonectLinkNotes.res +289 -376
- package/src/generated/kokonect-link/api/KokonectLinkNotifications.res +9 -12
- package/src/generated/kokonect-link/api/KokonectLinkPages.res +29 -38
- package/src/generated/kokonect-link/api/KokonectLinkRole.res +30 -39
- package/src/generated/kokonect-link/api/KokonectLinkUsers.res +119 -155
- package/src/generated/kokonect-link/api/KokonectLinkWebhooks.res +30 -39
- package/src/generated/kokonect-link/types/Account.d.ts +235 -177
- package/src/generated/kokonect-link/types/Admin.d.ts +640 -484
- package/src/generated/kokonect-link/types/Antennas.d.ts +36 -27
- package/src/generated/kokonect-link/types/App.d.ts +16 -12
- package/src/generated/kokonect-link/types/Auth.d.ts +30 -23
- package/src/generated/kokonect-link/types/Channels.d.ts +76 -57
- package/src/generated/kokonect-link/types/Charts.d.ts +104 -78
- package/src/generated/kokonect-link/types/Chat.d.ts +108 -81
- package/src/generated/kokonect-link/types/Clip.d.ts +8 -6
- package/src/generated/kokonect-link/types/Clips.d.ts +40 -30
- package/src/generated/kokonect-link/types/Default.d.ts +297 -232
- package/src/generated/kokonect-link/types/Drive.d.ts +120 -90
- package/src/generated/kokonect-link/types/Federation.d.ts +68 -51
- package/src/generated/kokonect-link/types/Flash.d.ts +33 -25
- package/src/generated/kokonect-link/types/Flashs.d.ts +12 -9
- package/src/generated/kokonect-link/types/Following.d.ts +68 -51
- package/src/generated/kokonect-link/types/Gallery.d.ts +52 -39
- package/src/generated/kokonect-link/types/Groups.d.ts +48 -36
- package/src/generated/kokonect-link/types/Hashtags.d.ts +32 -24
- package/src/generated/kokonect-link/types/Lists.d.ts +48 -36
- package/src/generated/kokonect-link/types/Meta.d.ts +133 -100
- package/src/generated/kokonect-link/types/NonProductive.d.ts +8 -6
- package/src/generated/kokonect-link/types/Notes.d.ts +256 -192
- package/src/generated/kokonect-link/types/Notifications.d.ts +20 -15
- package/src/generated/kokonect-link/types/Pages.d.ts +40 -30
- package/src/generated/kokonect-link/types/Reactions.d.ts +8 -6
- package/src/generated/kokonect-link/types/ResetPassword.d.ts +8 -6
- package/src/generated/kokonect-link/types/Role.d.ts +28 -21
- package/src/generated/kokonect-link/types/Users.d.ts +161 -121
- package/src/generated/kokonect-link/types/Webhooks.d.ts +44 -34
- package/src/generated/kokonect-link/types/index.d.ts +1 -2
- package/src/generated/kokonect-link/wrapper/index.d.ts +4813 -2131
- package/src/generated/kokonect-link/wrapper/index.mjs +2 -710
- package/src/generated/misskey-io/api/MisskeyIoAccount.res +335 -437
- package/src/generated/misskey-io/api/MisskeyIoAdmin.res +1035 -1356
- package/src/generated/misskey-io/api/MisskeyIoAntennas.res +60 -78
- package/src/generated/misskey-io/api/MisskeyIoApp.res +20 -26
- package/src/generated/misskey-io/api/MisskeyIoAuth.res +51 -66
- package/src/generated/misskey-io/api/MisskeyIoChannels.res +129 -168
- package/src/generated/misskey-io/api/MisskeyIoCharts.res +240 -312
- package/src/generated/misskey-io/api/MisskeyIoClip.res +18 -24
- package/src/generated/misskey-io/api/MisskeyIoClips.res +60 -78
- package/src/generated/misskey-io/api/MisskeyIoDefault.res +561 -726
- package/src/generated/misskey-io/api/MisskeyIoDrive.res +178 -232
- package/src/generated/misskey-io/api/MisskeyIoFederation.res +109 -142
- package/src/generated/misskey-io/api/MisskeyIoFlash.res +47 -62
- package/src/generated/misskey-io/api/MisskeyIoFlashs.res +19 -25
- package/src/generated/misskey-io/api/MisskeyIoFollowing.res +97 -127
- package/src/generated/misskey-io/api/MisskeyIoGallery.res +88 -115
- package/src/generated/misskey-io/api/MisskeyIoHashtags.res +62 -80
- package/src/generated/misskey-io/api/MisskeyIoLists.res +86 -113
- package/src/generated/misskey-io/api/MisskeyIoMeta.res +251 -323
- package/src/generated/misskey-io/api/MisskeyIoNonProductive.res +19 -25
- package/src/generated/misskey-io/api/MisskeyIoNotes.res +341 -446
- package/src/generated/misskey-io/api/MisskeyIoNotifications.res +39 -51
- package/src/generated/misskey-io/api/MisskeyIoPages.res +67 -88
- package/src/generated/misskey-io/api/MisskeyIoReactions.res +18 -24
- package/src/generated/misskey-io/api/MisskeyIoResetPassword.res +18 -24
- package/src/generated/misskey-io/api/MisskeyIoRole.res +41 -53
- package/src/generated/misskey-io/api/MisskeyIoUsers.res +284 -368
- package/src/generated/misskey-io/api/MisskeyIoWebhooks.res +69 -90
- package/src/generated/misskey-io/types/Account.d.ts +139 -105
- package/src/generated/misskey-io/types/Admin.d.ts +438 -331
- package/src/generated/misskey-io/types/Antennas.d.ts +24 -18
- package/src/generated/misskey-io/types/App.d.ts +8 -6
- package/src/generated/misskey-io/types/Auth.d.ts +22 -17
- package/src/generated/misskey-io/types/Channels.d.ts +52 -39
- package/src/generated/misskey-io/types/Charts.d.ts +96 -72
- package/src/generated/misskey-io/types/Clip.d.ts +8 -6
- package/src/generated/misskey-io/types/Clips.d.ts +24 -18
- package/src/generated/misskey-io/types/Default.d.ts +253 -198
- package/src/generated/misskey-io/types/Drive.d.ts +72 -54
- package/src/generated/misskey-io/types/Federation.d.ts +44 -33
- package/src/generated/misskey-io/types/Flash.d.ts +20 -15
- package/src/generated/misskey-io/types/Flashs.d.ts +8 -6
- package/src/generated/misskey-io/types/Following.d.ts +40 -30
- package/src/generated/misskey-io/types/Gallery.d.ts +36 -27
- package/src/generated/misskey-io/types/Hashtags.d.ts +24 -18
- package/src/generated/misskey-io/types/Lists.d.ts +36 -27
- package/src/generated/misskey-io/types/Meta.d.ts +97 -73
- package/src/generated/misskey-io/types/NonProductive.d.ts +8 -6
- package/src/generated/misskey-io/types/Notes.d.ts +140 -105
- package/src/generated/misskey-io/types/Notifications.d.ts +16 -12
- package/src/generated/misskey-io/types/Pages.d.ts +28 -21
- package/src/generated/misskey-io/types/Reactions.d.ts +8 -6
- package/src/generated/misskey-io/types/ResetPassword.d.ts +8 -6
- package/src/generated/misskey-io/types/Role.d.ts +16 -12
- package/src/generated/misskey-io/types/Users.d.ts +113 -85
- package/src/generated/misskey-io/types/Webhooks.d.ts +30 -23
- package/src/generated/misskey-io/types/index.d.ts +1 -2
- package/src/generated/misskey-io/wrapper/index.d.ts +3127 -1399
- package/src/generated/misskey-io/wrapper/index.mjs +2 -469
package/src/Misskey.res
CHANGED
|
@@ -18,30 +18,9 @@
|
|
|
18
18
|
// You can override it by passing ~fetch to connect() for custom behavior
|
|
19
19
|
// (e.g., adding performance metrics, retries, logging, etc.).
|
|
20
20
|
|
|
21
|
-
// ============================================================================
|
|
22
|
-
// Fetch Bindings
|
|
23
|
-
// ============================================================================
|
|
24
|
-
|
|
25
21
|
// Enable JSON schema for Sury
|
|
26
22
|
S.enableJson()
|
|
27
23
|
|
|
28
|
-
module FetchBindings = {
|
|
29
|
-
type response
|
|
30
|
-
|
|
31
|
-
type requestInit = {
|
|
32
|
-
method: string,
|
|
33
|
-
headers: dict<string>,
|
|
34
|
-
body: option<string>,
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
@val external fetch: (string, requestInit) => promise<response> = "fetch"
|
|
38
|
-
|
|
39
|
-
@send external json: response => promise<JSON.t> = "json"
|
|
40
|
-
@get external ok: response => bool = "ok"
|
|
41
|
-
@get external status: response => int = "status"
|
|
42
|
-
@get external statusText: response => string = "statusText"
|
|
43
|
-
}
|
|
44
|
-
|
|
45
24
|
// ============================================================================
|
|
46
25
|
// Client & Configuration
|
|
47
26
|
// ============================================================================
|
|
@@ -56,50 +35,34 @@ type t = {
|
|
|
56
35
|
mutable streamClient: option<StreamClient.t>,
|
|
57
36
|
}
|
|
58
37
|
|
|
59
|
-
//
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
// Misskey injects the token into the request body
|
|
67
|
-
let bodyWithToken = switch (body, token) {
|
|
68
|
-
| (Some(jsonBody), Some(t)) =>
|
|
69
|
-
switch jsonBody->JSON.Decode.object {
|
|
70
|
-
| Some(obj) =>
|
|
71
|
-
obj->Dict.set("i", t->JSON.Encode.string)
|
|
72
|
-
Some(obj->JSON.Encode.object)
|
|
73
|
-
| None => body
|
|
74
|
-
}
|
|
75
|
-
| (None, Some(t)) =>
|
|
76
|
-
let obj = Dict.make()
|
|
38
|
+
// Inject auth token into request body (Misskey API convention)
|
|
39
|
+
let injectToken = (body: option<JSON.t>, token: option<string>): option<JSON.t> => {
|
|
40
|
+
switch (body, token) {
|
|
41
|
+
| (Some(jsonBody), Some(t)) =>
|
|
42
|
+
switch jsonBody->JSON.Decode.object {
|
|
43
|
+
| Some(obj) =>
|
|
77
44
|
obj->Dict.set("i", t->JSON.Encode.string)
|
|
78
45
|
Some(obj->JSON.Encode.object)
|
|
79
|
-
|
|
|
46
|
+
| None => body
|
|
80
47
|
}
|
|
48
|
+
| (None, Some(t)) =>
|
|
49
|
+
let obj = Dict.make()
|
|
50
|
+
obj->Dict.set("i", t->JSON.Encode.string)
|
|
51
|
+
Some(obj->JSON.Encode.object)
|
|
52
|
+
| _ => body
|
|
53
|
+
}
|
|
54
|
+
}
|
|
81
55
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
body: bodyStr,
|
|
93
|
-
},
|
|
94
|
-
)->Promise.then(response => {
|
|
95
|
-
if FetchBindings.ok(response) {
|
|
96
|
-
response->FetchBindings.json
|
|
97
|
-
} else {
|
|
98
|
-
let msg = `API error: ${FetchBindings.status(
|
|
99
|
-
response,
|
|
100
|
-
)->Int.toString} ${FetchBindings.statusText(response)}`
|
|
101
|
-
Promise.reject(JsExn(JsError.make(msg)->Obj.magic))
|
|
102
|
-
}
|
|
56
|
+
// Default fetch implementation using ofetch.
|
|
57
|
+
// Uses baseURL for origin, auto JSON parsing, and token injection.
|
|
58
|
+
let defaultFetch = (~origin: string, ~token: option<string>) => {
|
|
59
|
+
(~url: string, ~method_: string, ~body: option<JSON.t>): Promise.t<JSON.t> => {
|
|
60
|
+
let bodyWithToken = injectToken(body, token)
|
|
61
|
+
Ofetch.ofetch(url, {
|
|
62
|
+
baseURL: `${origin}/api`,
|
|
63
|
+
method: method_,
|
|
64
|
+
body: ?bodyWithToken,
|
|
65
|
+
retry: 0,
|
|
103
66
|
})
|
|
104
67
|
}
|
|
105
68
|
}
|
|
@@ -143,21 +106,23 @@ let wrapperConnect = (client: t): MisskeyIoWrapper.client => {
|
|
|
143
106
|
///
|
|
144
107
|
/// Example:
|
|
145
108
|
/// let user = await client->Misskey.request("i", ())
|
|
146
|
-
let request = (
|
|
109
|
+
let request = async (
|
|
147
110
|
client: t,
|
|
148
111
|
endpoint: string,
|
|
149
112
|
~params: JSON.t=JSON.Encode.object(Dict.make()),
|
|
150
113
|
(),
|
|
151
|
-
):
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
114
|
+
): result<JSON.t, string> => {
|
|
115
|
+
try {
|
|
116
|
+
let json = await client.fetchFn(~url=endpoint, ~method_="POST", ~body=Some(params))
|
|
117
|
+
Ok(json)
|
|
118
|
+
} catch {
|
|
119
|
+
| err =>
|
|
155
120
|
let msg = switch err->JsExn.fromException {
|
|
156
121
|
| Some(jsExn) => JsExn.message(jsExn)->Option.getOr("Unknown error")
|
|
157
122
|
| None => "Unknown error"
|
|
158
123
|
}
|
|
159
|
-
Error(msg)
|
|
160
|
-
}
|
|
124
|
+
Error(msg)
|
|
125
|
+
}
|
|
161
126
|
}
|
|
162
127
|
|
|
163
128
|
/// Get current user info.
|
|
@@ -413,21 +378,20 @@ module Emojis = {
|
|
|
413
378
|
}
|
|
414
379
|
|
|
415
380
|
/// Get list of custom emojis from instance.
|
|
416
|
-
let list = (client: t):
|
|
417
|
-
request(client, "emojis", ())
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
| None => Ok([])
|
|
425
|
-
}
|
|
381
|
+
let list = async (client: t): result<array<customEmoji>, string> => {
|
|
382
|
+
let result = await request(client, "emojis", ())
|
|
383
|
+
switch result {
|
|
384
|
+
| Ok(json) =>
|
|
385
|
+
switch json->JSON.Decode.object {
|
|
386
|
+
| Some(obj) =>
|
|
387
|
+
switch obj->Dict.get("emojis")->Option.flatMap(JSON.Decode.array) {
|
|
388
|
+
| Some(emojisArray) => Ok(emojisArray->Array.filterMap(decodeCustomEmoji))
|
|
426
389
|
| None => Ok([])
|
|
427
390
|
}
|
|
428
|
-
|
|
|
429
|
-
}
|
|
430
|
-
|
|
391
|
+
| None => Ok([])
|
|
392
|
+
}
|
|
393
|
+
| Error(e) => Error(e)
|
|
394
|
+
}
|
|
431
395
|
}
|
|
432
396
|
}
|
|
433
397
|
|
|
@@ -437,45 +401,42 @@ module Emojis = {
|
|
|
437
401
|
|
|
438
402
|
module CustomTimelines = {
|
|
439
403
|
/// Fetch user's antennas.
|
|
440
|
-
let antennas = (client: t):
|
|
441
|
-
request(client, "antennas/list", ())
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
})
|
|
404
|
+
let antennas = async (client: t): result<array<JSON.t>, string> => {
|
|
405
|
+
let result = await request(client, "antennas/list", ())
|
|
406
|
+
switch result {
|
|
407
|
+
| Ok(json) =>
|
|
408
|
+
switch json->JSON.Decode.array {
|
|
409
|
+
| Some(arr) => Ok(arr)
|
|
410
|
+
| None => Ok([])
|
|
411
|
+
}
|
|
412
|
+
| Error(e) => Error(e)
|
|
413
|
+
}
|
|
451
414
|
}
|
|
452
415
|
|
|
453
416
|
/// Fetch user's lists.
|
|
454
|
-
let lists = (client: t):
|
|
455
|
-
request(client, "users/lists/list", ())
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
})
|
|
417
|
+
let lists = async (client: t): result<array<JSON.t>, string> => {
|
|
418
|
+
let result = await request(client, "users/lists/list", ())
|
|
419
|
+
switch result {
|
|
420
|
+
| Ok(json) =>
|
|
421
|
+
switch json->JSON.Decode.array {
|
|
422
|
+
| Some(arr) => Ok(arr)
|
|
423
|
+
| None => Ok([])
|
|
424
|
+
}
|
|
425
|
+
| Error(e) => Error(e)
|
|
426
|
+
}
|
|
465
427
|
}
|
|
466
428
|
|
|
467
429
|
/// Fetch user's followed channels.
|
|
468
|
-
let channels = (client: t):
|
|
469
|
-
request(client, "channels/followed", ())
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
})
|
|
430
|
+
let channels = async (client: t): result<array<JSON.t>, string> => {
|
|
431
|
+
let result = await request(client, "channels/followed", ())
|
|
432
|
+
switch result {
|
|
433
|
+
| Ok(json) =>
|
|
434
|
+
switch json->JSON.Decode.array {
|
|
435
|
+
| Some(arr) => Ok(arr)
|
|
436
|
+
| None => Ok([])
|
|
437
|
+
}
|
|
438
|
+
| Error(e) => Error(e)
|
|
439
|
+
}
|
|
479
440
|
}
|
|
480
441
|
|
|
481
442
|
/// Extract ID and name from a timeline item JSON.
|
|
@@ -589,15 +550,10 @@ module MiAuth = {
|
|
|
589
550
|
}
|
|
590
551
|
|
|
591
552
|
@val external encodeURIComponent: string => string = "encodeURIComponent"
|
|
553
|
+
@val @scope("crypto") external randomUUID: unit => string = "randomUUID"
|
|
592
554
|
|
|
593
555
|
let generateSessionId = (): string => {
|
|
594
|
-
|
|
595
|
-
function() {
|
|
596
|
-
var a = new Uint8Array(16);
|
|
597
|
-
crypto.getRandomValues(a);
|
|
598
|
-
return Array.from(a, function(b) { return b.toString(16).padStart(2, '0'); }).join('');
|
|
599
|
-
}()
|
|
600
|
-
`)
|
|
556
|
+
randomUUID()->String.replaceAll("-", "")
|
|
601
557
|
}
|
|
602
558
|
|
|
603
559
|
/// Generate MiAuth URL for user authorization.
|
|
@@ -637,35 +593,22 @@ module MiAuth = {
|
|
|
637
593
|
/// authorization is complete, and `{ok: false}` when still pending.
|
|
638
594
|
let check = async (~origin: string, ~sessionId: string): result<checkResult, string> => {
|
|
639
595
|
try {
|
|
640
|
-
let
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
let json = await response->FetchBindings.json
|
|
655
|
-
switch json->JSON.Decode.object {
|
|
656
|
-
| Some(obj) =>
|
|
657
|
-
// Check the "ok" field in the response body
|
|
658
|
-
let isOk = obj->Dict.get("ok")->Option.flatMap(JSON.Decode.bool)->Option.getOr(false)
|
|
659
|
-
if isOk {
|
|
660
|
-
let token = obj->Dict.get("token")->Option.flatMap(JSON.Decode.string)
|
|
661
|
-
let user = obj->Dict.get("user")
|
|
662
|
-
Ok({token, user})
|
|
663
|
-
} else {
|
|
664
|
-
// Server explicitly says not authorized yet
|
|
665
|
-
Ok({token: None, user: None})
|
|
666
|
-
}
|
|
667
|
-
| None => Error("Unexpected response format")
|
|
596
|
+
let json = await Ofetch.ofetch(`${origin}/api/miauth/${sessionId}/check`, {
|
|
597
|
+
method: "POST",
|
|
598
|
+
body: JSON.Encode.object(Dict.make()),
|
|
599
|
+
retry: 0,
|
|
600
|
+
})
|
|
601
|
+
switch json->JSON.Decode.object {
|
|
602
|
+
| Some(obj) =>
|
|
603
|
+
let isOk = obj->Dict.get("ok")->Option.flatMap(JSON.Decode.bool)->Option.getOr(false)
|
|
604
|
+
if isOk {
|
|
605
|
+
let token = obj->Dict.get("token")->Option.flatMap(JSON.Decode.string)
|
|
606
|
+
let user = obj->Dict.get("user")
|
|
607
|
+
Ok({token, user})
|
|
608
|
+
} else {
|
|
609
|
+
Ok({token: None, user: None})
|
|
668
610
|
}
|
|
611
|
+
| None => Error("Unexpected response format")
|
|
669
612
|
}
|
|
670
613
|
} catch {
|
|
671
614
|
| err =>
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// Ofetch.res - ReScript bindings for ofetch
|
|
2
|
+
// Auto JSON parsing, error handling, baseURL, retries, timeouts
|
|
3
|
+
|
|
4
|
+
type fetchOptions = {
|
|
5
|
+
baseURL?: string,
|
|
6
|
+
method?: string,
|
|
7
|
+
body?: JSON.t,
|
|
8
|
+
headers?: dict<string>,
|
|
9
|
+
retry?: int,
|
|
10
|
+
retryDelay?: int,
|
|
11
|
+
timeout?: int,
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
@module("ofetch") external ofetch: (string, fetchOptions) => promise<JSON.t> = "ofetch"
|