@opencoredev/social-sdk 0.1.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.
Files changed (155) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +24 -0
  3. package/dist/cli.d.ts +14 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +223 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/cloud/common.d.ts +26 -0
  8. package/dist/cloud/common.d.ts.map +1 -0
  9. package/dist/cloud/common.js +307 -0
  10. package/dist/cloud/common.js.map +1 -0
  11. package/dist/cloud/lifecycle.d.ts +11 -0
  12. package/dist/cloud/lifecycle.d.ts.map +1 -0
  13. package/dist/cloud/lifecycle.js +108 -0
  14. package/dist/cloud/lifecycle.js.map +1 -0
  15. package/dist/cloud/media.d.ts +24 -0
  16. package/dist/cloud/media.d.ts.map +1 -0
  17. package/dist/cloud/media.js +97 -0
  18. package/dist/cloud/media.js.map +1 -0
  19. package/dist/cloud/outcomes.d.ts +10 -0
  20. package/dist/cloud/outcomes.d.ts.map +1 -0
  21. package/dist/cloud/outcomes.js +188 -0
  22. package/dist/cloud/outcomes.js.map +1 -0
  23. package/dist/cloud/post-for-me.d.ts +70 -0
  24. package/dist/cloud/post-for-me.d.ts.map +1 -0
  25. package/dist/cloud/post-for-me.js +326 -0
  26. package/dist/cloud/post-for-me.js.map +1 -0
  27. package/dist/cloud/zernio.d.ts +112 -0
  28. package/dist/cloud/zernio.d.ts.map +1 -0
  29. package/dist/cloud/zernio.js +542 -0
  30. package/dist/cloud/zernio.js.map +1 -0
  31. package/dist/core/adapter.d.ts +118 -0
  32. package/dist/core/adapter.d.ts.map +1 -0
  33. package/dist/core/adapter.js +4 -0
  34. package/dist/core/adapter.js.map +1 -0
  35. package/dist/core/client.d.ts +108 -0
  36. package/dist/core/client.d.ts.map +1 -0
  37. package/dist/core/client.js +893 -0
  38. package/dist/core/client.js.map +1 -0
  39. package/dist/core/concurrency.d.ts +10 -0
  40. package/dist/core/concurrency.d.ts.map +1 -0
  41. package/dist/core/concurrency.js +78 -0
  42. package/dist/core/concurrency.js.map +1 -0
  43. package/dist/core/errors.d.ts +45 -0
  44. package/dist/core/errors.d.ts.map +1 -0
  45. package/dist/core/errors.js +44 -0
  46. package/dist/core/errors.js.map +1 -0
  47. package/dist/core/idempotency.d.ts +34 -0
  48. package/dist/core/idempotency.d.ts.map +1 -0
  49. package/dist/core/idempotency.js +59 -0
  50. package/dist/core/idempotency.js.map +1 -0
  51. package/dist/core/index.d.ts +7 -0
  52. package/dist/core/index.d.ts.map +1 -0
  53. package/dist/core/index.js +7 -0
  54. package/dist/core/index.js.map +1 -0
  55. package/dist/core/pagination.d.ts +12 -0
  56. package/dist/core/pagination.d.ts.map +1 -0
  57. package/dist/core/pagination.js +81 -0
  58. package/dist/core/pagination.js.map +1 -0
  59. package/dist/core/types.d.ts +329 -0
  60. package/dist/core/types.d.ts.map +1 -0
  61. package/dist/core/types.js +7 -0
  62. package/dist/core/types.js.map +1 -0
  63. package/dist/index.d.ts +2 -0
  64. package/dist/index.d.ts.map +1 -0
  65. package/dist/index.js +2 -0
  66. package/dist/index.js.map +1 -0
  67. package/dist/platforms/bluesky.d.ts +132 -0
  68. package/dist/platforms/bluesky.d.ts.map +1 -0
  69. package/dist/platforms/bluesky.js +1049 -0
  70. package/dist/platforms/bluesky.js.map +1 -0
  71. package/dist/platforms/instagram.d.ts +63 -0
  72. package/dist/platforms/instagram.d.ts.map +1 -0
  73. package/dist/platforms/instagram.js +676 -0
  74. package/dist/platforms/instagram.js.map +1 -0
  75. package/dist/platforms/linkedin.d.ts +54 -0
  76. package/dist/platforms/linkedin.d.ts.map +1 -0
  77. package/dist/platforms/linkedin.js +580 -0
  78. package/dist/platforms/linkedin.js.map +1 -0
  79. package/dist/platforms/threads.d.ts +102 -0
  80. package/dist/platforms/threads.d.ts.map +1 -0
  81. package/dist/platforms/threads.js +571 -0
  82. package/dist/platforms/threads.js.map +1 -0
  83. package/dist/platforms/tiktok.d.ts +32 -0
  84. package/dist/platforms/tiktok.d.ts.map +1 -0
  85. package/dist/platforms/tiktok.js +511 -0
  86. package/dist/platforms/tiktok.js.map +1 -0
  87. package/dist/platforms/x-engagement.d.ts +17 -0
  88. package/dist/platforms/x-engagement.d.ts.map +1 -0
  89. package/dist/platforms/x-engagement.js +47 -0
  90. package/dist/platforms/x-engagement.js.map +1 -0
  91. package/dist/platforms/x.d.ts +82 -0
  92. package/dist/platforms/x.d.ts.map +1 -0
  93. package/dist/platforms/x.js +511 -0
  94. package/dist/platforms/x.js.map +1 -0
  95. package/dist/platforms/youtube-upload.d.ts +33 -0
  96. package/dist/platforms/youtube-upload.d.ts.map +1 -0
  97. package/dist/platforms/youtube-upload.js +281 -0
  98. package/dist/platforms/youtube-upload.js.map +1 -0
  99. package/dist/platforms/youtube.d.ts +55 -0
  100. package/dist/platforms/youtube.d.ts.map +1 -0
  101. package/dist/platforms/youtube.js +561 -0
  102. package/dist/platforms/youtube.js.map +1 -0
  103. package/dist/server/connections.d.ts +124 -0
  104. package/dist/server/connections.d.ts.map +1 -0
  105. package/dist/server/connections.js +334 -0
  106. package/dist/server/connections.js.map +1 -0
  107. package/dist/server/credentials.d.ts +52 -0
  108. package/dist/server/credentials.d.ts.map +1 -0
  109. package/dist/server/credentials.js +115 -0
  110. package/dist/server/credentials.js.map +1 -0
  111. package/dist/server/index.d.ts +5 -0
  112. package/dist/server/index.d.ts.map +1 -0
  113. package/dist/server/index.js +5 -0
  114. package/dist/server/index.js.map +1 -0
  115. package/dist/server/oauth.d.ts +48 -0
  116. package/dist/server/oauth.d.ts.map +1 -0
  117. package/dist/server/oauth.js +483 -0
  118. package/dist/server/oauth.js.map +1 -0
  119. package/dist/server/webhooks.d.ts +58 -0
  120. package/dist/server/webhooks.d.ts.map +1 -0
  121. package/dist/server/webhooks.js +198 -0
  122. package/dist/server/webhooks.js.map +1 -0
  123. package/dist/testing/index.d.ts +47 -0
  124. package/dist/testing/index.d.ts.map +1 -0
  125. package/dist/testing/index.js +413 -0
  126. package/dist/testing/index.js.map +1 -0
  127. package/dist/testing.d.ts +2 -0
  128. package/dist/testing.d.ts.map +1 -0
  129. package/dist/testing.js +2 -0
  130. package/dist/testing.js.map +1 -0
  131. package/dist/transport/binary.d.ts +3 -0
  132. package/dist/transport/binary.d.ts.map +1 -0
  133. package/dist/transport/binary.js +30 -0
  134. package/dist/transport/binary.js.map +1 -0
  135. package/dist/transport/budget.d.ts +4 -0
  136. package/dist/transport/budget.d.ts.map +1 -0
  137. package/dist/transport/budget.js +27 -0
  138. package/dist/transport/budget.js.map +1 -0
  139. package/dist/transport/http.d.ts +44 -0
  140. package/dist/transport/http.d.ts.map +1 -0
  141. package/dist/transport/http.js +230 -0
  142. package/dist/transport/http.js.map +1 -0
  143. package/dist/transport/json.d.ts +3 -0
  144. package/dist/transport/json.d.ts.map +1 -0
  145. package/dist/transport/json.js +11 -0
  146. package/dist/transport/json.js.map +1 -0
  147. package/dist/transport/upload.d.ts +25 -0
  148. package/dist/transport/upload.d.ts.map +1 -0
  149. package/dist/transport/upload.js +133 -0
  150. package/dist/transport/upload.js.map +1 -0
  151. package/dist/transport/validation.d.ts +6 -0
  152. package/dist/transport/validation.d.ts.map +1 -0
  153. package/dist/transport/validation.js +24 -0
  154. package/dist/transport/validation.js.map +1 -0
  155. package/package.json +96 -0
