@thisux/dunsocial-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 (48) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +168 -0
  3. package/dist/client.d.ts +39 -0
  4. package/dist/client.d.ts.map +1 -0
  5. package/dist/client.js +188 -0
  6. package/dist/errors.d.ts +21 -0
  7. package/dist/errors.d.ts.map +1 -0
  8. package/dist/errors.js +72 -0
  9. package/dist/index.d.ts +28 -0
  10. package/dist/index.d.ts.map +1 -0
  11. package/dist/index.js +32 -0
  12. package/dist/media-limits.d.ts +16 -0
  13. package/dist/media-limits.d.ts.map +1 -0
  14. package/dist/media-limits.js +49 -0
  15. package/dist/pagination.d.ts +4 -0
  16. package/dist/pagination.d.ts.map +1 -0
  17. package/dist/pagination.js +35 -0
  18. package/dist/resources/accounts.d.ts +22 -0
  19. package/dist/resources/accounts.d.ts.map +1 -0
  20. package/dist/resources/accounts.js +27 -0
  21. package/dist/resources/drafts.d.ts +16 -0
  22. package/dist/resources/drafts.d.ts.map +1 -0
  23. package/dist/resources/drafts.js +46 -0
  24. package/dist/resources/media.d.ts +15 -0
  25. package/dist/resources/media.d.ts.map +1 -0
  26. package/dist/resources/media.js +41 -0
  27. package/dist/resources/memory.d.ts +25 -0
  28. package/dist/resources/memory.d.ts.map +1 -0
  29. package/dist/resources/memory.js +40 -0
  30. package/dist/resources/personalization.d.ts +11 -0
  31. package/dist/resources/personalization.d.ts.map +1 -0
  32. package/dist/resources/personalization.js +22 -0
  33. package/dist/resources/posts.d.ts +27 -0
  34. package/dist/resources/posts.d.ts.map +1 -0
  35. package/dist/resources/posts.js +114 -0
  36. package/dist/resources/workspaces.d.ts +9 -0
  37. package/dist/resources/workspaces.d.ts.map +1 -0
  38. package/dist/resources/workspaces.js +13 -0
  39. package/dist/types.d.ts +205 -0
  40. package/dist/types.d.ts.map +1 -0
  41. package/dist/types.js +1 -0
  42. package/dist/version.d.ts +2 -0
  43. package/dist/version.d.ts.map +1 -0
  44. package/dist/version.js +1 -0
  45. package/dist/webhooks.d.ts +3 -0
  46. package/dist/webhooks.d.ts.map +1 -0
  47. package/dist/webhooks.js +62 -0
  48. package/package.json +53 -0
