@venturekit-pro/social 0.0.48 → 0.0.51
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/dist/adapters/facebook.d.ts +6 -0
- package/dist/adapters/facebook.d.ts.map +1 -1
- package/dist/adapters/facebook.js +4 -4
- package/dist/adapters/facebook.js.map +1 -1
- package/dist/adapters/linkedin.d.ts +6 -0
- package/dist/adapters/linkedin.d.ts.map +1 -1
- package/dist/adapters/linkedin.js +6 -6
- package/dist/adapters/linkedin.js.map +1 -1
- package/dist/media.d.ts +22 -8
- package/dist/media.d.ts.map +1 -1
- package/dist/media.js +45 -43
- package/dist/media.js.map +1 -1
- package/package.json +6 -5
|
@@ -36,6 +36,7 @@
|
|
|
36
36
|
* dependency. The constraints allow WebP so validation doesn't block
|
|
37
37
|
* the post before the adapter can convert it.
|
|
38
38
|
*/
|
|
39
|
+
import type { OutboundPolicyOverrides } from '@venturekit/integrations/net';
|
|
39
40
|
import type { SocialAdapter } from '../adapter.js';
|
|
40
41
|
import type { SocialPlatformConstraints } from '../types.js';
|
|
41
42
|
export declare const FACEBOOK_CONSTRAINTS: SocialPlatformConstraints;
|
|
@@ -43,6 +44,11 @@ export interface FacebookAdapterConfig {
|
|
|
43
44
|
baseUrl?: string;
|
|
44
45
|
graphVersion?: string;
|
|
45
46
|
constraints?: Partial<SocialPlatformConstraints>;
|
|
47
|
+
/**
|
|
48
|
+
* Outbound policy for downloading `media[].url` before upload. Secure by
|
|
49
|
+
* default (public `https:` only); open an internal media host here.
|
|
50
|
+
*/
|
|
51
|
+
mediaPolicy?: OutboundPolicyOverrides;
|
|
46
52
|
}
|
|
47
53
|
export declare function createFacebookAdapter(config?: FacebookAdapterConfig): SocialAdapter;
|
|
48
54
|
//# sourceMappingURL=facebook.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"facebook.d.ts","sourceRoot":"","sources":["../../src/adapters/facebook.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,KAAK,EAIV,yBAAyB,EAE1B,MAAM,aAAa,CAAC;AAmBrB,eAAO,MAAM,oBAAoB,EAAE,yBAelC,CAAC;AAEF,MAAM,WAAW,qBAAqB;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,OAAO,CAAC,yBAAyB,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"facebook.d.ts","sourceRoot":"","sources":["../../src/adapters/facebook.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AAEH,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAC5E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,KAAK,EAIV,yBAAyB,EAE1B,MAAM,aAAa,CAAC;AAmBrB,eAAO,MAAM,oBAAoB,EAAE,yBAelC,CAAC;AAEF,MAAM,WAAW,qBAAqB;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,OAAO,CAAC,yBAAyB,CAAC,CAAC;IACjD;;;OAGG;IACH,WAAW,CAAC,EAAE,uBAAuB,CAAC;CACvC;AAED,wBAAgB,qBAAqB,CACnC,MAAM,GAAE,qBAA0B,GACjC,aAAa,CA2Hf"}
|
|
@@ -106,7 +106,7 @@ export function createFacebookAdapter(config = {}) {
|
|
|
106
106
|
// anything.
|
|
107
107
|
if (mediaCount === 1) {
|
|
108
108
|
const endpoint = `/${version}/${encodeURIComponent(pageId)}/photos`;
|
|
109
|
-
const form = await photoForm(post.media[0], constraints.maxMediaSizeBytes);
|
|
109
|
+
const form = await photoForm(post.media[0], constraints.maxMediaSizeBytes, config.mediaPolicy);
|
|
110
110
|
form.append('message', post.body);
|
|
111
111
|
// Do NOT set Content-Type manually — fetch() sets the multipart
|
|
112
112
|
// boundary automatically from FormData. A manual header would
|
|
@@ -127,7 +127,7 @@ export function createFacebookAdapter(config = {}) {
|
|
|
127
127
|
const feedEndpoint = `/${version}/${encodeURIComponent(pageId)}/feed`;
|
|
128
128
|
const attachedMedia = [];
|
|
129
129
|
for (const media of post.media) {
|
|
130
|
-
const form = await photoForm(media, constraints.maxMediaSizeBytes);
|
|
130
|
+
const form = await photoForm(media, constraints.maxMediaSizeBytes, config.mediaPolicy);
|
|
131
131
|
form.append('published', 'false');
|
|
132
132
|
const uploadRes = await vendorFetch('facebook', `${baseUrl}${photosEndpoint}`, {
|
|
133
133
|
method: 'POST',
|
|
@@ -206,8 +206,8 @@ function parseResult(res, post) {
|
|
|
206
206
|
* The caller appends the fields that differ per flow (`message` for a
|
|
207
207
|
* single photo, `published=false` for an album member).
|
|
208
208
|
*/
|
|
209
|
-
async function photoForm(media, maxBytes) {
|
|
210
|
-
const downloaded = await downloadMedia(media.url, 'facebook', { maxBytes });
|
|
209
|
+
async function photoForm(media, maxBytes, outboundPolicy) {
|
|
210
|
+
const downloaded = await downloadMedia(media.url, 'facebook', { maxBytes, outboundPolicy });
|
|
211
211
|
const { bytes, mimeType } = await ensureUploadableImage(downloaded, media.mimeType, FACEBOOK_UPLOAD_MIME, 'facebook');
|
|
212
212
|
const form = new FormData();
|
|
213
213
|
form.append('source', new Blob([bytes], { type: mimeType }), filenameForMime(mimeType));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"facebook.js","sourceRoot":"","sources":["../../src/adapters/facebook.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;
|
|
1
|
+
{"version":3,"file":"facebook.js","sourceRoot":"","sources":["../../src/adapters/facebook.ts"],"names":[],"mappings":"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"}
|
|
@@ -31,6 +31,7 @@
|
|
|
31
31
|
* upload. Conversion requires the optional `sharp` peer dependency;
|
|
32
32
|
* if it's not installed, the adapter throws a clear error.
|
|
33
33
|
*/
|
|
34
|
+
import type { OutboundPolicyOverrides } from '@venturekit/integrations/net';
|
|
34
35
|
import type { SocialAdapter } from '../adapter.js';
|
|
35
36
|
import type { SocialPlatformConstraints } from '../types.js';
|
|
36
37
|
export declare const LINKEDIN_CONSTRAINTS: SocialPlatformConstraints;
|
|
@@ -39,6 +40,11 @@ export interface LinkedInAdapterConfig {
|
|
|
39
40
|
baseUrl?: string;
|
|
40
41
|
/** Per-platform constraint overrides (e.g. stricter byline rules). */
|
|
41
42
|
constraints?: Partial<SocialPlatformConstraints>;
|
|
43
|
+
/**
|
|
44
|
+
* Outbound policy for downloading `media[].url` before staging. Secure by
|
|
45
|
+
* default (public `https:` only); open an internal media host here.
|
|
46
|
+
*/
|
|
47
|
+
mediaPolicy?: OutboundPolicyOverrides;
|
|
42
48
|
}
|
|
43
49
|
/**
|
|
44
50
|
* Construct a LinkedIn adapter. Constraints can be overridden for
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"linkedin.d.ts","sourceRoot":"","sources":["../../src/adapters/linkedin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,KAAK,EAIV,yBAAyB,EAG1B,MAAM,aAAa,CAAC;AAkBrB,eAAO,MAAM,oBAAoB,EAAE,yBAUlC,CAAC;AAEF,MAAM,WAAW,qBAAqB;IACpC,kEAAkE;IAClE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sEAAsE;IACtE,WAAW,CAAC,EAAE,OAAO,CAAC,yBAAyB,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"linkedin.d.ts","sourceRoot":"","sources":["../../src/adapters/linkedin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAC5E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,KAAK,EAIV,yBAAyB,EAG1B,MAAM,aAAa,CAAC;AAkBrB,eAAO,MAAM,oBAAoB,EAAE,yBAUlC,CAAC;AAEF,MAAM,WAAW,qBAAqB;IACpC,kEAAkE;IAClE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sEAAsE;IACtE,WAAW,CAAC,EAAE,OAAO,CAAC,yBAAyB,CAAC,CAAC;IACjD;;;OAGG;IACH,WAAW,CAAC,EAAE,uBAAuB,CAAC;CACvC;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,GAAE,qBAA0B,GACjC,aAAa,CAiFf"}
|
|
@@ -89,7 +89,7 @@ export function createLinkedInAdapter(config = {}) {
|
|
|
89
89
|
}
|
|
90
90
|
else {
|
|
91
91
|
// Auto-stage: download → initializeUpload → PUT bytes → URN.
|
|
92
|
-
stagedMedia.push(await stageImage(baseUrl, credentials, m, constraints.maxMediaSizeBytes));
|
|
92
|
+
stagedMedia.push(await stageImage(baseUrl, credentials, m, constraints.maxMediaSizeBytes, config.mediaPolicy));
|
|
93
93
|
}
|
|
94
94
|
}
|
|
95
95
|
// Use the Posts API (/rest/posts). The older UGC Posts API
|
|
@@ -141,11 +141,11 @@ export function createLinkedInAdapter(config = {}) {
|
|
|
141
141
|
* The older Assets API returned `urn:li:digitalmediaAsset:...` URNs
|
|
142
142
|
* which the Posts API rejects.
|
|
143
143
|
*/
|
|
144
|
-
async function stageImage(baseUrl, credentials, media, maxBytes) {
|
|
145
|
-
// Download the image (the calling process can reach presigned
|
|
146
|
-
//
|
|
147
|
-
// the
|
|
148
|
-
const downloaded = await downloadMedia(media.url, 'linkedin', { maxBytes });
|
|
144
|
+
async function stageImage(baseUrl, credentials, media, maxBytes, outboundPolicy) {
|
|
145
|
+
// Download the image (the calling process can reach presigned URLs
|
|
146
|
+
// LinkedIn's servers cannot), then transcode if the image recipe won't
|
|
147
|
+
// take the format. The download runs under the outbound policy.
|
|
148
|
+
const downloaded = await downloadMedia(media.url, 'linkedin', { maxBytes, outboundPolicy });
|
|
149
149
|
const { bytes, mimeType } = await ensureUploadableImage(downloaded, media.mimeType, LINKEDIN_ACCEPTED_MIME, 'linkedin');
|
|
150
150
|
// Step 1: initialize the upload via the Images API.
|
|
151
151
|
const initBody = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"linkedin.js","sourceRoot":"","sources":["../../src/adapters/linkedin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;
|
|
1
|
+
{"version":3,"file":"linkedin.js","sourceRoot":"","sources":["../../src/adapters/linkedin.ts"],"names":[],"mappings":"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"}
|
package/dist/media.d.ts
CHANGED
|
@@ -11,27 +11,41 @@
|
|
|
11
11
|
* their own `SocialPlatformKey` and their own accepted-MIME set, so
|
|
12
12
|
* the download + convert logic exists exactly once.
|
|
13
13
|
*/
|
|
14
|
+
import { type OutboundPolicyOverrides } from '@venturekit/integrations/net';
|
|
14
15
|
import { type SocialPlatformKey } from './types.js';
|
|
16
|
+
/**
|
|
17
|
+
* Ceiling when a platform declares no size limit (`maxBytes: -1`): a
|
|
18
|
+
* download is always bounded, whatever the platform accepts.
|
|
19
|
+
*/
|
|
20
|
+
export declare const UNCAPPED_MEDIA_MAX_BYTES: number;
|
|
15
21
|
export interface DownloadMediaOptions {
|
|
16
22
|
/**
|
|
17
|
-
* Reject payloads larger than this, in bytes.
|
|
18
|
-
*
|
|
23
|
+
* Reject payloads larger than this, in bytes. `-1` (a platform with no
|
|
24
|
+
* limit, see `SocialPlatformConstraints.maxMediaSizeBytes`) applies
|
|
25
|
+
* {@link UNCAPPED_MEDIA_MAX_BYTES}.
|
|
19
26
|
*/
|
|
20
27
|
maxBytes: number;
|
|
21
28
|
/** Abort the download after this long. Defaults to 30s. */
|
|
22
29
|
timeoutMs?: number;
|
|
30
|
+
/**
|
|
31
|
+
* Overrides of the outbound policy the download runs under. The default
|
|
32
|
+
* reaches public `https:` hosts only (plus local services under
|
|
33
|
+
* `vk dev`); open an internal media host explicitly, e.g.
|
|
34
|
+
* `{ allowNonPublic: (d) => d.hostname === 'minio.internal' }`.
|
|
35
|
+
*/
|
|
36
|
+
outboundPolicy?: OutboundPolicyOverrides;
|
|
23
37
|
}
|
|
24
38
|
/**
|
|
25
39
|
* Download media bytes from a URL the calling process can reach.
|
|
26
40
|
*
|
|
41
|
+
* Runs through `secureFetch`: the URL — and every redirect and DNS answer
|
|
42
|
+
* behind it — must be a public `https:` destination unless
|
|
43
|
+
* {@link DownloadMediaOptions.outboundPolicy} opens more, so a media URL
|
|
44
|
+
* cannot be used to make the publishing worker read from its own network.
|
|
45
|
+
*
|
|
27
46
|
* Throws `SocialValidationError` for problems that will never resolve
|
|
28
|
-
* on retry (unusable scheme, oversized payload) and
|
|
47
|
+
* on retry (refused destination, unusable scheme, oversized payload) and
|
|
29
48
|
* `SocialPublishError` for transport failures the caller may retry.
|
|
30
|
-
*
|
|
31
|
-
* Only `http(s)` is accepted. The package cannot know which hosts are
|
|
32
|
-
* safe for a given deployment, so callers that accept user-supplied
|
|
33
|
-
* media URLs remain responsible for blocking internal targets
|
|
34
|
-
* (link-local, RFC1918, cloud metadata endpoints).
|
|
35
49
|
*/
|
|
36
50
|
export declare function downloadMedia(url: string, platform: SocialPlatformKey, opts: DownloadMediaOptions): Promise<Uint8Array>;
|
|
37
51
|
/**
|
package/dist/media.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"media.d.ts","sourceRoot":"","sources":["../src/media.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAGL,KAAK,iBAAiB,EACvB,MAAM,YAAY,CAAC;AAQpB,MAAM,WAAW,oBAAoB;IACnC
|
|
1
|
+
{"version":3,"file":"media.d.ts","sourceRoot":"","sources":["../src/media.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAIL,KAAK,uBAAuB,EAC7B,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAGL,KAAK,iBAAiB,EACvB,MAAM,YAAY,CAAC;AAQpB;;;GAGG;AACH,eAAO,MAAM,wBAAwB,QAAmB,CAAC;AAEzD,MAAM,WAAW,oBAAoB;IACnC;;;;OAIG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB,2DAA2D;IAC3D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;OAKG;IACH,cAAc,CAAC,EAAE,uBAAuB,CAAC;CAC1C;AAYD;;;;;;;;;;;GAWG;AACH,wBAAsB,aAAa,CACjC,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,iBAAiB,EAC3B,IAAI,EAAE,oBAAoB,GACzB,OAAO,CAAC,UAAU,CAAC,CA8CrB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,UAAU,EACjB,gBAAgB,EAAE,MAAM,EACxB,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,EAC7B,QAAQ,EAAE,iBAAiB,GAC1B,OAAO,CAAC;IAAE,KAAK,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAMlD;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,GAAG,SAAS,CA4BpE;AAED,0HAA0H;AAC1H,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGxD"}
|
package/dist/media.js
CHANGED
|
@@ -11,57 +11,74 @@
|
|
|
11
11
|
* their own `SocialPlatformKey` and their own accepted-MIME set, so
|
|
12
12
|
* the download + convert logic exists exactly once.
|
|
13
13
|
*/
|
|
14
|
+
import { OutboundRequestBlockedError, OutboundResponseTooLargeError, secureFetch, } from '@venturekit/integrations/net';
|
|
14
15
|
import { SocialPublishError, SocialValidationError, } from './types.js';
|
|
15
16
|
/** The format every adapter in this package can fall back to. */
|
|
16
17
|
const JPEG_MIME = 'image/jpeg';
|
|
17
18
|
/** Matches `vendorFetch`'s default so all outbound calls behave alike. */
|
|
18
19
|
const DEFAULT_TIMEOUT_MS = 30_000;
|
|
20
|
+
/**
|
|
21
|
+
* Ceiling when a platform declares no size limit (`maxBytes: -1`): a
|
|
22
|
+
* download is always bounded, whatever the platform accepts.
|
|
23
|
+
*/
|
|
24
|
+
export const UNCAPPED_MEDIA_MAX_BYTES = 50 * 1024 * 1024;
|
|
25
|
+
/** Strip the query (presigned URLs carry credentials there) from a URL shown in an error. */
|
|
26
|
+
function describeUrl(url) {
|
|
27
|
+
try {
|
|
28
|
+
const parsed = new URL(url);
|
|
29
|
+
return `${parsed.origin}${parsed.pathname}`;
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return '<invalid url>';
|
|
33
|
+
}
|
|
34
|
+
}
|
|
19
35
|
/**
|
|
20
36
|
* Download media bytes from a URL the calling process can reach.
|
|
21
37
|
*
|
|
38
|
+
* Runs through `secureFetch`: the URL — and every redirect and DNS answer
|
|
39
|
+
* behind it — must be a public `https:` destination unless
|
|
40
|
+
* {@link DownloadMediaOptions.outboundPolicy} opens more, so a media URL
|
|
41
|
+
* cannot be used to make the publishing worker read from its own network.
|
|
42
|
+
*
|
|
22
43
|
* Throws `SocialValidationError` for problems that will never resolve
|
|
23
|
-
* on retry (unusable scheme, oversized payload) and
|
|
44
|
+
* on retry (refused destination, unusable scheme, oversized payload) and
|
|
24
45
|
* `SocialPublishError` for transport failures the caller may retry.
|
|
25
|
-
*
|
|
26
|
-
* Only `http(s)` is accepted. The package cannot know which hosts are
|
|
27
|
-
* safe for a given deployment, so callers that accept user-supplied
|
|
28
|
-
* media URLs remain responsible for blocking internal targets
|
|
29
|
-
* (link-local, RFC1918, cloud metadata endpoints).
|
|
30
46
|
*/
|
|
31
47
|
export async function downloadMedia(url, platform, opts) {
|
|
32
|
-
assertFetchableUrl(url, platform);
|
|
33
48
|
const timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
34
|
-
const
|
|
35
|
-
const
|
|
49
|
+
const maxBytes = opts.maxBytes > 0 ? opts.maxBytes : UNCAPPED_MEDIA_MAX_BYTES;
|
|
50
|
+
const shown = describeUrl(url);
|
|
51
|
+
const tooLarge = () => new SocialValidationError(`[social/${platform}] Media too large (max ${maxBytes} bytes) — ${shown}`, { platform });
|
|
36
52
|
let res;
|
|
37
53
|
try {
|
|
38
|
-
res = await
|
|
54
|
+
res = await secureFetch(url, {}, { ...opts.outboundPolicy, timeoutMs, maxResponseBytes: maxBytes });
|
|
39
55
|
}
|
|
40
56
|
catch (err) {
|
|
41
|
-
if (err
|
|
42
|
-
throw new
|
|
57
|
+
if (err instanceof OutboundRequestBlockedError) {
|
|
58
|
+
throw new SocialValidationError(`[social/${platform}] Media URL refused: ${err.message} — ${shown}`, { platform });
|
|
43
59
|
}
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
60
|
+
if (err instanceof OutboundResponseTooLargeError)
|
|
61
|
+
throw tooLarge();
|
|
62
|
+
const name = err.name;
|
|
63
|
+
if (name === 'TimeoutError' || name === 'AbortError') {
|
|
64
|
+
throw new SocialPublishError(`[social/${platform}] Media download timed out after ${timeoutMs}ms — ${shown}`, { platform });
|
|
65
|
+
}
|
|
66
|
+
throw new SocialPublishError(`[social/${platform}] Network error downloading media: ${err.message} — ${shown}`, { platform });
|
|
48
67
|
}
|
|
49
68
|
if (!res.ok) {
|
|
50
|
-
|
|
51
|
-
|
|
69
|
+
await res.body?.cancel().catch(() => undefined);
|
|
70
|
+
throw new SocialPublishError(`[social/${platform}] Could not fetch media for upload: ${res.status} ${res.statusText} — ${shown}`, { platform, status: res.status });
|
|
52
71
|
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
// omits Content-Length on chunked responses (and servers can lie).
|
|
56
|
-
const declaredLength = Number(res.headers.get('content-length'));
|
|
57
|
-
if (Number.isFinite(declaredLength) && exceedsCap(declaredLength, opts.maxBytes)) {
|
|
58
|
-
throw new SocialValidationError(`[social/${platform}] Media too large (${declaredLength} bytes; max ${opts.maxBytes}) — ${url}`, { platform });
|
|
72
|
+
try {
|
|
73
|
+
return new Uint8Array(await res.arrayBuffer());
|
|
59
74
|
}
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
75
|
+
catch (err) {
|
|
76
|
+
// The size cap fires while the body streams (chunked responses carry no length).
|
|
77
|
+
if (err instanceof OutboundResponseTooLargeError || err.cause instanceof OutboundResponseTooLargeError) {
|
|
78
|
+
throw tooLarge();
|
|
79
|
+
}
|
|
80
|
+
throw new SocialPublishError(`[social/${platform}] Network error downloading media: ${err.message} — ${shown}`, { platform });
|
|
63
81
|
}
|
|
64
|
-
return bytes;
|
|
65
82
|
}
|
|
66
83
|
/**
|
|
67
84
|
* Normalise downloaded bytes into something the platform will accept.
|
|
@@ -119,9 +136,6 @@ export function filenameForMime(mimeType) {
|
|
|
119
136
|
return `upload.${ext}`;
|
|
120
137
|
}
|
|
121
138
|
// ─── Internal ──────────────────────────────────────────────────────────
|
|
122
|
-
function exceedsCap(bytes, maxBytes) {
|
|
123
|
-
return maxBytes > 0 && bytes > maxBytes;
|
|
124
|
-
}
|
|
125
139
|
function ascii(bytes, start, end) {
|
|
126
140
|
let out = '';
|
|
127
141
|
for (let i = start; i < end; i++) {
|
|
@@ -129,18 +143,6 @@ function ascii(bytes, start, end) {
|
|
|
129
143
|
}
|
|
130
144
|
return out;
|
|
131
145
|
}
|
|
132
|
-
function assertFetchableUrl(url, platform) {
|
|
133
|
-
let parsed;
|
|
134
|
-
try {
|
|
135
|
-
parsed = new URL(url);
|
|
136
|
-
}
|
|
137
|
-
catch {
|
|
138
|
-
throw new SocialValidationError(`[social/${platform}] Media URL is not a valid URL: ${url}`, { platform });
|
|
139
|
-
}
|
|
140
|
-
if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {
|
|
141
|
-
throw new SocialValidationError(`[social/${platform}] Media URL must be http(s); got '${parsed.protocol}' — ${url}`, { platform });
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
146
|
async function convertToJpeg(bytes, platform) {
|
|
145
147
|
const sharp = await loadSharp(platform);
|
|
146
148
|
try {
|
package/dist/media.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"media.js","sourceRoot":"","sources":["../src/media.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EACL,kBAAkB,EAClB,qBAAqB,GAEtB,MAAM,YAAY,CAAC;AAEpB,iEAAiE;AACjE,MAAM,SAAS,GAAG,YAAY,CAAC;AAE/B,0EAA0E;AAC1E,MAAM,kBAAkB,GAAG,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"media.js","sourceRoot":"","sources":["../src/media.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@venturekit-pro/social",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.51",
|
|
4
4
|
"description": "Social-platform publishing adapters + catalog for VentureKit applications",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -55,11 +55,12 @@
|
|
|
55
55
|
"publishing"
|
|
56
56
|
],
|
|
57
57
|
"dependencies": {
|
|
58
|
-
"@venturekit/core": "0.0.
|
|
58
|
+
"@venturekit/core": "0.0.51",
|
|
59
|
+
"@venturekit/integrations": "0.0.51"
|
|
59
60
|
},
|
|
60
61
|
"peerDependencies": {
|
|
61
|
-
"@venturekit/data": "0.0.
|
|
62
|
-
"sharp": ">=0.
|
|
62
|
+
"@venturekit/data": "0.0.51",
|
|
63
|
+
"sharp": ">=0.35.3"
|
|
63
64
|
},
|
|
64
65
|
"peerDependenciesMeta": {
|
|
65
66
|
"@venturekit/data": {
|
|
@@ -71,7 +72,7 @@
|
|
|
71
72
|
},
|
|
72
73
|
"devDependencies": {
|
|
73
74
|
"@types/node": "^26.5.1",
|
|
74
|
-
"@venturekit/data": "0.0.
|
|
75
|
+
"@venturekit/data": "0.0.51",
|
|
75
76
|
"sharp": "^0.35.3",
|
|
76
77
|
"typescript": "^5.3.0"
|
|
77
78
|
},
|