@@ -0,0 +1,32 @@
1
+ import type { AdapterOperationContext, ConnectedAccountRef, JsonObject } from "../core/types.js";
2
+ export interface TikTokOptions {
3
+ readonly auth: {
4
+ readonly accessToken: string;
5
+ readonly openId: string;
6
+ };
7
+ /** Origins verified in the developer's TikTok app. PULL_FROM_URL requires ownership. */
8
+ readonly verifiedMediaOrigins: readonly string[];
9
+ readonly fetch?: typeof globalThis.fetch;
10
+ readonly clock?: () => Date;
11
+ }
12
+ export interface TikTokNative {
13
+ readonly creatorInfo: (account: ConnectedAccountRef, context: AdapterOperationContext) => Promise<JsonObject>;
14
+ readonly uploadDraft: (input: {
15
+ readonly account: ConnectedAccountRef;
16
+ readonly video: JsonObject;
17
+ readonly context: AdapterOperationContext;
18
+ }) => Promise<JsonObject>;
19
+ readonly listVideos: (input: {
20
+ readonly account: ConnectedAccountRef;
21
+ readonly cursor?: string;
22
+ readonly maxCount?: number;
23
+ readonly context: AdapterOperationContext;
24
+ }) => Promise<JsonObject>;
25
+ readonly publishStatus: (input: {
26
+ readonly account: ConnectedAccountRef;
27
+ readonly publishId: string;
28
+ readonly context: AdapterOperationContext;
29
+ }) => Promise<JsonObject>;
30
+ }
31
+ export declare function tiktok(options: TikTokOptions): import("../core/adapter.js").SocialAdapter<TikTokNative>;
32
+ //# sourceMappingURL=tiktok.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tiktok.d.ts","sourceRoot":"","sources":["../../src/platforms/tiktok.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,uBAAuB,EACvB,mBAAmB,EAEnB,UAAU,EAIX,MAAM,kBAAkB,CAAC;AAK1B,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE;QAAE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACzE,wFAAwF;IACxF,QAAQ,CAAC,oBAAoB,EAAE,SAAS,MAAM,EAAE,CAAC;IACjD,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;IACzC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,IAAI,CAAC;CAC7B;AACD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,WAAW,EAAE,CACpB,OAAO,EAAE,mBAAmB,EAC5B,OAAO,EAAE,uBAAuB,KAC7B,OAAO,CAAC,UAAU,CAAC,CAAC;IACzB,QAAQ,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE;QAC5B,QAAQ,CAAC,OAAO,EAAE,mBAAmB,CAAC;QACtC,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;QAC3B,QAAQ,CAAC,OAAO,EAAE,uBAAuB,CAAC;KAC3C,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,CAAC,KAAK,EAAE;QAC3B,QAAQ,CAAC,OAAO,EAAE,mBAAmB,CAAC;QACtC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAC3B,QAAQ,CAAC,OAAO,EAAE,uBAAuB,CAAC;KAC3C,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;IAC1B,QAAQ,CAAC,aAAa,EAAE,CAAC,KAAK,EAAE;QAC9B,QAAQ,CAAC,OAAO,EAAE,mBAAmB,CAAC;QACtC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;QAC3B,QAAQ,CAAC,OAAO,EAAE,uBAAuB,CAAC;KAC3C,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;CAC3B;AAkBD,wBAAgB,MAAM,CACpB,OAAO,EAAE,aAAa,GACrB,OAAO,oBAAoB,EAAE,aAAa,CAAC,YAAY,CAAC,CAimB1D"}
@@ -0,0 +1,511 @@
1
+ import { defineAdapter } from "../core/adapter.js";
2
+ import { SocialError } from "../core/errors.js";
3
+ import { managedHttp, publicFields } from "../cloud/common.js";
4
+ import { array, object, optionalNumber, optionalString, string } from "../transport/validation.js";
5
+ import { httpsUrl } from "../transport/upload.js";
6
+ const videoFields = [
7
+ "id",
8
+ "create_time",
9
+ "cover_image_url",
10
+ "share_url",
11
+ "title",
12
+ "video_description",
13
+ "duration",
14
+ "height",
15
+ "width",
16
+ "like_count",
17
+ "comment_count",
18
+ "share_count",
19
+ "view_count",
20
+ ];
21
+ export function tiktok(options) {
22
+ const request = managedHttp("https://open.tiktokapis.com", {
23
+ apiKey: options.auth.accessToken,
24
+ ...(options.fetch ? { fetch: options.fetch } : {}),
25
+ });
26
+ const origins = new Set(options.verifiedMediaOrigins.map((value) => httpsUrl(value).origin));
27
+ const now = () => (options.clock?.() ?? new Date()).toISOString();
28
+ const authorize = (ref, context) => {
29
+ if (ref.backend !== context.backendInstance ||
30
+ ref.platform !== "tiktok" ||
31
+ ref.accountId !== options.auth.openId)
32
+ throw new SocialError({
33
+ code: "unauthorized",
34
+ operation: "tiktok",
35
+ message: "Account reference does not belong to this TikTok authorization.",
36
+ });
37
+ };
38
+ const data = (value) => {
39
+ const response = object(value);
40
+ const error = object(response["error"]);
41
+ if (error["code"] !== "ok")
42
+ throw new SocialError({
43
+ code: error["code"] === "access_token_invalid"
44
+ ? "reconnect_required"
45
+ : error["code"] === "scope_not_authorized"
46
+ ? "missing_permission"
47
+ : "upstream_failure",
48
+ operation: "tiktok",
49
+ message: "TikTok rejected the operation. Check creator eligibility, scope grants, and app audit status.",
50
+ upstreamCode: string(error["code"]),
51
+ });
52
+ return object(response["data"]);
53
+ };
54
+ const creatorInfo = async (account, context) => {
55
+ authorize(account, context);
56
+ const creator = data(await request("/v2/post/publish/creator_info/query/", context, {}));
57
+ return {
58
+ accountId: account.accountId,
59
+ backend: account.backend,
60
+ fetchedAt: now(),
61
+ username: string(creator["creator_username"]),
62
+ nickname: string(creator["creator_nickname"]),
63
+ privacyLevels: array(creator["privacy_level_options"]).map(string),
64
+ commentDisabled: creator["comment_disabled"] === true,
65
+ duetDisabled: creator["duet_disabled"] === true,
66
+ stitchDisabled: creator["stitch_disabled"] === true,
67
+ maxVideoDurationSeconds: optionalNumber(creator["max_video_post_duration_sec"]) ?? null,
68
+ };
69
+ };
70
+ const prepare = (target) => {
71
+ const issues = [];
72
+ const fail = (code, message) => issues.push({ code, message, severity: "error", targetIndex: target.targetIndex });
73
+ if (target.account.platform !== "tiktok" || target.account.accountId !== options.auth.openId)
74
+ fail("tiktok.account", "Select the configured TikTok creator.");
75
+ const config = target.options === undefined ? {} : object(target.options);
76
+ if (config["consentGiven"] !== true)
77
+ fail("tiktok.consent", "The creator must preview the content and explicitly consent before transfer.");
78
+ for (const key of [
79
+ "disableComments",
80
+ "disableDuet",
81
+ "disableStitch",
82
+ "brandedContent",
83
+ "ownBrand",
84
+ "aiGenerated",
85
+ "draft",
86
+ ])
87
+ if (typeof config[key] !== "boolean")
88
+ fail(`tiktok.${key}`, `Explicit ${key} choice is required.`);
89
+ if (!config["creatorInfo"] || typeof config["creatorInfo"] !== "object")
90
+ fail("tiktok.creator_info", "Query creator information explicitly and render its choices before preparation.");
91
+ else {
92
+ const creator = object(config["creatorInfo"]);
93
+ if (creator["accountId"] !== target.account.accountId ||
94
+ creator["backend"] !== target.account.backend)
95
+ fail("tiktok.creator_mismatch", "Creator information belongs to a different account or backend.");
96
+ if (!array(creator["privacyLevels"]).includes(config["privacy"]))
97
+ fail("tiktok.privacy", "Choose a privacy level returned by this creator's information.");
98
+ }
99
+ const media = target.content.media ?? [];
100
+ const video = media.length === 1 && media[0]?.kind === "video";
101
+ if (!video &&
102
+ (media.length < 1 || media.length > 35 || media.some((item) => item.kind !== "image")))
103
+ fail("tiktok.media", "Choose one video or 1 to 35 photos; formats cannot be mixed.");
104
+ if ((target.content.text?.length ?? 0) > (video ? 2200 : 4000))
105
+ fail("tiktok.caption", "Caption exceeds TikTok's UTF-16 limit for this format.");
106
+ if (!video &&
107
+ config["title"] !== undefined &&
108
+ (typeof config["title"] !== "string" || config["title"].length > 90))
109
+ fail("tiktok.title", "Photo titles are limited to 90 UTF-16 code units.");
110
+ if (video && config["title"] !== undefined)
111
+ fail("tiktok.title", "Video captions use content.text; title is a photo-only option.");
112
+ if (!video &&
113
+ (typeof config["photoCoverIndex"] !== "number" ||
114
+ !Number.isInteger(config["photoCoverIndex"]) ||
115
+ config["photoCoverIndex"] < 0 ||
116
+ config["photoCoverIndex"] >= media.length))
117
+ fail("tiktok.cover", "Select a photo cover index within the attached images.");
118
+ for (const item of media) {
119
+ if (item.source.kind !== "https-url") {
120
+ fail("tiktok.source", "This slice uses verified PULL_FROM_URL media. Supply a URL on your TikTok-verified origin.");
121
+ continue;
122
+ }
123
+ try {
124
+ if (!origins.has(httpsUrl(item.source.url).origin))
125
+ fail("tiktok.origin", "Media origin is not configured as verified for this TikTok app.");
126
+ }
127
+ catch {
128
+ fail("tiktok.url", "Media requires a public HTTPS URL.");
129
+ }
130
+ const mime = item.mimeType;
131
+ if (mime !== undefined &&
132
+ !(item.kind === "video"
133
+ ? ["video/mp4", "video/quicktime", "video/webm"]
134
+ : ["image/jpeg", "image/webp"]).includes(mime))
135
+ fail("tiktok.mime", "Unsupported media MIME type for TikTok publishing.");
136
+ if (item.kind === "video" &&
137
+ (!Number.isFinite(item.durationSeconds) || (item.durationSeconds ?? 0) <= 0))
138
+ fail("tiktok.duration", "Provide known video duration to check the creator's duration limit.");
139
+ }
140
+ if (target.schedule || target.replyTo || target.content.link)
141
+ fail("tiktok.operation", "This publishing operation does not support schedules, replies, or structured links.");
142
+ return issues;
143
+ };
144
+ return defineAdapter({
145
+ id: "tiktok",
146
+ capabilities: {
147
+ schemaVersion: 1,
148
+ backend: "tiktok",
149
+ apiRevision: "Content Posting API v2",
150
+ runtime: ["node22", "node24", "bun"],
151
+ capabilities: [
152
+ {
153
+ platform: "tiktok",
154
+ operation: "posts.publish",
155
+ availability: "available",
156
+ formats: ["image", "video", "carousel"],
157
+ requiredScopes: ["video.publish"],
158
+ notes: "Verified URL source; explicit creator choices/consent. Public posting requires app audit. Draft mode uses video.upload.",
159
+ },
160
+ { platform: "tiktok", operation: "posts.status", availability: "available" },
161
+ { platform: "tiktok", operation: "posts.read", availability: "available" },
162
+ { platform: "tiktok", operation: "posts.list", availability: "available" },
163
+ {
164
+ platform: "tiktok",
165
+ operation: "posts.draft",
166
+ availability: "available",
167
+ requiredScopes: ["video.upload"],
168
+ },
169
+ { platform: "tiktok", operation: "posts.status.poll", availability: "available" },
170
+ {
171
+ platform: "tiktok",
172
+ operation: "comments.read",
173
+ availability: "unsupported-by-platform",
174
+ notes: "Standard Content Posting and Display APIs do not expose comments.",
175
+ },
176
+ {
177
+ platform: "tiktok",
178
+ operation: "messages.read",
179
+ availability: "unsupported-by-platform",
180
+ },
181
+ {
182
+ platform: "tiktok",
183
+ operation: "accounts.read",
184
+ availability: "available",
185
+ requiredScopes: ["user.info.basic"],
186
+ },
187
+ {
188
+ platform: "tiktok",
189
+ operation: "analytics.account.read",
190
+ availability: "available",
191
+ requiredScopes: ["user.info.stats"],
192
+ },
193
+ ],
194
+ },
195
+ accounts: {
196
+ async list(_input, context) {
197
+ const response = data(await request("/v2/user/info/", context, undefined, { fields: "open_id,display_name" }));
198
+ const user = object(response["user"]);
199
+ if (user["open_id"] !== options.auth.openId)
200
+ throw new SocialError({
201
+ code: "unauthorized",
202
+ operation: "accounts.read",
203
+ message: "TikTok returned a different authorized creator.",
204
+ });
205
+ return {
206
+ items: [
207
+ {
208
+ ref: {
209
+ kind: "connected-account",
210
+ version: 1,
211
+ backend: context.backendInstance,
212
+ platform: "tiktok",
213
+ accountId: options.auth.openId,
214
+ },
215
+ displayName: string(user["display_name"]),
216
+ status: "connected",
217
+ },
218
+ ],
219
+ };
220
+ },
221
+ async get(account, context) {
222
+ authorize(account, context);
223
+ const response = data(await request("/v2/user/info/", context, undefined, { fields: "open_id,display_name" }));
224
+ const user = object(response["user"]);
225
+ if (user["open_id"] !== account.accountId)
226
+ throw new SocialError({
227
+ code: "unauthorized",
228
+ operation: "accounts.read",
229
+ message: "TikTok creator identity mismatch.",
230
+ });
231
+ return {
232
+ ref: account,
233
+ displayName: string(user["display_name"]),
234
+ status: "connected",
235
+ };
236
+ },
237
+ },
238
+ posts: {
239
+ async get(ref, context) {
240
+ authorize(ref, context);
241
+ const result = data(await request("/v2/video/query/", context, { filters: { video_ids: [ref.postId] } }, {
242
+ fields: "id,create_time,cover_image_url,share_url,title,video_description,duration,height,width,like_count,comment_count,share_count,view_count",
243
+ }));
244
+ const row = array(result["videos"])
245
+ .map(object)
246
+ .find((video) => video["id"] === ref.postId);
247
+ if (!row)
248
+ throw new SocialError({
249
+ code: "upstream_failure",
250
+ operation: "posts.read",
251
+ message: "TikTok video was not found for this authorization.",
252
+ });
253
+ return publicFields(row, videoFields);
254
+ },
255
+ async list(account, input, context) {
256
+ authorize(account, context);
257
+ const limit = input.limit ?? 20;
258
+ const cursor = input.cursor === undefined ? 0 : Number(input.cursor);
259
+ if (!Number.isSafeInteger(limit) ||
260
+ limit < 1 ||
261
+ limit > 20 ||
262
+ !Number.isSafeInteger(cursor) ||
263
+ cursor < 0 ||
264
+ input.cursor === "")
265
+ throw new SocialError({
266
+ code: "invalid_input",
267
+ operation: "posts.read",
268
+ message: "TikTok requires a nonnegative cursor and page size from 1 to 20.",
269
+ });
270
+ const result = data(await request("/v2/video/list/", context, { cursor, max_count: limit }, {
271
+ fields: "id,create_time,cover_image_url,share_url,title,video_description,duration,height,width,like_count,comment_count,share_count,view_count",
272
+ }));
273
+ return {
274
+ items: array(result["videos"]).map((row) => publicFields(row, videoFields)),
275
+ ...(result["has_more"] === true &&
276
+ typeof result["cursor"] === "number" &&
277
+ Number.isSafeInteger(result["cursor"]) &&
278
+ result["cursor"] >= 0
279
+ ? { nextCursor: String(result["cursor"]) }
280
+ : {}),
281
+ };
282
+ },
283
+ prepareTarget: prepare,
284
+ async publishTarget(target, context) {
285
+ authorize(target.account, context);
286
+ const config = object(target.options);
287
+ const latest = await creatorInfo(target.account, context);
288
+ if (!array(latest["privacyLevels"]).includes(config["privacy"]))
289
+ throw new SocialError({
290
+ code: "invalid_input",
291
+ operation: "posts.publish",
292
+ message: "Creator privacy choices changed. Refresh the preview and ask the creator to select again.",
293
+ });
294
+ for (const [remote, choice] of [
295
+ ["commentDisabled", "disableComments"],
296
+ ["duetDisabled", "disableDuet"],
297
+ ["stitchDisabled", "disableStitch"],
298
+ ])
299
+ if (remote && choice && latest[remote] === true && config[choice] !== true)
300
+ throw new SocialError({
301
+ code: "invalid_input",
302
+ operation: "posts.publish",
303
+ message: "Creator interaction restrictions changed. Refresh the preview before publishing.",
304
+ });
305
+ const media = target.content.media ?? [];
306
+ const first = media[0];
307
+ if (!first || first.source.kind !== "https-url")
308
+ throw new SocialError({
309
+ code: "invalid_input",
310
+ operation: "posts.publish",
311
+ message: "Verified media URL required.",
312
+ });
313
+ if (first.kind === "video" &&
314
+ typeof latest["maxVideoDurationSeconds"] === "number" &&
315
+ (first.durationSeconds ?? Infinity) > latest["maxVideoDurationSeconds"])
316
+ throw new SocialError({
317
+ code: "invalid_input",
318
+ operation: "posts.publish",
319
+ message: "Video exceeds this creator's allowed duration.",
320
+ });
321
+ const postInfo = {
322
+ title: target.content.text ?? "",
323
+ privacy_level: string(config["privacy"]),
324
+ disable_comment: config["disableComments"] === true,
325
+ brand_content_toggle: config["brandedContent"] === true,
326
+ brand_organic_toggle: config["ownBrand"] === true,
327
+ };
328
+ const draft = config["draft"] === true;
329
+ let result;
330
+ if (first.kind === "video")
331
+ result = data(await request(draft ? "/v2/post/publish/inbox/video/init/" : "/v2/post/publish/video/init/", context, {
332
+ ...(draft
333
+ ? {}
334
+ : {
335
+ post_info: {
336
+ ...postInfo,
337
+ disable_duet: config["disableDuet"] === true,
338
+ disable_stitch: config["disableStitch"] === true,
339
+ is_aigc: config["aiGenerated"] === true,
340
+ },
341
+ }),
342
+ source_info: { source: "PULL_FROM_URL", video_url: first.source.url },
343
+ }));
344
+ else
345
+ result = data(await request("/v2/post/publish/content/init/", context, {
346
+ post_info: {
347
+ ...postInfo,
348
+ title: typeof config["title"] === "string" ? config["title"] : "",
349
+ description: target.content.text ?? "",
350
+ auto_add_music: false,
351
+ },
352
+ source_info: {
353
+ source: "PULL_FROM_URL",
354
+ photo_cover_index: typeof config["photoCoverIndex"] === "number" ? config["photoCoverIndex"] : 0,
355
+ photo_images: media.map((item) => item.source.kind === "https-url" ? item.source.url : ""),
356
+ },
357
+ post_mode: draft ? "MEDIA_UPLOAD" : "DIRECT_POST",
358
+ media_type: "PHOTO",
359
+ is_aigc: config["aiGenerated"] === true,
360
+ }));
361
+ return {
362
+ state: "accepted",
363
+ account: target.account,
364
+ targetIndex: target.targetIndex,
365
+ observedAt: now(),
366
+ backendState: "INITIALIZED",
367
+ delivery: {
368
+ kind: "delivery",
369
+ version: 1,
370
+ backend: target.account.backend,
371
+ platform: "tiktok",
372
+ accountId: target.account.accountId,
373
+ deliveryId: string(result["publish_id"]),
374
+ },
375
+ };
376
+ },
377
+ async getDelivery(ref, context) {
378
+ authorize(ref, context);
379
+ const result = data(await request("/v2/post/publish/status/fetch/", context, { publish_id: ref.deliveryId }));
380
+ const state = string(result["status"]);
381
+ const base = {
382
+ account: {
383
+ kind: "connected-account",
384
+ version: 1,
385
+ backend: ref.backend,
386
+ platform: "tiktok",
387
+ accountId: ref.accountId,
388
+ },
389
+ targetIndex: 0,
390
+ observedAt: now(),
391
+ backendState: state,
392
+ delivery: { kind: "delivery", version: 1, ...ref },
393
+ };
394
+ if (state === "FAILED")
395
+ return {
396
+ ...base,
397
+ state: "failed",
398
+ code: optionalString(result["fail_reason"]) ?? "upstream_failure",
399
+ message: "TikTok confirmed this publishing action failed.",
400
+ retryDisposition: { kind: "never" },
401
+ };
402
+ if (state === "PROCESSING_UPLOAD" || state === "PROCESSING_DOWNLOAD")
403
+ return { ...base, state: "processing" };
404
+ if (state === "SEND_TO_USER_INBOX")
405
+ return { ...base, state: "accepted" };
406
+ if (state === "PUBLISH_COMPLETE") {
407
+ const ids = result["publicaly_available_post_id"];
408
+ const id = Array.isArray(ids) && ids.length === 1 ? ids[0] : undefined;
409
+ const nativeId = typeof id === "string"
410
+ ? id
411
+ : typeof id === "number" && Number.isSafeInteger(id)
412
+ ? String(id)
413
+ : undefined;
414
+ if (nativeId)
415
+ return {
416
+ ...base,
417
+ state: "published",
418
+ post: {
419
+ kind: "platform-post",
420
+ version: 1,
421
+ backend: ref.backend,
422
+ platform: "tiktok",
423
+ accountId: ref.accountId,
424
+ postId: nativeId,
425
+ },
426
+ };
427
+ }
428
+ return {
429
+ ...base,
430
+ state: "unknown",
431
+ reason: "unmapped-state",
432
+ diagnostic: "Native public identifier is unavailable or provider status is unmapped. Retain the publishing reference for reconciliation.",
433
+ };
434
+ },
435
+ },
436
+ analytics: {
437
+ async getPostMetrics(post, context) {
438
+ // https://developers.tiktok.com/doc/research-api-specs-query-videos/
439
+ authorize(post, context);
440
+ const result = data(await request("/v2/video/query/", context, { filters: { video_ids: [post.postId] } }, { fields: "id,like_count,comment_count,share_count,view_count" }));
441
+ const row = array(result["videos"])
442
+ .map(object)
443
+ .find((video) => video["id"] === post.postId);
444
+ if (!row)
445
+ return [];
446
+ const fetchedAt = now();
447
+ return ["like_count", "comment_count", "share_count", "view_count"].flatMap((field) => typeof row[field] === "number" && Number.isFinite(row[field])
448
+ ? [
449
+ {
450
+ name: field,
451
+ value: row[field],
452
+ unit: "count",
453
+ period: "lifetime",
454
+ fetchedAt,
455
+ freshness: "unknown",
456
+ source: "tiktok:video.query",
457
+ },
458
+ ]
459
+ : []);
460
+ },
461
+ async getAccountMetrics(account, context) {
462
+ // https://developers.tiktok.com/doc/tiktok-api-v2-user-info/
463
+ authorize(account, context);
464
+ const response = data(await request("/v2/user/info/", context, undefined, {
465
+ fields: "open_id,display_name,follower_count,following_count,likes_count,video_count",
466
+ }));
467
+ const user = object(response["user"]);
468
+ if (user["open_id"] !== account.accountId)
469
+ throw new SocialError({
470
+ code: "unauthorized",
471
+ operation: "analytics.account.read",
472
+ message: "TikTok creator identity mismatch.",
473
+ });
474
+ const fetchedAt = now();
475
+ return ["follower_count", "following_count", "likes_count", "video_count"].flatMap((field) => typeof user[field] === "number" && Number.isFinite(user[field])
476
+ ? [
477
+ {
478
+ name: field,
479
+ value: user[field],
480
+ unit: "count",
481
+ period: "lifetime",
482
+ fetchedAt,
483
+ freshness: "unknown",
484
+ source: "tiktok:user.info.stats",
485
+ },
486
+ ]
487
+ : []);
488
+ },
489
+ },
490
+ native: {
491
+ creatorInfo,
492
+ async uploadDraft({ account, video, context }) {
493
+ authorize(account, context);
494
+ return data(await request("/v2/post/publish/inbox/video/init/", context, video));
495
+ },
496
+ async listVideos({ account, cursor, maxCount, context }) {
497
+ authorize(account, context);
498
+ return data(await request("/v2/video/list/", context, {
499
+ fields: [...videoFields],
500
+ max_count: maxCount ?? 20,
501
+ ...(cursor ? { cursor } : {}),
502
+ }));
503
+ },
504
+ async publishStatus({ account, publishId, context }) {
505
+ authorize(account, context);
506
+ return data(await request("/v2/post/publish/status/fetch/", context, { publish_id: publishId }));
507
+ },
508
+ },
509
+ });
510
+ }
511
+ //# sourceMappingURL=tiktok.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tiktok.js","sourceRoot":"","sources":["../../src/platforms/tiktok.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { AdapterOperationContext, ConnectedAccountRef } from "../core/types.js";
2
+ /** Credential-ready helper. Applications must authorize the acting account before calling. */
3
+ export interface XEngagementOptions {
4
+ readonly userId: string;
5
+ readonly accessToken: string;
6
+ readonly fetch?: typeof globalThis.fetch;
7
+ }
8
+ export interface XEngagementResult {
9
+ readonly liked: boolean;
10
+ readonly tweetId: string;
11
+ readonly userId: string;
12
+ }
13
+ /** Requires like.write, tweet.read, users.read and the app's current API access. Never retries writes. */
14
+ export declare function xLike(tweetId: string, account: ConnectedAccountRef, options: XEngagementOptions, context: AdapterOperationContext): Promise<XEngagementResult>;
15
+ /** Deletes only the authenticated user's like; it does not delete the target post. */
16
+ export declare function xUnlike(tweetId: string, account: ConnectedAccountRef, options: XEngagementOptions, context: AdapterOperationContext): Promise<XEngagementResult>;
17
+ //# sourceMappingURL=x-engagement.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"x-engagement.d.ts","sourceRoot":"","sources":["../../src/platforms/x-engagement.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAGrF,8FAA8F;AAC9F,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;CAC1C;AACD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAqDD,0GAA0G;AAC1G,wBAAgB,KAAK,CACnB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,mBAAmB,EAC5B,OAAO,EAAE,kBAAkB,EAC3B,OAAO,EAAE,uBAAuB,GAC/B,OAAO,CAAC,iBAAiB,CAAC,CAE5B;AACD,sFAAsF;AACtF,wBAAgB,OAAO,CACrB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,mBAAmB,EAC5B,OAAO,EAAE,kBAAkB,EAC3B,OAAO,EAAE,uBAAuB,GAC/B,OAAO,CAAC,iBAAiB,CAAC,CAE5B"}