@@ -0,0 +1,205 @@
1
+ export type FetchLike = (input: string | URL | Request, init?: RequestInit) => Promise<Response>;
2
+ export interface DunSocialOptions {
3
+ token?: string;
4
+ workspaceId?: string;
5
+ baseUrl?: string;
6
+ fetch?: FetchLike;
7
+ timeoutMs?: number;
8
+ }
9
+ export type PostStatus = 'draft' | 'scheduled' | 'published' | 'failed' | 'cancelled';
10
+ export interface Post {
11
+ id: string;
12
+ status: PostStatus;
13
+ content?: string;
14
+ scheduledAt?: string | null;
15
+ publishedPostUrl?: string | null;
16
+ error?: string | null;
17
+ groupId?: string | null;
18
+ socialAccountId?: string;
19
+ mediaUrls?: string[];
20
+ [key: string]: unknown;
21
+ }
22
+ export interface Paginated<T> {
23
+ items: T[];
24
+ total: number;
25
+ limit: number;
26
+ offset: number;
27
+ hasMore: boolean;
28
+ }
29
+ export interface ValidateIssue {
30
+ socialAccountId: string | null;
31
+ platform: string;
32
+ code: string;
33
+ message: string;
34
+ }
35
+ export interface ValidatePostResult {
36
+ valid: boolean;
37
+ issues: ValidateIssue[];
38
+ }
39
+ export interface RedditPostOptions {
40
+ subreddit: string;
41
+ title: string;
42
+ kind: 'self' | 'link' | 'image' | 'video';
43
+ body?: string;
44
+ url?: string;
45
+ flairId?: string;
46
+ flairText?: string;
47
+ posterMediaAssetId?: string;
48
+ nsfw?: boolean;
49
+ spoiler?: boolean;
50
+ sendReplies?: boolean;
51
+ resubmit?: boolean;
52
+ }
53
+ export interface InstagramPostOptions {
54
+ format: 'feed_image' | 'carousel' | 'reel' | 'story';
55
+ caption?: string;
56
+ altText?: string;
57
+ shareToFeed?: boolean;
58
+ coverMediaAssetId?: string;
59
+ thumbOffset?: number;
60
+ audioName?: string;
61
+ collaborators?: string[];
62
+ }
63
+ export interface PinterestPostOptions {
64
+ boardId: string;
65
+ title: string;
66
+ description: string;
67
+ boardName?: string;
68
+ link?: string;
69
+ }
70
+ export interface TikTokPostOptions {
71
+ privacyLevel: 'PUBLIC_TO_EVERYONE' | 'MUTUAL_FOLLOW_FRIENDS' | 'FOLLOWER_OF_CREATOR' | 'SELF_ONLY';
72
+ title?: string;
73
+ disableComment?: boolean;
74
+ disableDuet?: boolean;
75
+ disableStitch?: boolean;
76
+ videoCoverTimestampMs?: number;
77
+ }
78
+ export interface PostMetadata {
79
+ reddit?: RedditPostOptions;
80
+ instagram?: InstagramPostOptions;
81
+ pinterest?: PinterestPostOptions;
82
+ tiktok?: TikTokPostOptions;
83
+ [key: string]: unknown;
84
+ }
85
+ export interface ValidatePostInput {
86
+ content: string;
87
+ socialAccountIds: string[];
88
+ mediaIds?: string[];
89
+ metadata?: PostMetadata;
90
+ throwOnInvalid?: boolean;
91
+ }
92
+ export interface SchedulePostInput extends ValidatePostInput {
93
+ scheduledAt: Date | string;
94
+ }
95
+ export interface PublishPostInput extends ValidatePostInput {
96
+ naturalPosting?: boolean;
97
+ }
98
+ export interface ThreadTweet {
99
+ content: string;
100
+ mediaIds?: string[];
101
+ }
102
+ export interface ScheduleThreadInput {
103
+ socialAccountId: string;
104
+ tweets: ThreadTweet[];
105
+ scheduledAt: Date | string;
106
+ metadata?: Record<string, unknown>;
107
+ }
108
+ export interface PublishThreadInput {
109
+ socialAccountId: string;
110
+ tweets: ThreadTweet[];
111
+ metadata?: Record<string, unknown>;
112
+ }
113
+ export interface WorkspaceSubscription {
114
+ status?: string;
115
+ planName?: string | null;
116
+ hasAccess?: boolean;
117
+ accessMessage?: string;
118
+ billingUrl?: string;
119
+ cancelAtPeriodEnd?: boolean;
120
+ currentPeriodEnd?: string | null;
121
+ }
122
+ export interface Workspace {
123
+ id: string;
124
+ name: string;
125
+ slug: string;
126
+ logo?: string | null;
127
+ timezone?: string;
128
+ role?: string;
129
+ subscription?: WorkspaceSubscription;
130
+ }
131
+ export interface SocialAccount {
132
+ id: string;
133
+ providerId?: string;
134
+ providerName: string;
135
+ username?: string | null;
136
+ displayName?: string | null;
137
+ profileImageUrl?: string | null;
138
+ isConnected?: boolean;
139
+ needsReconnect?: boolean;
140
+ [key: string]: unknown;
141
+ }
142
+ export interface MediaAsset {
143
+ id: string;
144
+ originalFilename?: string;
145
+ mimeType?: string;
146
+ fileSize?: number;
147
+ previewUrl?: string;
148
+ altText?: string | null;
149
+ [key: string]: unknown;
150
+ }
151
+ export interface UploadInput {
152
+ file: Uint8Array | ArrayBuffer | Blob;
153
+ filename: string;
154
+ mimeType: string;
155
+ altText?: string;
156
+ }
157
+ export interface Personalization {
158
+ description?: string;
159
+ tone?: string;
160
+ style?: string;
161
+ personality?: string;
162
+ }
163
+ export type WebhookEventType = 'post.scheduled' | 'post.rescheduled' | 'post.cancelled' | 'post.published' | 'post.publish_failed' | 'social_account.reconnect_required';
164
+ export interface WebhookEvent {
165
+ id: string;
166
+ type: WebhookEventType;
167
+ apiVersion: string;
168
+ createdAt: string;
169
+ workspace: {
170
+ id: string;
171
+ name?: string;
172
+ slug?: string;
173
+ };
174
+ data: Record<string, unknown>;
175
+ }
176
+ export interface WebhookHeaders {
177
+ signature: string;
178
+ timestamp: string | number;
179
+ }
180
+ export interface ConstructEventOptions {
181
+ toleranceSec?: number;
182
+ nowSec?: number;
183
+ }
184
+ export interface ListPostsQuery {
185
+ status?: PostStatus;
186
+ socialAccountId?: string;
187
+ groupId?: string;
188
+ limit?: number;
189
+ offset?: number;
190
+ }
191
+ export interface CreateDraftInput {
192
+ content: string;
193
+ name?: string;
194
+ socialAccountIds?: string[];
195
+ selectedPlatforms?: string[];
196
+ mediaIds?: string[];
197
+ platformContent?: Record<string, string>;
198
+ platformMedia?: Record<string, string[]>;
199
+ }
200
+ export interface CreateCollectionInput {
201
+ name: string;
202
+ color?: 'red' | 'orange' | 'yellow' | 'green' | 'teal' | 'blue' | 'purple' | 'pink';
203
+ isPrivate?: boolean;
204
+ }
205
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,2 @@
1
+ export declare const SDK_VERSION = "0.1.0";
2
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW,UAAU,CAAC"}
@@ -0,0 +1 @@
1
+ export const SDK_VERSION = '0.1.0'; // x-release-please-version
@@ -0,0 +1,3 @@
1
+ import type { ConstructEventOptions, WebhookEvent, WebhookHeaders } from './types';
2
+ export declare function constructEvent(rawBody: string, headers: WebhookHeaders, secret: string, options?: ConstructEventOptions): Promise<WebhookEvent>;
3
+ //# sourceMappingURL=webhooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhooks.d.ts","sourceRoot":"","sources":["../src/webhooks.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAInF,wBAAsB,cAAc,CACnC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,qBAA0B,GACjC,OAAO,CAAC,YAAY,CAAC,CAqCvB"}
@@ -0,0 +1,62 @@
1
+ import { DunSocialError } from './errors';
2
+ const DEFAULT_TOLERANCE_SEC = 300;
3
+ export async function constructEvent(rawBody, headers, secret, options = {}) {
4
+ if (!rawBody) {
5
+ throw new DunSocialError('Webhook body is empty. Pass the raw request text.', {
6
+ code: 'webhook_signature'
7
+ });
8
+ }
9
+ if (!secret) {
10
+ throw new DunSocialError('Webhook secret is required.', { code: 'missing_config' });
11
+ }
12
+ const timestamp = Number(headers.timestamp);
13
+ if (!Number.isFinite(timestamp)) {
14
+ throw new DunSocialError('Missing or invalid X-DunSocial-Timestamp.', {
15
+ code: 'webhook_timestamp'
16
+ });
17
+ }
18
+ const nowSec = options.nowSec ?? Math.floor(Date.now() / 1000);
19
+ const tolerance = options.toleranceSec ?? DEFAULT_TOLERANCE_SEC;
20
+ if (Math.abs(nowSec - timestamp) > tolerance) {
21
+ throw new DunSocialError(`Webhook timestamp is outside the ${tolerance}s replay window.`, { code: 'webhook_timestamp', details: { timestamp, nowSec, tolerance } });
22
+ }
23
+ const expected = `v1=${await hmacSha256Hex(secret, `${timestamp}.${rawBody}`)}`;
24
+ const provided = headers.signature?.trim() ?? '';
25
+ if (!provided || !timingSafeEqual(provided, expected)) {
26
+ throw new DunSocialError('Webhook signature mismatch.', { code: 'webhook_signature' });
27
+ }
28
+ try {
29
+ return JSON.parse(rawBody);
30
+ }
31
+ catch {
32
+ throw new DunSocialError('Webhook body is not valid JSON.', { code: 'validation' });
33
+ }
34
+ }
35
+ async function hmacSha256Hex(secret, message) {
36
+ const cryptoObj = globalThis.crypto;
37
+ if (!cryptoObj?.subtle) {
38
+ throw new DunSocialError('Web Crypto is required to verify webhook signatures.', {
39
+ code: 'missing_config'
40
+ });
41
+ }
42
+ const key = await cryptoObj.subtle.importKey('raw', encoder().encode(secret), { name: 'HMAC', hash: 'SHA-256' }, false, ['sign']);
43
+ const sig = await cryptoObj.subtle.sign('HMAC', key, encoder().encode(message));
44
+ return [...new Uint8Array(sig)].map((b) => b.toString(16).padStart(2, '0')).join('');
45
+ }
46
+ function timingSafeEqual(a, b) {
47
+ const left = encoder().encode(a);
48
+ const right = encoder().encode(b);
49
+ if (left.length !== right.length) {
50
+ let acc = 0;
51
+ for (let i = 0; i < left.length; i++)
52
+ acc |= left[i];
53
+ return false;
54
+ }
55
+ let diff = 0;
56
+ for (let i = 0; i < left.length; i++)
57
+ diff |= left[i] ^ right[i];
58
+ return diff === 0;
59
+ }
60
+ function encoder() {
61
+ return new TextEncoder();
62
+ }
package/package.json ADDED
@@ -0,0 +1,53 @@
1
+ {
2
+ "name": "@thisux/dunsocial-sdk",
3
+ "version": "0.1.0",
4
+ "description": "TypeScript SDK for the DunSocial REST API — schedule, publish, upload media, and verify webhooks.",
5
+ "type": "module",
6
+ "private": false,
7
+ "license": "MIT",
8
+ "homepage": "https://www.dunsocial.com/docs/sdk",
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "git+https://github.com/thisuxhq/dunpostsapp.git",
12
+ "directory": "sdks/typescript"
13
+ },
14
+ "keywords": [
15
+ "dunsocial",
16
+ "sdk",
17
+ "social-media",
18
+ "scheduler",
19
+ "typescript"
20
+ ],
21
+ "exports": {
22
+ ".": {
23
+ "types": "./dist/index.d.ts",
24
+ "import": "./dist/index.js"
25
+ }
26
+ },
27
+ "main": "./dist/index.js",
28
+ "types": "./dist/index.d.ts",
29
+ "files": [
30
+ "dist",
31
+ "README.md",
32
+ "LICENSE"
33
+ ],
34
+ "publishConfig": {
35
+ "access": "public"
36
+ },
37
+ "engines": {
38
+ "node": ">=20"
39
+ },
40
+ "packageManager": "bun@1.3.8",
41
+ "scripts": {
42
+ "build": "tsc -p tsconfig.build.json",
43
+ "type-check": "tsc --noEmit",
44
+ "test": "bun test",
45
+ "types:openapi": "openapi-typescript ../openapi/openapi.yaml -o src/generated/openapi.d.ts",
46
+ "release-check": "bun run scripts/release-check.ts"
47
+ },
48
+ "devDependencies": {
49
+ "@types/bun": "1.3.14",
50
+ "openapi-typescript": "^7.10.1",
51
+ "typescript": "^5.9.2"
52
+ }
53
+ }