@moontaiworks/fanbox-dl 1.0.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/LICENSE +21 -0
- package/README.md +148 -0
- package/dist/bundle/index.cjs +2 -0
- package/dist/bundle/index.cjs.map +1 -0
- package/dist/bundle/index.d.cts +296 -0
- package/dist/bundle/index.d.ts +296 -0
- package/dist/bundle/index.js +2 -0
- package/dist/bundle/index.js.map +1 -0
- package/dist/cjs/client-options.d.ts +8 -0
- package/dist/cjs/client-options.d.ts.map +1 -0
- package/dist/cjs/client-options.js +3 -0
- package/dist/cjs/client-options.js.map +1 -0
- package/dist/cjs/client.d.ts +31 -0
- package/dist/cjs/client.d.ts.map +1 -0
- package/dist/cjs/client.js +107 -0
- package/dist/cjs/client.js.map +1 -0
- package/dist/cjs/downloader/asset.d.ts +30 -0
- package/dist/cjs/downloader/asset.d.ts.map +1 -0
- package/dist/cjs/downloader/asset.js +99 -0
- package/dist/cjs/downloader/asset.js.map +1 -0
- package/dist/cjs/downloader/cli.d.ts +8 -0
- package/dist/cjs/downloader/cli.d.ts.map +1 -0
- package/dist/cjs/downloader/cli.js +168 -0
- package/dist/cjs/downloader/cli.js.map +1 -0
- package/dist/cjs/downloader/discovery.d.ts +12 -0
- package/dist/cjs/downloader/discovery.d.ts.map +1 -0
- package/dist/cjs/downloader/discovery.js +87 -0
- package/dist/cjs/downloader/discovery.js.map +1 -0
- package/dist/cjs/downloader/errors.d.ts +5 -0
- package/dist/cjs/downloader/errors.d.ts.map +1 -0
- package/dist/cjs/downloader/errors.js +40 -0
- package/dist/cjs/downloader/errors.js.map +1 -0
- package/dist/cjs/downloader/index.d.ts +3 -0
- package/dist/cjs/downloader/index.d.ts.map +1 -0
- package/dist/cjs/downloader/index.js +8 -0
- package/dist/cjs/downloader/index.js.map +1 -0
- package/dist/cjs/downloader/logger.d.ts +16 -0
- package/dist/cjs/downloader/logger.d.ts.map +1 -0
- package/dist/cjs/downloader/logger.js +51 -0
- package/dist/cjs/downloader/logger.js.map +1 -0
- package/dist/cjs/downloader/manifest.d.ts +31 -0
- package/dist/cjs/downloader/manifest.d.ts.map +1 -0
- package/dist/cjs/downloader/manifest.js +53 -0
- package/dist/cjs/downloader/manifest.js.map +1 -0
- package/dist/cjs/downloader/markdown.d.ts +4 -0
- package/dist/cjs/downloader/markdown.d.ts.map +1 -0
- package/dist/cjs/downloader/markdown.js +62 -0
- package/dist/cjs/downloader/markdown.js.map +1 -0
- package/dist/cjs/downloader/options.d.ts +24 -0
- package/dist/cjs/downloader/options.d.ts.map +1 -0
- package/dist/cjs/downloader/options.js +135 -0
- package/dist/cjs/downloader/options.js.map +1 -0
- package/dist/cjs/downloader/path.d.ts +15 -0
- package/dist/cjs/downloader/path.d.ts.map +1 -0
- package/dist/cjs/downloader/path.js +79 -0
- package/dist/cjs/downloader/path.js.map +1 -0
- package/dist/cjs/downloader/resolver.d.ts +16 -0
- package/dist/cjs/downloader/resolver.d.ts.map +1 -0
- package/dist/cjs/downloader/resolver.js +21 -0
- package/dist/cjs/downloader/resolver.js.map +1 -0
- package/dist/cjs/downloader/scheduler.d.ts +19 -0
- package/dist/cjs/downloader/scheduler.d.ts.map +1 -0
- package/dist/cjs/downloader/scheduler.js +124 -0
- package/dist/cjs/downloader/scheduler.js.map +1 -0
- package/dist/cjs/downloader/sync.d.ts +21 -0
- package/dist/cjs/downloader/sync.d.ts.map +1 -0
- package/dist/cjs/downloader/sync.js +317 -0
- package/dist/cjs/downloader/sync.js.map +1 -0
- package/dist/cjs/endpoints/creator-get.d.ts +7 -0
- package/dist/cjs/endpoints/creator-get.d.ts.map +1 -0
- package/dist/cjs/endpoints/creator-get.js +5 -0
- package/dist/cjs/endpoints/creator-get.js.map +1 -0
- package/dist/cjs/endpoints/creator-list-following.d.ts +4 -0
- package/dist/cjs/endpoints/creator-list-following.d.ts.map +1 -0
- package/dist/cjs/endpoints/creator-list-following.js +5 -0
- package/dist/cjs/endpoints/creator-list-following.js.map +1 -0
- package/dist/cjs/endpoints/fanbox-envelope.d.ts +4 -0
- package/dist/cjs/endpoints/fanbox-envelope.d.ts.map +1 -0
- package/dist/cjs/endpoints/fanbox-envelope.js +3 -0
- package/dist/cjs/endpoints/fanbox-envelope.js.map +1 -0
- package/dist/cjs/endpoints/models/creator.d.ts +40 -0
- package/dist/cjs/endpoints/models/creator.d.ts.map +1 -0
- package/dist/cjs/endpoints/models/creator.js +3 -0
- package/dist/cjs/endpoints/models/creator.js.map +1 -0
- package/dist/cjs/endpoints/models/plan.d.ts +17 -0
- package/dist/cjs/endpoints/models/plan.d.ts.map +1 -0
- package/dist/cjs/endpoints/models/plan.js +3 -0
- package/dist/cjs/endpoints/models/plan.js.map +1 -0
- package/dist/cjs/endpoints/models/post.d.ts +134 -0
- package/dist/cjs/endpoints/models/post.d.ts.map +1 -0
- package/dist/cjs/endpoints/models/post.js +3 -0
- package/dist/cjs/endpoints/models/post.js.map +1 -0
- package/dist/cjs/endpoints/models/user.d.ts +6 -0
- package/dist/cjs/endpoints/models/user.d.ts.map +1 -0
- package/dist/cjs/endpoints/models/user.js +3 -0
- package/dist/cjs/endpoints/models/user.js.map +1 -0
- package/dist/cjs/endpoints/plan-list-creator.d.ts +7 -0
- package/dist/cjs/endpoints/plan-list-creator.d.ts.map +1 -0
- package/dist/cjs/endpoints/plan-list-creator.js +5 -0
- package/dist/cjs/endpoints/plan-list-creator.js.map +1 -0
- package/dist/cjs/endpoints/plan-list-supporting.d.ts +4 -0
- package/dist/cjs/endpoints/plan-list-supporting.d.ts.map +1 -0
- package/dist/cjs/endpoints/plan-list-supporting.js +5 -0
- package/dist/cjs/endpoints/plan-list-supporting.js.map +1 -0
- package/dist/cjs/endpoints/post-info.d.ts +7 -0
- package/dist/cjs/endpoints/post-info.d.ts.map +1 -0
- package/dist/cjs/endpoints/post-info.js +5 -0
- package/dist/cjs/endpoints/post-info.js.map +1 -0
- package/dist/cjs/endpoints/post-list-creator.d.ts +10 -0
- package/dist/cjs/endpoints/post-list-creator.d.ts.map +1 -0
- package/dist/cjs/endpoints/post-list-creator.js +5 -0
- package/dist/cjs/endpoints/post-list-creator.js.map +1 -0
- package/dist/cjs/endpoints/post-list-home.d.ts +5 -0
- package/dist/cjs/endpoints/post-list-home.d.ts.map +1 -0
- package/dist/cjs/endpoints/post-list-home.js +5 -0
- package/dist/cjs/endpoints/post-list-home.js.map +1 -0
- package/dist/cjs/endpoints/post-list-supporting.d.ts +5 -0
- package/dist/cjs/endpoints/post-list-supporting.d.ts.map +1 -0
- package/dist/cjs/endpoints/post-list-supporting.js +5 -0
- package/dist/cjs/endpoints/post-list-supporting.js.map +1 -0
- package/dist/cjs/endpoints/post-paginate-creator.d.ts +8 -0
- package/dist/cjs/endpoints/post-paginate-creator.d.ts.map +1 -0
- package/dist/cjs/endpoints/post-paginate-creator.js +5 -0
- package/dist/cjs/endpoints/post-paginate-creator.js.map +1 -0
- package/dist/cjs/fanbox-headers.d.ts +7 -0
- package/dist/cjs/fanbox-headers.d.ts.map +1 -0
- package/dist/cjs/fanbox-headers.js +23 -0
- package/dist/cjs/fanbox-headers.js.map +1 -0
- package/dist/cjs/http.d.ts +31 -0
- package/dist/cjs/http.d.ts.map +1 -0
- package/dist/cjs/http.js +200 -0
- package/dist/cjs/http.js.map +1 -0
- package/dist/cjs/index.d.ts +3 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +7 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/types.d.ts +16 -0
- package/dist/cjs/types.d.ts.map +1 -0
- package/dist/cjs/types.js +3 -0
- package/dist/cjs/types.js.map +1 -0
- package/dist/esm/client-options.d.ts +8 -0
- package/dist/esm/client-options.d.ts.map +1 -0
- package/dist/esm/client-options.js +2 -0
- package/dist/esm/client-options.js.map +1 -0
- package/dist/esm/client.d.ts +31 -0
- package/dist/esm/client.d.ts.map +1 -0
- package/dist/esm/client.js +102 -0
- package/dist/esm/client.js.map +1 -0
- package/dist/esm/downloader/asset.d.ts +30 -0
- package/dist/esm/downloader/asset.d.ts.map +1 -0
- package/dist/esm/downloader/asset.js +91 -0
- package/dist/esm/downloader/asset.js.map +1 -0
- package/dist/esm/downloader/cli.d.ts +8 -0
- package/dist/esm/downloader/cli.d.ts.map +1 -0
- package/dist/esm/downloader/cli.js +164 -0
- package/dist/esm/downloader/cli.js.map +1 -0
- package/dist/esm/downloader/discovery.d.ts +12 -0
- package/dist/esm/downloader/discovery.d.ts.map +1 -0
- package/dist/esm/downloader/discovery.js +84 -0
- package/dist/esm/downloader/discovery.js.map +1 -0
- package/dist/esm/downloader/errors.d.ts +5 -0
- package/dist/esm/downloader/errors.d.ts.map +1 -0
- package/dist/esm/downloader/errors.js +36 -0
- package/dist/esm/downloader/errors.js.map +1 -0
- package/dist/esm/downloader/index.d.ts +3 -0
- package/dist/esm/downloader/index.d.ts.map +1 -0
- package/dist/esm/downloader/index.js +6 -0
- package/dist/esm/downloader/index.js.map +1 -0
- package/dist/esm/downloader/logger.d.ts +16 -0
- package/dist/esm/downloader/logger.d.ts.map +1 -0
- package/dist/esm/downloader/logger.js +47 -0
- package/dist/esm/downloader/logger.js.map +1 -0
- package/dist/esm/downloader/manifest.d.ts +31 -0
- package/dist/esm/downloader/manifest.d.ts.map +1 -0
- package/dist/esm/downloader/manifest.js +46 -0
- package/dist/esm/downloader/manifest.js.map +1 -0
- package/dist/esm/downloader/markdown.d.ts +4 -0
- package/dist/esm/downloader/markdown.d.ts.map +1 -0
- package/dist/esm/downloader/markdown.js +59 -0
- package/dist/esm/downloader/markdown.js.map +1 -0
- package/dist/esm/downloader/options.d.ts +24 -0
- package/dist/esm/downloader/options.d.ts.map +1 -0
- package/dist/esm/downloader/options.js +130 -0
- package/dist/esm/downloader/options.js.map +1 -0
- package/dist/esm/downloader/path.d.ts +15 -0
- package/dist/esm/downloader/path.d.ts.map +1 -0
- package/dist/esm/downloader/path.js +69 -0
- package/dist/esm/downloader/path.js.map +1 -0
- package/dist/esm/downloader/resolver.d.ts +16 -0
- package/dist/esm/downloader/resolver.d.ts.map +1 -0
- package/dist/esm/downloader/resolver.js +18 -0
- package/dist/esm/downloader/resolver.js.map +1 -0
- package/dist/esm/downloader/scheduler.d.ts +19 -0
- package/dist/esm/downloader/scheduler.d.ts.map +1 -0
- package/dist/esm/downloader/scheduler.js +120 -0
- package/dist/esm/downloader/scheduler.js.map +1 -0
- package/dist/esm/downloader/sync.d.ts +21 -0
- package/dist/esm/downloader/sync.d.ts.map +1 -0
- package/dist/esm/downloader/sync.js +311 -0
- package/dist/esm/downloader/sync.js.map +1 -0
- package/dist/esm/endpoints/creator-get.d.ts +7 -0
- package/dist/esm/endpoints/creator-get.d.ts.map +1 -0
- package/dist/esm/endpoints/creator-get.js +2 -0
- package/dist/esm/endpoints/creator-get.js.map +1 -0
- package/dist/esm/endpoints/creator-list-following.d.ts +4 -0
- package/dist/esm/endpoints/creator-list-following.d.ts.map +1 -0
- package/dist/esm/endpoints/creator-list-following.js +2 -0
- package/dist/esm/endpoints/creator-list-following.js.map +1 -0
- package/dist/esm/endpoints/fanbox-envelope.d.ts +4 -0
- package/dist/esm/endpoints/fanbox-envelope.d.ts.map +1 -0
- package/dist/esm/endpoints/fanbox-envelope.js +2 -0
- package/dist/esm/endpoints/fanbox-envelope.js.map +1 -0
- package/dist/esm/endpoints/models/creator.d.ts +40 -0
- package/dist/esm/endpoints/models/creator.d.ts.map +1 -0
- package/dist/esm/endpoints/models/creator.js +2 -0
- package/dist/esm/endpoints/models/creator.js.map +1 -0
- package/dist/esm/endpoints/models/plan.d.ts +17 -0
- package/dist/esm/endpoints/models/plan.d.ts.map +1 -0
- package/dist/esm/endpoints/models/plan.js +2 -0
- package/dist/esm/endpoints/models/plan.js.map +1 -0
- package/dist/esm/endpoints/models/post.d.ts +134 -0
- package/dist/esm/endpoints/models/post.d.ts.map +1 -0
- package/dist/esm/endpoints/models/post.js +2 -0
- package/dist/esm/endpoints/models/post.js.map +1 -0
- package/dist/esm/endpoints/models/user.d.ts +6 -0
- package/dist/esm/endpoints/models/user.d.ts.map +1 -0
- package/dist/esm/endpoints/models/user.js +2 -0
- package/dist/esm/endpoints/models/user.js.map +1 -0
- package/dist/esm/endpoints/plan-list-creator.d.ts +7 -0
- package/dist/esm/endpoints/plan-list-creator.d.ts.map +1 -0
- package/dist/esm/endpoints/plan-list-creator.js +2 -0
- package/dist/esm/endpoints/plan-list-creator.js.map +1 -0
- package/dist/esm/endpoints/plan-list-supporting.d.ts +4 -0
- package/dist/esm/endpoints/plan-list-supporting.d.ts.map +1 -0
- package/dist/esm/endpoints/plan-list-supporting.js +2 -0
- package/dist/esm/endpoints/plan-list-supporting.js.map +1 -0
- package/dist/esm/endpoints/post-info.d.ts +7 -0
- package/dist/esm/endpoints/post-info.d.ts.map +1 -0
- package/dist/esm/endpoints/post-info.js +2 -0
- package/dist/esm/endpoints/post-info.js.map +1 -0
- package/dist/esm/endpoints/post-list-creator.d.ts +10 -0
- package/dist/esm/endpoints/post-list-creator.d.ts.map +1 -0
- package/dist/esm/endpoints/post-list-creator.js +2 -0
- package/dist/esm/endpoints/post-list-creator.js.map +1 -0
- package/dist/esm/endpoints/post-list-home.d.ts +5 -0
- package/dist/esm/endpoints/post-list-home.d.ts.map +1 -0
- package/dist/esm/endpoints/post-list-home.js +2 -0
- package/dist/esm/endpoints/post-list-home.js.map +1 -0
- package/dist/esm/endpoints/post-list-supporting.d.ts +5 -0
- package/dist/esm/endpoints/post-list-supporting.d.ts.map +1 -0
- package/dist/esm/endpoints/post-list-supporting.js +2 -0
- package/dist/esm/endpoints/post-list-supporting.js.map +1 -0
- package/dist/esm/endpoints/post-paginate-creator.d.ts +8 -0
- package/dist/esm/endpoints/post-paginate-creator.d.ts.map +1 -0
- package/dist/esm/endpoints/post-paginate-creator.js +2 -0
- package/dist/esm/endpoints/post-paginate-creator.js.map +1 -0
- package/dist/esm/fanbox-headers.d.ts +7 -0
- package/dist/esm/fanbox-headers.d.ts.map +1 -0
- package/dist/esm/fanbox-headers.js +19 -0
- package/dist/esm/fanbox-headers.js.map +1 -0
- package/dist/esm/http.d.ts +31 -0
- package/dist/esm/http.d.ts.map +1 -0
- package/dist/esm/http.js +195 -0
- package/dist/esm/http.js.map +1 -0
- package/dist/esm/index.d.ts +3 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +2 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/types.d.ts +16 -0
- package/dist/esm/types.d.ts.map +1 -0
- package/dist/esm/types.js +2 -0
- package/dist/esm/types.js.map +1 -0
- package/package.json +98 -0
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
import { Readable } from 'node:stream';
|
|
2
|
+
|
|
3
|
+
interface HttpRequest {
|
|
4
|
+
body?: BodyInit | undefined;
|
|
5
|
+
headers?: Headers | Record<string, string>;
|
|
6
|
+
method?: string;
|
|
7
|
+
url: string | URL;
|
|
8
|
+
}
|
|
9
|
+
interface HttpResponse {
|
|
10
|
+
body: Readable;
|
|
11
|
+
headers: Headers;
|
|
12
|
+
json(): Promise<unknown>;
|
|
13
|
+
ok: boolean;
|
|
14
|
+
status: number;
|
|
15
|
+
statusText: string;
|
|
16
|
+
text(): Promise<string>;
|
|
17
|
+
}
|
|
18
|
+
interface HttpTransport {
|
|
19
|
+
close(): Promise<void>;
|
|
20
|
+
request(request: HttpRequest | string | URL): Promise<HttpResponse>;
|
|
21
|
+
}
|
|
22
|
+
type BodyInit = Blob | string | Uint8Array;
|
|
23
|
+
|
|
24
|
+
interface FanboxClientOptions {
|
|
25
|
+
baseUrl?: string;
|
|
26
|
+
cookie?: string;
|
|
27
|
+
transport?: HttpTransport;
|
|
28
|
+
userAgent?: string;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
interface FanboxUser {
|
|
32
|
+
iconUrl: string;
|
|
33
|
+
name: string;
|
|
34
|
+
userId: string;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
interface Creator {
|
|
38
|
+
category: string;
|
|
39
|
+
coverImageUrl: null | string;
|
|
40
|
+
creatorId: string;
|
|
41
|
+
description: string;
|
|
42
|
+
hasAdultContent: boolean;
|
|
43
|
+
hasBoothShop: boolean;
|
|
44
|
+
hasPublishedPost: boolean;
|
|
45
|
+
isAcceptingRequest: boolean;
|
|
46
|
+
isFollowed: boolean;
|
|
47
|
+
isStopped: boolean;
|
|
48
|
+
isSupported: boolean;
|
|
49
|
+
profileItems: CreatorProfileItem[];
|
|
50
|
+
profileLinks: string[];
|
|
51
|
+
user: FanboxUser;
|
|
52
|
+
}
|
|
53
|
+
interface CreatorProfileImage {
|
|
54
|
+
id: string;
|
|
55
|
+
imageUrl: string;
|
|
56
|
+
thumbnailUrl: string;
|
|
57
|
+
type: "image";
|
|
58
|
+
}
|
|
59
|
+
type CreatorProfileItem = CreatorProfileImage | CreatorProfileUnknownItem;
|
|
60
|
+
interface CreatorProfileUnknownItem {
|
|
61
|
+
[key: string]: unknown;
|
|
62
|
+
id: string;
|
|
63
|
+
type: string;
|
|
64
|
+
}
|
|
65
|
+
interface CreatorSummary {
|
|
66
|
+
creatorId: string;
|
|
67
|
+
description: string;
|
|
68
|
+
hasAdultContent: boolean;
|
|
69
|
+
iconUrl: string;
|
|
70
|
+
isFollowed: boolean;
|
|
71
|
+
isSupported: boolean;
|
|
72
|
+
name: string;
|
|
73
|
+
userId: string;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
declare const CREATOR_GET_PATH = "creator.get";
|
|
77
|
+
interface GetCreatorParams {
|
|
78
|
+
creatorId: string;
|
|
79
|
+
}
|
|
80
|
+
type GetCreatorResult = Creator;
|
|
81
|
+
|
|
82
|
+
declare const CREATOR_LIST_FOLLOWING_PATH = "creator.listFollowing";
|
|
83
|
+
type ListFollowingCreatorsResult = CreatorSummary[];
|
|
84
|
+
|
|
85
|
+
interface Plan {
|
|
86
|
+
coverImageUrl: null | string;
|
|
87
|
+
creatorId: string;
|
|
88
|
+
description: string;
|
|
89
|
+
fee: number;
|
|
90
|
+
hasAdultContent: boolean;
|
|
91
|
+
id: string;
|
|
92
|
+
paymentMethod: null | string;
|
|
93
|
+
perks: string[];
|
|
94
|
+
title: string;
|
|
95
|
+
user: FanboxUser;
|
|
96
|
+
}
|
|
97
|
+
interface SupportingPlan extends Plan {
|
|
98
|
+
paymentMethod: string;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
declare const PLAN_LIST_CREATOR_PATH = "plan.listCreator";
|
|
102
|
+
interface ListCreatorPlansParams {
|
|
103
|
+
creatorId: string;
|
|
104
|
+
}
|
|
105
|
+
type ListCreatorPlansResult = Plan[];
|
|
106
|
+
|
|
107
|
+
declare const PLAN_LIST_SUPPORTING_PATH = "plan.listSupporting";
|
|
108
|
+
type ListSupportingPlansResult = SupportingPlan[];
|
|
109
|
+
|
|
110
|
+
type ArticleBlock = ArticleFileBlock | ArticleHeaderBlock | ArticleImageBlock | ArticleParagraphBlock | ArticleUnknownBlock | ArticleUrlEmbedBlock;
|
|
111
|
+
interface ArticleFileBlock {
|
|
112
|
+
fileId: string;
|
|
113
|
+
type: "file";
|
|
114
|
+
}
|
|
115
|
+
interface ArticleHeaderBlock {
|
|
116
|
+
text: string;
|
|
117
|
+
type: "header";
|
|
118
|
+
}
|
|
119
|
+
interface ArticleImageBlock {
|
|
120
|
+
imageId: string;
|
|
121
|
+
type: "image";
|
|
122
|
+
}
|
|
123
|
+
interface ArticleParagraphBlock {
|
|
124
|
+
text: string;
|
|
125
|
+
type: "p";
|
|
126
|
+
}
|
|
127
|
+
interface ArticlePost extends PostBase {
|
|
128
|
+
body: ArticlePostBody;
|
|
129
|
+
type: "article";
|
|
130
|
+
}
|
|
131
|
+
interface ArticlePostBody {
|
|
132
|
+
blocks: ArticleBlock[];
|
|
133
|
+
fileMap: Record<string, PostFile>;
|
|
134
|
+
imageMap: Record<string, PostImage>;
|
|
135
|
+
urlEmbedMap: Record<string, unknown>;
|
|
136
|
+
}
|
|
137
|
+
interface ArticleUnknownBlock {
|
|
138
|
+
[key: string]: unknown;
|
|
139
|
+
type: string;
|
|
140
|
+
}
|
|
141
|
+
interface ArticleUrlEmbedBlock {
|
|
142
|
+
type: "url_embed";
|
|
143
|
+
urlEmbedId: string;
|
|
144
|
+
}
|
|
145
|
+
interface FilePost extends PostBase {
|
|
146
|
+
body: FilePostBody;
|
|
147
|
+
type: "file";
|
|
148
|
+
}
|
|
149
|
+
interface FilePostBody {
|
|
150
|
+
files: PostFile[];
|
|
151
|
+
text: string;
|
|
152
|
+
}
|
|
153
|
+
interface ImagePost extends PostBase {
|
|
154
|
+
body: ImagePostBody;
|
|
155
|
+
type: "image";
|
|
156
|
+
}
|
|
157
|
+
interface ImagePostBody {
|
|
158
|
+
images: PostImage[];
|
|
159
|
+
text: string;
|
|
160
|
+
}
|
|
161
|
+
interface NeighboringPost {
|
|
162
|
+
id: string;
|
|
163
|
+
publishedDatetime: string;
|
|
164
|
+
title: string;
|
|
165
|
+
}
|
|
166
|
+
type Post = ArticlePost | FilePost | ImagePost | TextPost | UnknownPost | VideoPost;
|
|
167
|
+
interface PostCover {
|
|
168
|
+
type: "cover_image" | "post_image";
|
|
169
|
+
url: string;
|
|
170
|
+
}
|
|
171
|
+
interface PostFile {
|
|
172
|
+
extension: string;
|
|
173
|
+
id: string;
|
|
174
|
+
name: string;
|
|
175
|
+
size: number;
|
|
176
|
+
url: string;
|
|
177
|
+
}
|
|
178
|
+
interface PostImage {
|
|
179
|
+
extension: string;
|
|
180
|
+
height: number;
|
|
181
|
+
id: string;
|
|
182
|
+
originalUrl: string;
|
|
183
|
+
thumbnailUrl: string;
|
|
184
|
+
width: number;
|
|
185
|
+
}
|
|
186
|
+
interface PostListParams {
|
|
187
|
+
limit?: number;
|
|
188
|
+
maxId?: string;
|
|
189
|
+
maxPublishedDatetime?: string;
|
|
190
|
+
}
|
|
191
|
+
type PostSort = "newest" | "oldest";
|
|
192
|
+
interface PostSummary {
|
|
193
|
+
commentCount: number;
|
|
194
|
+
cover: null | PostCover;
|
|
195
|
+
creatorId: string;
|
|
196
|
+
excerpt: string;
|
|
197
|
+
feeRequired: number;
|
|
198
|
+
hasAdultContent: boolean;
|
|
199
|
+
id: string;
|
|
200
|
+
isCommentingRestricted: boolean;
|
|
201
|
+
isLiked: boolean;
|
|
202
|
+
isPinned: boolean;
|
|
203
|
+
isRestricted: boolean;
|
|
204
|
+
likeCount: number;
|
|
205
|
+
publishedDatetime: string;
|
|
206
|
+
tags: string[];
|
|
207
|
+
title: string;
|
|
208
|
+
updatedDatetime: string;
|
|
209
|
+
user: FanboxUser;
|
|
210
|
+
}
|
|
211
|
+
interface TextPost extends PostBase {
|
|
212
|
+
body: TextPostBody;
|
|
213
|
+
type: "text";
|
|
214
|
+
}
|
|
215
|
+
interface TextPostBody {
|
|
216
|
+
text: string;
|
|
217
|
+
}
|
|
218
|
+
interface UnknownPost extends PostBase {
|
|
219
|
+
type: string;
|
|
220
|
+
}
|
|
221
|
+
type UnknownPostBody = Record<string, unknown>;
|
|
222
|
+
interface VideoPost extends PostBase {
|
|
223
|
+
body: VideoPostBody;
|
|
224
|
+
type: "video";
|
|
225
|
+
}
|
|
226
|
+
interface VideoPostBody {
|
|
227
|
+
text: string;
|
|
228
|
+
video: {
|
|
229
|
+
serviceProvider: string;
|
|
230
|
+
videoId: string;
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
interface PostBase extends Omit<PostSummary, "cover"> {
|
|
234
|
+
body: unknown;
|
|
235
|
+
coverImageUrl: null | string;
|
|
236
|
+
imageForShare: null | string;
|
|
237
|
+
nextPost: NeighboringPost | null;
|
|
238
|
+
prevPost: NeighboringPost | null;
|
|
239
|
+
type: string;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
declare const POST_INFO_PATH = "post.info";
|
|
243
|
+
interface GetPostParams {
|
|
244
|
+
postId: string;
|
|
245
|
+
}
|
|
246
|
+
type GetPostResult = Post;
|
|
247
|
+
|
|
248
|
+
declare const POST_LIST_CREATOR_PATH = "post.listCreator";
|
|
249
|
+
interface ListCreatorPostsParams extends PostListParams {
|
|
250
|
+
creatorId: string;
|
|
251
|
+
firstId?: string;
|
|
252
|
+
firstPublishedDatetime?: string;
|
|
253
|
+
sort?: PostSort;
|
|
254
|
+
}
|
|
255
|
+
type ListCreatorPostsResult = PostSummary[];
|
|
256
|
+
|
|
257
|
+
declare const POST_LIST_HOME_PATH = "post.listHome";
|
|
258
|
+
type ListHomePostsParams = PostListParams;
|
|
259
|
+
type ListHomePostsResult = PostSummary[];
|
|
260
|
+
|
|
261
|
+
declare const POST_LIST_SUPPORTING_PATH = "post.listSupporting";
|
|
262
|
+
type ListSupportingPostsParams = PostListParams;
|
|
263
|
+
type ListSupportingPostsResult = PostSummary[];
|
|
264
|
+
|
|
265
|
+
declare const POST_PAGINATE_CREATOR_PATH = "post.paginateCreator";
|
|
266
|
+
interface PaginateCreatorPostsParams {
|
|
267
|
+
creatorId: string;
|
|
268
|
+
sort?: PostSort;
|
|
269
|
+
}
|
|
270
|
+
type PaginateCreatorPostsResult = string[];
|
|
271
|
+
|
|
272
|
+
declare class FanboxApiError extends Error {
|
|
273
|
+
readonly body: unknown;
|
|
274
|
+
readonly status: number;
|
|
275
|
+
readonly statusText: string;
|
|
276
|
+
constructor(response: HttpResponse, body: unknown);
|
|
277
|
+
}
|
|
278
|
+
declare class FanboxClient {
|
|
279
|
+
#private;
|
|
280
|
+
constructor(options?: FanboxClientOptions);
|
|
281
|
+
getCreator(params: GetCreatorParams): Promise<GetCreatorResult>;
|
|
282
|
+
getPost(params: GetPostParams): Promise<GetPostResult>;
|
|
283
|
+
listCreatorPlans(params: ListCreatorPlansParams): Promise<ListCreatorPlansResult>;
|
|
284
|
+
listCreatorPosts(params: ListCreatorPostsParams): Promise<ListCreatorPostsResult>;
|
|
285
|
+
listFollowingCreators(): Promise<ListFollowingCreatorsResult>;
|
|
286
|
+
listHomePosts(params?: ListHomePostsParams): Promise<ListHomePostsResult>;
|
|
287
|
+
listSupportingPlans(): Promise<ListSupportingPlansResult>;
|
|
288
|
+
listSupportingPosts(params?: ListSupportingPostsParams): Promise<ListSupportingPostsResult>;
|
|
289
|
+
paginateCreatorPosts(params: PaginateCreatorPostsParams): Promise<PaginateCreatorPostsResult>;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
interface FanboxEnvelope<T> {
|
|
293
|
+
body: T;
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
export { type ArticleBlock, type ArticleFileBlock, type ArticleHeaderBlock, type ArticleImageBlock, type ArticleParagraphBlock, type ArticlePost, type ArticlePostBody, type ArticleUnknownBlock, type ArticleUrlEmbedBlock, CREATOR_GET_PATH, CREATOR_LIST_FOLLOWING_PATH, type Creator, type CreatorProfileImage, type CreatorProfileItem, type CreatorProfileUnknownItem, type CreatorSummary, FanboxApiError, FanboxClient, type FanboxClientOptions, type FanboxEnvelope, type FanboxUser, type FilePost, type FilePostBody, type GetCreatorParams, type GetCreatorResult, type GetPostParams, type GetPostResult, type ImagePost, type ImagePostBody, type ListCreatorPlansParams, type ListCreatorPlansResult, type ListCreatorPostsParams, type ListCreatorPostsResult, type ListFollowingCreatorsResult, type ListHomePostsParams, type ListHomePostsResult, type ListSupportingPlansResult, type ListSupportingPostsParams, type ListSupportingPostsResult, type NeighboringPost, PLAN_LIST_CREATOR_PATH, PLAN_LIST_SUPPORTING_PATH, POST_INFO_PATH, POST_LIST_CREATOR_PATH, POST_LIST_HOME_PATH, POST_LIST_SUPPORTING_PATH, POST_PAGINATE_CREATOR_PATH, type PaginateCreatorPostsParams, type PaginateCreatorPostsResult, type Plan, type Post, type PostCover, type PostFile, type PostImage, type PostListParams, type PostSort, type PostSummary, type SupportingPlan, type TextPost, type TextPostBody, type UnknownPost, type UnknownPostBody, type VideoPost, type VideoPostBody };
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var A=t=>{throw TypeError(t)};var h=(t,e,r)=>e.has(t)||A("Cannot "+r);var o=(t,e,r)=>(h(t,e,"read from private field"),r?r.call(t):e.get(t)),P=(t,e,r)=>e.has(t)?A("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(t):e.set(t,r),R=(t,e,r,s)=>(h(t,e,"write to private field"),s?s.call(t,r):e.set(t,r),r),i=(t,e,r)=>(h(t,e,"access private method"),r);var _="creator.get";var C="creator.listFollowing";var O="plan.listCreator";var w="plan.listSupporting";var E="post.info";var I="post.listCreator";var U="post.listHome";var F="post.listSupporting";var G="post.paginateCreator";function N(t={}){let e={Accept:"application/json, text/plain, */*",Origin:"https://www.fanbox.cc",Referer:"https://www.fanbox.cc/","Sec-Fetch-Dest":"empty","Sec-Fetch-Mode":"cors","Sec-Fetch-Site":"same-site","User-Agent":t.userAgent??v()};return t.cookie!==void 0&&(e.Cookie=t.cookie),e}function v(){return`${Math.random().toString(36).substring(2,15)}/${Math.random().toFixed(5)}`}import{connect as D}from"http2";var q=":authority",M=":method",$=":path",W=":scheme",z=":status",p,H,j,g=class{constructor(){P(this,H);P(this,p,new Map)}async close(){let e=[...o(this,p).values()];o(this,p).clear(),await Promise.all(e.map(J))}request(e){let r=V(e),s=i(this,H,j).call(this,r.url),n=X(r),m=s.request(n,{endStream:!r.body});return new Promise((b,d)=>{let L=!1;m.once("error",d),m.once("response",l=>{L=!0;let k=Z(l[z]);b(Y({body:m,headers:K(l),status:k}))}),m.once("close",()=>{L||d(new T("HTTP/2 stream closed before response"))}),r.body!==void 0&&et(m,r.body).catch(l=>{m.destroy(l instanceof Error?l:new Error(String(l)))})})}};p=new WeakMap,H=new WeakSet,j=function(e){let r=e.origin,s=o(this,p).get(r);if(s&&!s.closed&&!s.destroyed)return s;let n=D(r);return n.once("close",()=>{o(this,p).get(r)===n&&o(this,p).delete(r)}),n.once("error",()=>{o(this,p).get(r)===n&&o(this,p).delete(r)}),o(this,p).set(r,n),n};var T=class extends Error{constructor(e){super(e),this.name="HttpError"}};function J(t){return t.closed||t.destroyed?Promise.resolve():new Promise(e=>{t.close(e)})}function X(t){let e={[q]:t.url.host,[M]:t.method.toUpperCase(),[$]:`${t.url.pathname}${t.url.search}`,[W]:t.url.protocol.slice(0,-1)};return new Headers(t.headers).forEach((r,s)=>{Q(s)||(e[s]=r)}),e}function Y(t){return{body:t.body,headers:t.headers,json:async()=>JSON.parse(await B(t.body)),ok:t.status>=200&&t.status<300,status:t.status,statusText:"",text:async()=>B(t.body)}}function K(t){let e=new Headers;for(let[r,s]of Object.entries(t))if(!(r.startsWith(":")||s===void 0))if(Array.isArray(s))for(let n of s)e.append(r,n);else e.set(r,s);return e}function Q(t){return t.startsWith(":")||t==="connection"||t==="keep-alive"||t==="proxy-connection"||t==="transfer-encoding"||t==="upgrade"}function V(t){return typeof t=="string"||t instanceof URL?{body:void 0,headers:void 0,method:"GET",url:new URL(t)}:{body:t.body,headers:t.headers,method:t.method??"GET",url:new URL(t.url)}}function Z(t){return typeof t=="number"?t:Array.isArray(t)?Number(t[0]??0):Number(t??0)}async function B(t){let e=[];for await(let r of t)e.push(tt(r));return Buffer.concat(e).toString("utf8")}function tt(t){return Buffer.isBuffer(t)?t:t instanceof Uint8Array||typeof t=="string"?Buffer.from(t):Buffer.from(String(t))}async function et(t,e){if(typeof e=="string"||e instanceof Uint8Array){t.end(e);return}if(e instanceof Blob){t.end(Buffer.from(new Uint8Array(await e.arrayBuffer())));return}throw new T("Unsupported HTTP request body")}var rt="https://api.fanbox.cc",S=class extends Error{constructor(e,r){super(`FANBOX API request failed: ${e.status} ${e.statusText}`),this.name="FanboxApiError",this.body=r,this.status=e.status,this.statusText=e.statusText}},c,f,y,a,u,x=class{constructor(e={}){P(this,a);P(this,c);P(this,f);P(this,y);R(this,c,e.baseUrl??rt),R(this,f,N({cookie:e.cookie,userAgent:e.userAgent})),R(this,y,e.transport??new g)}getCreator(e){return i(this,a,u).call(this,_,e)}getPost(e){return i(this,a,u).call(this,E,e)}listCreatorPlans(e){return i(this,a,u).call(this,O,e)}listCreatorPosts(e){return i(this,a,u).call(this,I,e)}listFollowingCreators(){return i(this,a,u).call(this,C)}listHomePosts(e={}){return i(this,a,u).call(this,U,e)}listSupportingPlans(){return i(this,a,u).call(this,w)}listSupportingPosts(e={}){return i(this,a,u).call(this,F,e)}paginateCreatorPosts(e){return i(this,a,u).call(this,G,e)}};c=new WeakMap,f=new WeakMap,y=new WeakMap,a=new WeakSet,u=async function(e,r={}){let s=new URL(e,o(this,c).endsWith("/")?o(this,c):`${o(this,c)}/`);for(let[b,d]of Object.entries(r))d!==void 0&&s.searchParams.set(b,String(d));let n=await o(this,y).request({headers:o(this,f),method:"GET",url:s}),m=await st(n);if(!n.ok)throw new S(n,m);return m.body};async function st(t){let e=await t.text();try{return JSON.parse(e)}catch{return e}}export{S as FanboxApiError,x as FanboxClient};
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/endpoints/creator-get.ts","../../src/endpoints/creator-list-following.ts","../../src/endpoints/plan-list-creator.ts","../../src/endpoints/plan-list-supporting.ts","../../src/endpoints/post-info.ts","../../src/endpoints/post-list-creator.ts","../../src/endpoints/post-list-home.ts","../../src/endpoints/post-list-supporting.ts","../../src/endpoints/post-paginate-creator.ts","../../src/fanbox-headers.ts","../../src/http.ts","../../src/client.ts"],"sourcesContent":["import type { Creator } from \"./models/creator.js\";\n\nexport const CREATOR_GET_PATH = \"creator.get\";\n\nexport interface GetCreatorParams {\n creatorId: string;\n}\n\nexport type GetCreatorResult = Creator;\n","import type { CreatorSummary } from \"./models/creator.js\";\n\nexport const CREATOR_LIST_FOLLOWING_PATH = \"creator.listFollowing\";\n\nexport type ListFollowingCreatorsResult = CreatorSummary[];\n","import type { Plan } from \"./models/plan.js\";\n\nexport const PLAN_LIST_CREATOR_PATH = \"plan.listCreator\";\n\nexport interface ListCreatorPlansParams {\n creatorId: string;\n}\n\nexport type ListCreatorPlansResult = Plan[];\n","import type { SupportingPlan } from \"./models/plan.js\";\n\nexport const PLAN_LIST_SUPPORTING_PATH = \"plan.listSupporting\";\n\nexport type ListSupportingPlansResult = SupportingPlan[];\n","import type { Post } from \"./models/post.js\";\n\nexport const POST_INFO_PATH = \"post.info\";\n\nexport interface GetPostParams {\n postId: string;\n}\n\nexport type GetPostResult = Post;\n","import type { PostListParams, PostSort, PostSummary } from \"./models/post.js\";\n\nexport const POST_LIST_CREATOR_PATH = \"post.listCreator\";\n\nexport interface ListCreatorPostsParams extends PostListParams {\n creatorId: string;\n firstId?: string;\n firstPublishedDatetime?: string;\n sort?: PostSort;\n}\n\nexport type ListCreatorPostsResult = PostSummary[];\n","import type { PostListParams, PostSummary } from \"./models/post.js\";\n\nexport const POST_LIST_HOME_PATH = \"post.listHome\";\n\nexport type ListHomePostsParams = PostListParams;\n\nexport type ListHomePostsResult = PostSummary[];\n","import type { PostListParams, PostSummary } from \"./models/post.js\";\n\nexport const POST_LIST_SUPPORTING_PATH = \"post.listSupporting\";\n\nexport type ListSupportingPostsParams = PostListParams;\n\nexport type ListSupportingPostsResult = PostSummary[];\n","import type { PostSort } from \"./models/post.js\";\n\nexport const POST_PAGINATE_CREATOR_PATH = \"post.paginateCreator\";\n\nexport interface PaginateCreatorPostsParams {\n creatorId: string;\n sort?: PostSort;\n}\n\nexport type PaginateCreatorPostsResult = string[];\n","export interface FanboxRequestHeadersOptions {\n cookie?: string;\n userAgent?: string;\n}\n\nexport function createFanboxRequestHeaders(\n options: FanboxRequestHeadersOptions = {},\n): Record<string, string> {\n const headers: Record<string, string> = {\n Accept: \"application/json, text/plain, */*\",\n Origin: \"https://www.fanbox.cc\",\n Referer: \"https://www.fanbox.cc/\",\n \"Sec-Fetch-Dest\": \"empty\",\n \"Sec-Fetch-Mode\": \"cors\",\n \"Sec-Fetch-Site\": \"same-site\",\n \"User-Agent\": options.userAgent ?? createRandomUserAgent(),\n };\n if (options.cookie !== undefined) {\n headers.Cookie = options.cookie;\n }\n\n return headers;\n}\n\nexport function createRandomUserAgent(): string {\n return `${Math.random().toString(36).substring(2, 15)}/${Math.random().toFixed(5)}`;\n}\n","import { type ClientHttp2Session, connect } from \"node:http2\";\nimport type { Readable } from \"node:stream\";\n\nconst HTTP2_HEADER_AUTHORITY = \":authority\";\nconst HTTP2_HEADER_METHOD = \":method\";\nconst HTTP2_HEADER_PATH = \":path\";\nconst HTTP2_HEADER_SCHEME = \":scheme\";\nconst HTTP2_HEADER_STATUS = \":status\";\n\nexport interface HttpRequest {\n body?: BodyInit | undefined;\n headers?: Headers | Record<string, string>;\n method?: string;\n url: string | URL;\n}\n\nexport interface HttpResponse {\n body: Readable;\n headers: Headers;\n json(): Promise<unknown>;\n ok: boolean;\n status: number;\n statusText: string;\n text(): Promise<string>;\n}\n\nexport interface HttpTransport {\n close(): Promise<void>;\n request(request: HttpRequest | string | URL): Promise<HttpResponse>;\n}\n\ntype BodyInit = Blob | string | Uint8Array;\n\ninterface NormalizedHttpRequest {\n body: BodyInit | undefined;\n headers: Headers | Record<string, string> | undefined;\n method: string;\n url: URL;\n}\n\nexport class Http2Transport implements HttpTransport {\n readonly #sessions = new Map<string, ClientHttp2Session>();\n\n public async close(): Promise<void> {\n const sessions = [...this.#sessions.values()];\n this.#sessions.clear();\n await Promise.all(sessions.map(closeSession));\n }\n\n public request(request: HttpRequest | string | URL): Promise<HttpResponse> {\n const normalized = normalizeRequest(request);\n const session = this.#getSession(normalized.url);\n const headers = createHttp2Headers(normalized);\n const stream = session.request(headers, { endStream: !normalized.body });\n\n return new Promise((resolve, reject) => {\n let settled = false;\n stream.once(\"error\", reject);\n stream.once(\"response\", (responseHeaders) => {\n settled = true;\n const status = parseStatus(responseHeaders[HTTP2_HEADER_STATUS]);\n resolve(\n createResponse({\n body: stream,\n headers: createResponseHeaders(responseHeaders),\n status,\n }),\n );\n });\n stream.once(\"close\", () => {\n if (!settled) {\n reject(new HttpError(`HTTP/2 stream closed before response`));\n }\n });\n if (normalized.body !== undefined) {\n writeRequestBody(stream, normalized.body).catch((error: unknown) => {\n stream.destroy(\n error instanceof Error ? error : new Error(String(error)),\n );\n });\n }\n });\n }\n\n #getSession(url: URL): ClientHttp2Session {\n const origin = url.origin;\n const existing = this.#sessions.get(origin);\n if (existing && !existing.closed && !existing.destroyed) {\n return existing;\n }\n\n const session = connect(origin);\n session.once(\"close\", () => {\n if (this.#sessions.get(origin) === session) {\n this.#sessions.delete(origin);\n }\n });\n session.once(\"error\", () => {\n if (this.#sessions.get(origin) === session) {\n this.#sessions.delete(origin);\n }\n });\n this.#sessions.set(origin, session);\n\n return session;\n }\n}\n\nexport class HttpError extends Error {\n public constructor(message: string) {\n super(message);\n this.name = \"HttpError\";\n }\n}\n\nfunction closeSession(session: ClientHttp2Session): Promise<void> {\n if (session.closed || session.destroyed) {\n return Promise.resolve();\n }\n\n return new Promise((resolve) => {\n session.close(resolve);\n });\n}\n\nfunction createHttp2Headers(\n request: NormalizedHttpRequest,\n): Record<string, string> {\n const headers: Record<string, string> = {\n [HTTP2_HEADER_AUTHORITY]: request.url.host,\n [HTTP2_HEADER_METHOD]: request.method.toUpperCase(),\n [HTTP2_HEADER_PATH]: `${request.url.pathname}${request.url.search}`,\n [HTTP2_HEADER_SCHEME]: request.url.protocol.slice(0, -1),\n };\n new Headers(request.headers).forEach((value, key) => {\n if (!isForbiddenHttp2Header(key)) {\n headers[key] = value;\n }\n });\n\n return headers;\n}\n\nfunction createResponse(options: {\n body: Readable;\n headers: Headers;\n status: number;\n}): HttpResponse {\n return {\n body: options.body,\n headers: options.headers,\n json: async () => {\n const parsed: unknown = JSON.parse(await readText(options.body));\n return parsed;\n },\n ok: options.status >= 200 && options.status < 300,\n status: options.status,\n statusText: \"\",\n text: async () => readText(options.body),\n };\n}\n\nfunction createResponseHeaders(\n headers: NodeJS.Dict<string | string[]>,\n): Headers {\n const result = new Headers();\n for (const [key, value] of Object.entries(headers)) {\n if (key.startsWith(\":\") || value === undefined) {\n continue;\n }\n if (Array.isArray(value)) {\n for (const item of value) {\n result.append(key, item);\n }\n } else {\n result.set(key, value);\n }\n }\n\n return result;\n}\n\nfunction isForbiddenHttp2Header(header: string): boolean {\n return (\n header.startsWith(\":\") ||\n header === \"connection\" ||\n header === \"keep-alive\" ||\n header === \"proxy-connection\" ||\n header === \"transfer-encoding\" ||\n header === \"upgrade\"\n );\n}\n\nfunction normalizeRequest(\n request: HttpRequest | string | URL,\n): NormalizedHttpRequest {\n if (typeof request === \"string\" || request instanceof URL) {\n return {\n body: undefined,\n headers: undefined,\n method: \"GET\",\n url: new URL(request),\n };\n }\n\n return {\n body: request.body,\n headers: request.headers,\n method: request.method ?? \"GET\",\n url: new URL(request.url),\n };\n}\n\nfunction parseStatus(status: number | string | string[] | undefined): number {\n if (typeof status === \"number\") {\n return status;\n }\n if (Array.isArray(status)) {\n return Number(status[0] ?? 0);\n }\n\n return Number(status ?? 0);\n}\n\nasync function readText(body: Readable): Promise<string> {\n const chunks: Buffer[] = [];\n for await (const chunk of body) {\n chunks.push(toBuffer(chunk));\n }\n\n return Buffer.concat(chunks).toString(\"utf8\");\n}\n\nfunction toBuffer(chunk: unknown): Buffer {\n if (Buffer.isBuffer(chunk)) {\n return chunk;\n }\n if (chunk instanceof Uint8Array) {\n return Buffer.from(chunk);\n }\n if (typeof chunk === \"string\") {\n return Buffer.from(chunk);\n }\n\n return Buffer.from(String(chunk));\n}\n\nasync function writeRequestBody(\n stream: NodeJS.WritableStream,\n body: BodyInit | undefined,\n): Promise<void> {\n if (typeof body === \"string\" || body instanceof Uint8Array) {\n stream.end(body);\n return;\n }\n if (body instanceof Blob) {\n stream.end(Buffer.from(new Uint8Array(await body.arrayBuffer())));\n return;\n }\n\n throw new HttpError(\"Unsupported HTTP request body\");\n}\n","import type { FanboxClientOptions } from \"./client-options.js\";\nimport {\n CREATOR_GET_PATH,\n type GetCreatorParams,\n type GetCreatorResult,\n} from \"./endpoints/creator-get.js\";\nimport {\n CREATOR_LIST_FOLLOWING_PATH,\n type ListFollowingCreatorsResult,\n} from \"./endpoints/creator-list-following.js\";\nimport type { FanboxEnvelope } from \"./endpoints/fanbox-envelope.js\";\nimport {\n type ListCreatorPlansParams,\n type ListCreatorPlansResult,\n PLAN_LIST_CREATOR_PATH,\n} from \"./endpoints/plan-list-creator.js\";\nimport {\n type ListSupportingPlansResult,\n PLAN_LIST_SUPPORTING_PATH,\n} from \"./endpoints/plan-list-supporting.js\";\nimport {\n type GetPostParams,\n type GetPostResult,\n POST_INFO_PATH,\n} from \"./endpoints/post-info.js\";\nimport {\n type ListCreatorPostsParams,\n type ListCreatorPostsResult,\n POST_LIST_CREATOR_PATH,\n} from \"./endpoints/post-list-creator.js\";\nimport {\n type ListHomePostsParams,\n type ListHomePostsResult,\n POST_LIST_HOME_PATH,\n} from \"./endpoints/post-list-home.js\";\nimport {\n type ListSupportingPostsParams,\n type ListSupportingPostsResult,\n POST_LIST_SUPPORTING_PATH,\n} from \"./endpoints/post-list-supporting.js\";\nimport {\n type PaginateCreatorPostsParams,\n type PaginateCreatorPostsResult,\n POST_PAGINATE_CREATOR_PATH,\n} from \"./endpoints/post-paginate-creator.js\";\nimport { createFanboxRequestHeaders } from \"./fanbox-headers.js\";\nimport {\n Http2Transport,\n type HttpResponse,\n type HttpTransport,\n} from \"./http.js\";\n\nconst DEFAULT_BASE_URL = \"https://api.fanbox.cc\";\n\nexport class FanboxApiError extends Error {\n public readonly body: unknown;\n public readonly status: number;\n public readonly statusText: string;\n\n public constructor(response: HttpResponse, body: unknown) {\n super(\n `FANBOX API request failed: ${response.status} ${response.statusText}`,\n );\n this.name = \"FanboxApiError\";\n this.body = body;\n this.status = response.status;\n this.statusText = response.statusText;\n }\n}\n\nexport class FanboxClient {\n readonly #baseUrl: string;\n readonly #headers: Record<string, string>;\n readonly #transport: HttpTransport;\n\n public constructor(options: FanboxClientOptions = {}) {\n this.#baseUrl = options.baseUrl ?? DEFAULT_BASE_URL;\n this.#headers = createFanboxRequestHeaders({\n cookie: options.cookie,\n userAgent: options.userAgent,\n });\n this.#transport = options.transport ?? new Http2Transport();\n }\n\n public getCreator(params: GetCreatorParams): Promise<GetCreatorResult> {\n return this.#get(CREATOR_GET_PATH, params);\n }\n\n public getPost(params: GetPostParams): Promise<GetPostResult> {\n return this.#get(POST_INFO_PATH, params);\n }\n\n public listCreatorPlans(\n params: ListCreatorPlansParams,\n ): Promise<ListCreatorPlansResult> {\n return this.#get(PLAN_LIST_CREATOR_PATH, params);\n }\n\n public listCreatorPosts(\n params: ListCreatorPostsParams,\n ): Promise<ListCreatorPostsResult> {\n return this.#get(POST_LIST_CREATOR_PATH, params);\n }\n\n public listFollowingCreators(): Promise<ListFollowingCreatorsResult> {\n return this.#get(CREATOR_LIST_FOLLOWING_PATH);\n }\n\n public listHomePosts(\n params: ListHomePostsParams = {},\n ): Promise<ListHomePostsResult> {\n return this.#get(POST_LIST_HOME_PATH, params);\n }\n\n public listSupportingPlans(): Promise<ListSupportingPlansResult> {\n return this.#get(PLAN_LIST_SUPPORTING_PATH);\n }\n\n public listSupportingPosts(\n params: ListSupportingPostsParams = {},\n ): Promise<ListSupportingPostsResult> {\n return this.#get(POST_LIST_SUPPORTING_PATH, params);\n }\n\n public paginateCreatorPosts(\n params: PaginateCreatorPostsParams,\n ): Promise<PaginateCreatorPostsResult> {\n return this.#get(POST_PAGINATE_CREATOR_PATH, params);\n }\n\n async #get<T>(path: string, query: object = {}): Promise<T> {\n const url = new URL(\n path,\n this.#baseUrl.endsWith(\"/\") ? this.#baseUrl : `${this.#baseUrl}/`,\n );\n for (const [key, value] of Object.entries(query)) {\n if (value !== undefined) {\n url.searchParams.set(key, String(value));\n }\n }\n\n const response = await this.#transport.request({\n headers: this.#headers,\n method: \"GET\",\n url,\n });\n const body = await readResponseBody(response);\n if (!response.ok) {\n throw new FanboxApiError(response, body);\n }\n\n return (body as FanboxEnvelope<T>).body;\n }\n}\n\nasync function readResponseBody(response: HttpResponse): Promise<unknown> {\n const text = await response.text();\n try {\n return JSON.parse(text) as unknown;\n } catch {\n return text;\n }\n}\n"],"mappings":"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","names":["CREATOR_GET_PATH","CREATOR_LIST_FOLLOWING_PATH","PLAN_LIST_CREATOR_PATH","PLAN_LIST_SUPPORTING_PATH","POST_INFO_PATH","POST_LIST_CREATOR_PATH","POST_LIST_HOME_PATH","POST_LIST_SUPPORTING_PATH","POST_PAGINATE_CREATOR_PATH","createFanboxRequestHeaders","options","headers","createRandomUserAgent","connect","HTTP2_HEADER_AUTHORITY","HTTP2_HEADER_METHOD","HTTP2_HEADER_PATH","HTTP2_HEADER_SCHEME","HTTP2_HEADER_STATUS","_sessions","_Http2Transport_instances","getSession_fn","Http2Transport","__privateAdd","sessions","__privateGet","closeSession","request","normalized","normalizeRequest","session","__privateMethod","headers","createHttp2Headers","stream","resolve","reject","settled","responseHeaders","status","parseStatus","createResponse","createResponseHeaders","HttpError","writeRequestBody","error","url","origin","existing","connect","message","value","key","isForbiddenHttp2Header","options","readText","result","item","header","body","chunks","chunk","toBuffer","DEFAULT_BASE_URL","FanboxApiError","response","body","_baseUrl","_headers","_transport","_FanboxClient_instances","get_fn","FanboxClient","options","__privateAdd","__privateSet","createFanboxRequestHeaders","Http2Transport","params","__privateMethod","CREATOR_GET_PATH","POST_INFO_PATH","PLAN_LIST_CREATOR_PATH","POST_LIST_CREATOR_PATH","CREATOR_LIST_FOLLOWING_PATH","POST_LIST_HOME_PATH","PLAN_LIST_SUPPORTING_PATH","POST_LIST_SUPPORTING_PATH","POST_PAGINATE_CREATOR_PATH","path","query","url","__privateGet","key","value","readResponseBody","text"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-options.d.ts","sourceRoot":"","sources":["../../src/client-options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE/C,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,aAAa,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-options.js","sourceRoot":"","sources":["../../src/client-options.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { FanboxClientOptions } from "./client-options.js";
|
|
2
|
+
import { type GetCreatorParams, type GetCreatorResult } from "./endpoints/creator-get.js";
|
|
3
|
+
import { type ListFollowingCreatorsResult } from "./endpoints/creator-list-following.js";
|
|
4
|
+
import { type ListCreatorPlansParams, type ListCreatorPlansResult } from "./endpoints/plan-list-creator.js";
|
|
5
|
+
import { type ListSupportingPlansResult } from "./endpoints/plan-list-supporting.js";
|
|
6
|
+
import { type GetPostParams, type GetPostResult } from "./endpoints/post-info.js";
|
|
7
|
+
import { type ListCreatorPostsParams, type ListCreatorPostsResult } from "./endpoints/post-list-creator.js";
|
|
8
|
+
import { type ListHomePostsParams, type ListHomePostsResult } from "./endpoints/post-list-home.js";
|
|
9
|
+
import { type ListSupportingPostsParams, type ListSupportingPostsResult } from "./endpoints/post-list-supporting.js";
|
|
10
|
+
import { type PaginateCreatorPostsParams, type PaginateCreatorPostsResult } from "./endpoints/post-paginate-creator.js";
|
|
11
|
+
import { type HttpResponse } from "./http.js";
|
|
12
|
+
export declare class FanboxApiError extends Error {
|
|
13
|
+
readonly body: unknown;
|
|
14
|
+
readonly status: number;
|
|
15
|
+
readonly statusText: string;
|
|
16
|
+
constructor(response: HttpResponse, body: unknown);
|
|
17
|
+
}
|
|
18
|
+
export declare class FanboxClient {
|
|
19
|
+
#private;
|
|
20
|
+
constructor(options?: FanboxClientOptions);
|
|
21
|
+
getCreator(params: GetCreatorParams): Promise<GetCreatorResult>;
|
|
22
|
+
getPost(params: GetPostParams): Promise<GetPostResult>;
|
|
23
|
+
listCreatorPlans(params: ListCreatorPlansParams): Promise<ListCreatorPlansResult>;
|
|
24
|
+
listCreatorPosts(params: ListCreatorPostsParams): Promise<ListCreatorPostsResult>;
|
|
25
|
+
listFollowingCreators(): Promise<ListFollowingCreatorsResult>;
|
|
26
|
+
listHomePosts(params?: ListHomePostsParams): Promise<ListHomePostsResult>;
|
|
27
|
+
listSupportingPlans(): Promise<ListSupportingPlansResult>;
|
|
28
|
+
listSupportingPosts(params?: ListSupportingPostsParams): Promise<ListSupportingPostsResult>;
|
|
29
|
+
paginateCreatorPosts(params: PaginateCreatorPostsParams): Promise<PaginateCreatorPostsResult>;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACtB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAEL,KAAK,2BAA2B,EACjC,MAAM,uCAAuC,CAAC;AAE/C,OAAO,EACL,KAAK,sBAAsB,EAC3B,KAAK,sBAAsB,EAE5B,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EACL,KAAK,yBAAyB,EAE/B,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,aAAa,EAEnB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,KAAK,sBAAsB,EAC3B,KAAK,sBAAsB,EAE5B,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EACL,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EAEzB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,KAAK,yBAAyB,EAC9B,KAAK,yBAAyB,EAE/B,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EACL,KAAK,0BAA0B,EAC/B,KAAK,0BAA0B,EAEhC,MAAM,sCAAsC,CAAC;AAE9C,OAAO,EAEL,KAAK,YAAY,EAElB,MAAM,WAAW,CAAC;AAInB,qBAAa,cAAe,SAAQ,KAAK;IACvC,SAAgB,IAAI,EAAE,OAAO,CAAC;IAC9B,SAAgB,MAAM,EAAE,MAAM,CAAC;IAC/B,SAAgB,UAAU,EAAE,MAAM,CAAC;gBAEhB,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,OAAO;CASzD;AAED,qBAAa,YAAY;;gBAKJ,OAAO,GAAE,mBAAwB;IAS7C,UAAU,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAI/D,OAAO,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;IAItD,gBAAgB,CACrB,MAAM,EAAE,sBAAsB,GAC7B,OAAO,CAAC,sBAAsB,CAAC;IAI3B,gBAAgB,CACrB,MAAM,EAAE,sBAAsB,GAC7B,OAAO,CAAC,sBAAsB,CAAC;IAI3B,qBAAqB,IAAI,OAAO,CAAC,2BAA2B,CAAC;IAI7D,aAAa,CAClB,MAAM,GAAE,mBAAwB,GAC/B,OAAO,CAAC,mBAAmB,CAAC;IAIxB,mBAAmB,IAAI,OAAO,CAAC,yBAAyB,CAAC;IAIzD,mBAAmB,CACxB,MAAM,GAAE,yBAA8B,GACrC,OAAO,CAAC,yBAAyB,CAAC;IAI9B,oBAAoB,CACzB,MAAM,EAAE,0BAA0B,GACjC,OAAO,CAAC,0BAA0B,CAAC;CA2BvC"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
3
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
4
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
5
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
6
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
7
|
+
};
|
|
8
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
9
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
10
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
11
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
12
|
+
};
|
|
13
|
+
var _FanboxClient_instances, _FanboxClient_baseUrl, _FanboxClient_headers, _FanboxClient_transport, _FanboxClient_get;
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.FanboxClient = exports.FanboxApiError = void 0;
|
|
16
|
+
const creator_get_js_1 = require("./endpoints/creator-get.js");
|
|
17
|
+
const creator_list_following_js_1 = require("./endpoints/creator-list-following.js");
|
|
18
|
+
const plan_list_creator_js_1 = require("./endpoints/plan-list-creator.js");
|
|
19
|
+
const plan_list_supporting_js_1 = require("./endpoints/plan-list-supporting.js");
|
|
20
|
+
const post_info_js_1 = require("./endpoints/post-info.js");
|
|
21
|
+
const post_list_creator_js_1 = require("./endpoints/post-list-creator.js");
|
|
22
|
+
const post_list_home_js_1 = require("./endpoints/post-list-home.js");
|
|
23
|
+
const post_list_supporting_js_1 = require("./endpoints/post-list-supporting.js");
|
|
24
|
+
const post_paginate_creator_js_1 = require("./endpoints/post-paginate-creator.js");
|
|
25
|
+
const fanbox_headers_js_1 = require("./fanbox-headers.js");
|
|
26
|
+
const http_js_1 = require("./http.js");
|
|
27
|
+
const DEFAULT_BASE_URL = "https://api.fanbox.cc";
|
|
28
|
+
class FanboxApiError extends Error {
|
|
29
|
+
constructor(response, body) {
|
|
30
|
+
super(`FANBOX API request failed: ${response.status} ${response.statusText}`);
|
|
31
|
+
this.name = "FanboxApiError";
|
|
32
|
+
this.body = body;
|
|
33
|
+
this.status = response.status;
|
|
34
|
+
this.statusText = response.statusText;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
exports.FanboxApiError = FanboxApiError;
|
|
38
|
+
class FanboxClient {
|
|
39
|
+
constructor(options = {}) {
|
|
40
|
+
_FanboxClient_instances.add(this);
|
|
41
|
+
_FanboxClient_baseUrl.set(this, void 0);
|
|
42
|
+
_FanboxClient_headers.set(this, void 0);
|
|
43
|
+
_FanboxClient_transport.set(this, void 0);
|
|
44
|
+
__classPrivateFieldSet(this, _FanboxClient_baseUrl, options.baseUrl ?? DEFAULT_BASE_URL, "f");
|
|
45
|
+
__classPrivateFieldSet(this, _FanboxClient_headers, (0, fanbox_headers_js_1.createFanboxRequestHeaders)({
|
|
46
|
+
cookie: options.cookie,
|
|
47
|
+
userAgent: options.userAgent,
|
|
48
|
+
}), "f");
|
|
49
|
+
__classPrivateFieldSet(this, _FanboxClient_transport, options.transport ?? new http_js_1.Http2Transport(), "f");
|
|
50
|
+
}
|
|
51
|
+
getCreator(params) {
|
|
52
|
+
return __classPrivateFieldGet(this, _FanboxClient_instances, "m", _FanboxClient_get).call(this, creator_get_js_1.CREATOR_GET_PATH, params);
|
|
53
|
+
}
|
|
54
|
+
getPost(params) {
|
|
55
|
+
return __classPrivateFieldGet(this, _FanboxClient_instances, "m", _FanboxClient_get).call(this, post_info_js_1.POST_INFO_PATH, params);
|
|
56
|
+
}
|
|
57
|
+
listCreatorPlans(params) {
|
|
58
|
+
return __classPrivateFieldGet(this, _FanboxClient_instances, "m", _FanboxClient_get).call(this, plan_list_creator_js_1.PLAN_LIST_CREATOR_PATH, params);
|
|
59
|
+
}
|
|
60
|
+
listCreatorPosts(params) {
|
|
61
|
+
return __classPrivateFieldGet(this, _FanboxClient_instances, "m", _FanboxClient_get).call(this, post_list_creator_js_1.POST_LIST_CREATOR_PATH, params);
|
|
62
|
+
}
|
|
63
|
+
listFollowingCreators() {
|
|
64
|
+
return __classPrivateFieldGet(this, _FanboxClient_instances, "m", _FanboxClient_get).call(this, creator_list_following_js_1.CREATOR_LIST_FOLLOWING_PATH);
|
|
65
|
+
}
|
|
66
|
+
listHomePosts(params = {}) {
|
|
67
|
+
return __classPrivateFieldGet(this, _FanboxClient_instances, "m", _FanboxClient_get).call(this, post_list_home_js_1.POST_LIST_HOME_PATH, params);
|
|
68
|
+
}
|
|
69
|
+
listSupportingPlans() {
|
|
70
|
+
return __classPrivateFieldGet(this, _FanboxClient_instances, "m", _FanboxClient_get).call(this, plan_list_supporting_js_1.PLAN_LIST_SUPPORTING_PATH);
|
|
71
|
+
}
|
|
72
|
+
listSupportingPosts(params = {}) {
|
|
73
|
+
return __classPrivateFieldGet(this, _FanboxClient_instances, "m", _FanboxClient_get).call(this, post_list_supporting_js_1.POST_LIST_SUPPORTING_PATH, params);
|
|
74
|
+
}
|
|
75
|
+
paginateCreatorPosts(params) {
|
|
76
|
+
return __classPrivateFieldGet(this, _FanboxClient_instances, "m", _FanboxClient_get).call(this, post_paginate_creator_js_1.POST_PAGINATE_CREATOR_PATH, params);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
exports.FanboxClient = FanboxClient;
|
|
80
|
+
_FanboxClient_baseUrl = new WeakMap(), _FanboxClient_headers = new WeakMap(), _FanboxClient_transport = new WeakMap(), _FanboxClient_instances = new WeakSet(), _FanboxClient_get = async function _FanboxClient_get(path, query = {}) {
|
|
81
|
+
const url = new URL(path, __classPrivateFieldGet(this, _FanboxClient_baseUrl, "f").endsWith("/") ? __classPrivateFieldGet(this, _FanboxClient_baseUrl, "f") : `${__classPrivateFieldGet(this, _FanboxClient_baseUrl, "f")}/`);
|
|
82
|
+
for (const [key, value] of Object.entries(query)) {
|
|
83
|
+
if (value !== undefined) {
|
|
84
|
+
url.searchParams.set(key, String(value));
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
const response = await __classPrivateFieldGet(this, _FanboxClient_transport, "f").request({
|
|
88
|
+
headers: __classPrivateFieldGet(this, _FanboxClient_headers, "f"),
|
|
89
|
+
method: "GET",
|
|
90
|
+
url,
|
|
91
|
+
});
|
|
92
|
+
const body = await readResponseBody(response);
|
|
93
|
+
if (!response.ok) {
|
|
94
|
+
throw new FanboxApiError(response, body);
|
|
95
|
+
}
|
|
96
|
+
return body.body;
|
|
97
|
+
};
|
|
98
|
+
async function readResponseBody(response) {
|
|
99
|
+
const text = await response.text();
|
|
100
|
+
try {
|
|
101
|
+
return JSON.parse(text);
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
return text;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AACA,+DAIoC;AACpC,qFAG+C;AAE/C,2EAI0C;AAC1C,iFAG6C;AAC7C,2DAIkC;AAClC,2EAI0C;AAC1C,qEAIuC;AACvC,iFAI6C;AAC7C,mFAI8C;AAC9C,2DAAiE;AACjE,uCAImB;AAEnB,MAAM,gBAAgB,GAAG,uBAAuB,CAAC;AAEjD,MAAa,cAAe,SAAQ,KAAK;IAKvC,YAAmB,QAAsB,EAAE,IAAa;QACtD,KAAK,CACH,8BAA8B,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CACvE,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;QAC9B,IAAI,CAAC,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAC;IACxC,CAAC;CACF;AAdD,wCAcC;AAED,MAAa,YAAY;IAKvB,YAAmB,UAA+B,EAAE;;QAJ3C,wCAAiB;QACjB,wCAAiC;QACjC,0CAA0B;QAGjC,uBAAA,IAAI,yBAAY,OAAO,CAAC,OAAO,IAAI,gBAAgB,MAAA,CAAC;QACpD,uBAAA,IAAI,yBAAY,IAAA,8CAA0B,EAAC;YACzC,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,SAAS,EAAE,OAAO,CAAC,SAAS;SAC7B,CAAC,MAAA,CAAC;QACH,uBAAA,IAAI,2BAAc,OAAO,CAAC,SAAS,IAAI,IAAI,wBAAc,EAAE,MAAA,CAAC;IAC9D,CAAC;IAEM,UAAU,CAAC,MAAwB;QACxC,OAAO,uBAAA,IAAI,kDAAK,MAAT,IAAI,EAAM,iCAAgB,EAAE,MAAM,CAAC,CAAC;IAC7C,CAAC;IAEM,OAAO,CAAC,MAAqB;QAClC,OAAO,uBAAA,IAAI,kDAAK,MAAT,IAAI,EAAM,6BAAc,EAAE,MAAM,CAAC,CAAC;IAC3C,CAAC;IAEM,gBAAgB,CACrB,MAA8B;QAE9B,OAAO,uBAAA,IAAI,kDAAK,MAAT,IAAI,EAAM,6CAAsB,EAAE,MAAM,CAAC,CAAC;IACnD,CAAC;IAEM,gBAAgB,CACrB,MAA8B;QAE9B,OAAO,uBAAA,IAAI,kDAAK,MAAT,IAAI,EAAM,6CAAsB,EAAE,MAAM,CAAC,CAAC;IACnD,CAAC;IAEM,qBAAqB;QAC1B,OAAO,uBAAA,IAAI,kDAAK,MAAT,IAAI,EAAM,uDAA2B,CAAC,CAAC;IAChD,CAAC;IAEM,aAAa,CAClB,SAA8B,EAAE;QAEhC,OAAO,uBAAA,IAAI,kDAAK,MAAT,IAAI,EAAM,uCAAmB,EAAE,MAAM,CAAC,CAAC;IAChD,CAAC;IAEM,mBAAmB;QACxB,OAAO,uBAAA,IAAI,kDAAK,MAAT,IAAI,EAAM,mDAAyB,CAAC,CAAC;IAC9C,CAAC;IAEM,mBAAmB,CACxB,SAAoC,EAAE;QAEtC,OAAO,uBAAA,IAAI,kDAAK,MAAT,IAAI,EAAM,mDAAyB,EAAE,MAAM,CAAC,CAAC;IACtD,CAAC;IAEM,oBAAoB,CACzB,MAAkC;QAElC,OAAO,uBAAA,IAAI,kDAAK,MAAT,IAAI,EAAM,qDAA0B,EAAE,MAAM,CAAC,CAAC;IACvD,CAAC;CAyBF;AAnFD,oCAmFC;oLAvBC,KAAK,4BAAS,IAAY,EAAE,QAAgB,EAAE;IAC5C,MAAM,GAAG,GAAG,IAAI,GAAG,CACjB,IAAI,EACJ,uBAAA,IAAI,6BAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,uBAAA,IAAI,6BAAS,CAAC,CAAC,CAAC,GAAG,uBAAA,IAAI,6BAAS,GAAG,CAClE,CAAC;IACF,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACjD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,uBAAA,IAAI,+BAAW,CAAC,OAAO,CAAC;QAC7C,OAAO,EAAE,uBAAA,IAAI,6BAAS;QACtB,MAAM,EAAE,KAAK;QACb,GAAG;KACJ,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAC9C,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC3C,CAAC;IAED,OAAQ,IAA0B,CAAC,IAAI,CAAC;AAC1C,CAAC;AAGH,KAAK,UAAU,gBAAgB,CAAC,QAAsB;IACpD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IACnC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAY,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { type HttpResponse, type HttpTransport } from "../http.js";
|
|
2
|
+
import type { RequestScheduler } from "./scheduler.js";
|
|
3
|
+
export interface AssetDownloaderOptions {
|
|
4
|
+
headers?: Record<string, string>;
|
|
5
|
+
scheduler: RequestScheduler;
|
|
6
|
+
transport?: HttpTransport;
|
|
7
|
+
}
|
|
8
|
+
export interface AssetDownloadOptions {
|
|
9
|
+
publishedDatetime: string;
|
|
10
|
+
relativePath: string;
|
|
11
|
+
rootDirectory: string;
|
|
12
|
+
url: string;
|
|
13
|
+
}
|
|
14
|
+
export interface AssetDownloadResult {
|
|
15
|
+
bytes: number;
|
|
16
|
+
sha256: string;
|
|
17
|
+
}
|
|
18
|
+
export declare class AssetDownloader {
|
|
19
|
+
#private;
|
|
20
|
+
constructor(options: AssetDownloaderOptions);
|
|
21
|
+
download(options: AssetDownloadOptions): Promise<AssetDownloadResult>;
|
|
22
|
+
}
|
|
23
|
+
export declare class AssetDownloadError extends Error {
|
|
24
|
+
readonly body: unknown;
|
|
25
|
+
readonly status: number;
|
|
26
|
+
readonly statusText: string;
|
|
27
|
+
readonly url: string;
|
|
28
|
+
constructor(response: HttpResponse, url: string, body: unknown);
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=asset.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"asset.d.ts","sourceRoot":"","sources":["../../../src/downloader/asset.ts"],"names":[],"mappings":"AAMA,OAAO,EAEL,KAAK,YAAY,EACjB,KAAK,aAAa,EACnB,MAAM,YAAY,CAAC;AAEpB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,MAAM,WAAW,sBAAsB;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,SAAS,EAAE,gBAAgB,CAAC;IAC5B,SAAS,CAAC,EAAE,aAAa,CAAC;CAC3B;AAED,MAAM,WAAW,oBAAoB;IACnC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,eAAe;;gBAKP,OAAO,EAAE,sBAAsB;IAMrC,QAAQ,CACnB,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,mBAAmB,CAAC;CA8ChC;AAED,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,SAAgB,IAAI,EAAE,OAAO,CAAC;IAC9B,SAAgB,MAAM,EAAE,MAAM,CAAC;IAC/B,SAAgB,UAAU,EAAE,MAAM,CAAC;IACnC,SAAgB,GAAG,EAAE,MAAM,CAAC;gBAET,QAAQ,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO;CAQtE"}
|