@memberjunction/ai-heygen 6.1.0-edge.3 → 6.1.0-edge.4
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/.turbo/turbo-build.log +1 -1
- package/CHANGELOG.md +28 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -7
- package/dist/index.js.map +1 -1
- package/package.json +5 -5
- package/src/__tests__/HeyGenVideoGenerator.test.ts +14 -16
- package/src/index.ts +26 -7
package/.turbo/turbo-build.log
CHANGED
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,33 @@
|
|
|
1
1
|
# @memberjunction/ai-heygen
|
|
2
2
|
|
|
3
|
+
## 6.1.0-edge.4
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 7857d8e: Add `@memberjunction/network-utils` and remove `axios` from the repository.
|
|
8
|
+
|
|
9
|
+
The SSRF guard added for the web/HTTP actions was Actions-specific but the concern is not, so it
|
|
10
|
+
moves into a new dependency-free, Node-only package (`node:dns` + `node:net` only) that any
|
|
11
|
+
server-side package can depend on: `AssertPublicUrl`, `SafeFetch`, `IsBlockedIPAddress`, `SSRFError`.
|
|
12
|
+
|
|
13
|
+
The same package ships `HttpClient` / `HttpRequest` — a native-`fetch` HTTP client that replaces
|
|
14
|
+
`axios` across all 11 packages that used it. Consolidating on one client removes the third-party
|
|
15
|
+
dependency and puts the SSRF guard one option flag (`ValidateUrl`) away from every outbound call
|
|
16
|
+
site, which was impossible when each package reached for `axios` directly.
|
|
17
|
+
|
|
18
|
+
Also fixes an SSRF sink the original pass missed: the `API Rate Limiter` action takes a
|
|
19
|
+
caller-controlled URL and returns the response body, and is now guarded.
|
|
20
|
+
|
|
21
|
+
Public exports use `PascalCase`, per repo convention.
|
|
22
|
+
|
|
23
|
+
- Updated dependencies [e533ce5]
|
|
24
|
+
- Updated dependencies [4586215]
|
|
25
|
+
- Updated dependencies [a5f92d2]
|
|
26
|
+
- Updated dependencies [7857d8e]
|
|
27
|
+
- @memberjunction/ai@6.1.0-edge.4
|
|
28
|
+
- @memberjunction/global@6.1.0-edge.4
|
|
29
|
+
- @memberjunction/network-utils@6.1.0-edge.4
|
|
30
|
+
|
|
3
31
|
## 6.1.0-edge.3
|
|
4
32
|
|
|
5
33
|
### Patch Changes
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,WAAW,EAAiB,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,WAAW,EAAiB,MAAM,oBAAoB,CAAC;AAsBnH,qBACa,oBAAqB,SAAQ,kBAAkB;IACxD,OAAO,CAAC,YAAY,CAAsD;IAC1E,OAAO,CAAC,WAAW,CAA+C;gBAEtD,MAAM,EAAE,MAAM;IAIb,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,WAAW,CAAC;IA6ClE,sBAAsB,CAAC,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,WAAW,CAAC;IAIzD,UAAU,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IAsBnC,mBAAmB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;CAGxD"}
|
package/dist/index.js
CHANGED
|
@@ -9,7 +9,7 @@ var __metadata = (this && this.__metadata) || function (k, v) {
|
|
|
9
9
|
};
|
|
10
10
|
import { RegisterClass } from "@memberjunction/global";
|
|
11
11
|
import { AvatarInfo, BaseVideoGenerator, VideoResult, ErrorAnalyzer } from "@memberjunction/ai";
|
|
12
|
-
import
|
|
12
|
+
import { HttpGet, HttpPost } from "@memberjunction/network-utils";
|
|
13
13
|
let HeyGenVideoGenerator = class HeyGenVideoGenerator extends BaseVideoGenerator {
|
|
14
14
|
constructor(apiKey) {
|
|
15
15
|
super(apiKey);
|
|
@@ -19,7 +19,7 @@ let HeyGenVideoGenerator = class HeyGenVideoGenerator extends BaseVideoGenerator
|
|
|
19
19
|
async CreateAvatarVideo(params) {
|
|
20
20
|
const videoResult = new VideoResult();
|
|
21
21
|
try {
|
|
22
|
-
const response = await
|
|
22
|
+
const response = await HttpPost(this._generateUrl, {
|
|
23
23
|
video_inputs: [
|
|
24
24
|
{
|
|
25
25
|
character: {
|
|
@@ -44,9 +44,9 @@ let HeyGenVideoGenerator = class HeyGenVideoGenerator extends BaseVideoGenerator
|
|
|
44
44
|
height: params.outputHeight,
|
|
45
45
|
}
|
|
46
46
|
}, {
|
|
47
|
-
|
|
47
|
+
Headers: { Accept: 'application/json', 'X-Api-Key': this.apiKey }
|
|
48
48
|
});
|
|
49
|
-
videoResult.videoId = response.
|
|
49
|
+
videoResult.videoId = response.Data.data.video_id;
|
|
50
50
|
videoResult.success = true;
|
|
51
51
|
}
|
|
52
52
|
catch (error) {
|
|
@@ -63,10 +63,10 @@ let HeyGenVideoGenerator = class HeyGenVideoGenerator extends BaseVideoGenerator
|
|
|
63
63
|
async GetAvatars() {
|
|
64
64
|
const result = [];
|
|
65
65
|
try {
|
|
66
|
-
const response = await
|
|
67
|
-
|
|
66
|
+
const response = await HttpGet(this._avatarsUrl, {
|
|
67
|
+
Headers: { Accept: 'application/json', 'X-Api-Key': this.apiKey }
|
|
68
68
|
});
|
|
69
|
-
for (const avatar of response.
|
|
69
|
+
for (const avatar of response.Data.data.avatars) {
|
|
70
70
|
const avatarInfo = new AvatarInfo();
|
|
71
71
|
avatarInfo.id = avatar.avatar_id;
|
|
72
72
|
avatarInfo.name = avatar.avatar_name;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAqB,kBAAkB,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnH,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@memberjunction/ai-heygen",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "6.1.0-edge.
|
|
4
|
+
"version": "6.1.0-edge.4",
|
|
5
5
|
"description": "MemberJunction Wrapper for HeyGen Video Generation",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"author": "MemberJunction.com",
|
|
@@ -11,10 +11,10 @@
|
|
|
11
11
|
"typescript": "^5.9.3"
|
|
12
12
|
},
|
|
13
13
|
"dependencies": {
|
|
14
|
-
"@
|
|
15
|
-
"@memberjunction/
|
|
16
|
-
"
|
|
17
|
-
"@
|
|
14
|
+
"@elevenlabs/elevenlabs-js": "^2.34.0",
|
|
15
|
+
"@memberjunction/ai": "6.1.0-edge.4",
|
|
16
|
+
"@memberjunction/global": "6.1.0-edge.4",
|
|
17
|
+
"@memberjunction/network-utils": "6.1.0-edge.4"
|
|
18
18
|
},
|
|
19
19
|
"repository": {
|
|
20
20
|
"type": "git",
|
|
@@ -3,14 +3,12 @@ import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
|
3
3
|
/* ------------------------------------------------------------------ */
|
|
4
4
|
/* Hoisted mocks */
|
|
5
5
|
/* ------------------------------------------------------------------ */
|
|
6
|
-
const
|
|
7
|
-
const
|
|
8
|
-
|
|
9
|
-
vi.mock('
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
get: mockAxiosGet,
|
|
13
|
-
},
|
|
6
|
+
const mockHttpPost = vi.hoisted(() => vi.fn());
|
|
7
|
+
const mockHttpGet = vi.hoisted(() => vi.fn());
|
|
8
|
+
|
|
9
|
+
vi.mock('@memberjunction/network-utils', () => ({
|
|
10
|
+
HttpPost: mockHttpPost,
|
|
11
|
+
HttpGet: mockHttpGet,
|
|
14
12
|
}));
|
|
15
13
|
|
|
16
14
|
vi.mock('@memberjunction/global', () => ({
|
|
@@ -73,8 +71,8 @@ describe('HeyGenVideoGenerator', () => {
|
|
|
73
71
|
/* ---- CreateAvatarVideo request building ---- */
|
|
74
72
|
describe('CreateAvatarVideo', () => {
|
|
75
73
|
it('should build correct API request and return videoId on success', async () => {
|
|
76
|
-
|
|
77
|
-
|
|
74
|
+
mockHttpPost.mockResolvedValueOnce({
|
|
75
|
+
Data: { data: { video_id: 'vid-123' } },
|
|
78
76
|
});
|
|
79
77
|
|
|
80
78
|
const params = {
|
|
@@ -93,7 +91,7 @@ describe('HeyGenVideoGenerator', () => {
|
|
|
93
91
|
expect(result.success).toBe(true);
|
|
94
92
|
expect(result.videoId).toBe('vid-123');
|
|
95
93
|
|
|
96
|
-
expect(
|
|
94
|
+
expect(mockHttpPost).toHaveBeenCalledWith(
|
|
97
95
|
'https://api.heygen.com/v2/video/generate',
|
|
98
96
|
expect.objectContaining({
|
|
99
97
|
video_inputs: expect.arrayContaining([
|
|
@@ -106,13 +104,13 @@ describe('HeyGenVideoGenerator', () => {
|
|
|
106
104
|
dimension: { width: 1920, height: 1080 },
|
|
107
105
|
}),
|
|
108
106
|
expect.objectContaining({
|
|
109
|
-
|
|
107
|
+
Headers: expect.objectContaining({ 'X-Api-Key': 'test-heygen-key' }),
|
|
110
108
|
}),
|
|
111
109
|
);
|
|
112
110
|
});
|
|
113
111
|
|
|
114
112
|
it('should return error result on API failure', async () => {
|
|
115
|
-
|
|
113
|
+
mockHttpPost.mockRejectedValueOnce(new Error('HeyGen API error'));
|
|
116
114
|
|
|
117
115
|
const params = {
|
|
118
116
|
avatarId: 'avatar1',
|
|
@@ -135,8 +133,8 @@ describe('HeyGenVideoGenerator', () => {
|
|
|
135
133
|
/* ---- GetAvatars ---- */
|
|
136
134
|
describe('GetAvatars', () => {
|
|
137
135
|
it('should parse avatar list from API response', async () => {
|
|
138
|
-
|
|
139
|
-
|
|
136
|
+
mockHttpGet.mockResolvedValueOnce({
|
|
137
|
+
Data: {
|
|
140
138
|
data: {
|
|
141
139
|
avatars: [
|
|
142
140
|
{
|
|
@@ -167,7 +165,7 @@ describe('HeyGenVideoGenerator', () => {
|
|
|
167
165
|
});
|
|
168
166
|
|
|
169
167
|
it('should return empty array on error', async () => {
|
|
170
|
-
|
|
168
|
+
mockHttpGet.mockRejectedValueOnce(new Error('API error'));
|
|
171
169
|
const avatars = await video.GetAvatars();
|
|
172
170
|
expect(avatars).toEqual([]);
|
|
173
171
|
});
|
package/src/index.ts
CHANGED
|
@@ -1,6 +1,25 @@
|
|
|
1
1
|
import { RegisterClass } from "@memberjunction/global";
|
|
2
2
|
import { AvatarInfo, AvatarVideoParams, BaseVideoGenerator, VideoResult, ErrorAnalyzer } from "@memberjunction/ai";
|
|
3
|
-
import
|
|
3
|
+
import { HttpGet, HttpPost } from "@memberjunction/network-utils";
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
/** Response from HeyGen's `POST /v2/video/generate`. */
|
|
7
|
+
interface HeyGenGenerateResponse {
|
|
8
|
+
data: { video_id: string };
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
/** Response from HeyGen's `GET /v2/avatars`. */
|
|
12
|
+
interface HeyGenAvatarsResponse {
|
|
13
|
+
data: {
|
|
14
|
+
avatars: Array<{
|
|
15
|
+
avatar_id: string;
|
|
16
|
+
avatar_name: string;
|
|
17
|
+
gender: string;
|
|
18
|
+
preview_image_url: string;
|
|
19
|
+
preview_video_url: string;
|
|
20
|
+
}>;
|
|
21
|
+
};
|
|
22
|
+
}
|
|
4
23
|
|
|
5
24
|
@RegisterClass(BaseVideoGenerator, "HeyGenVideoGenerator")
|
|
6
25
|
export class HeyGenVideoGenerator extends BaseVideoGenerator {
|
|
@@ -14,7 +33,7 @@ export class HeyGenVideoGenerator extends BaseVideoGenerator {
|
|
|
14
33
|
public async CreateAvatarVideo(params: AvatarVideoParams): Promise<VideoResult> {
|
|
15
34
|
const videoResult = new VideoResult();
|
|
16
35
|
try {
|
|
17
|
-
const response = await
|
|
36
|
+
const response = await HttpPost<HeyGenGenerateResponse>(
|
|
18
37
|
this._generateUrl, {
|
|
19
38
|
video_inputs: [
|
|
20
39
|
{
|
|
@@ -41,11 +60,11 @@ export class HeyGenVideoGenerator extends BaseVideoGenerator {
|
|
|
41
60
|
}
|
|
42
61
|
},
|
|
43
62
|
{
|
|
44
|
-
|
|
63
|
+
Headers: { Accept: 'application/json', 'X-Api-Key': this.apiKey }
|
|
45
64
|
}
|
|
46
65
|
);
|
|
47
66
|
|
|
48
|
-
videoResult.videoId = response.
|
|
67
|
+
videoResult.videoId = response.Data.data.video_id;
|
|
49
68
|
videoResult.success = true;
|
|
50
69
|
} catch (error) {
|
|
51
70
|
const errorInfo = ErrorAnalyzer.analyzeError(error, 'HeyGen');
|
|
@@ -63,10 +82,10 @@ export class HeyGenVideoGenerator extends BaseVideoGenerator {
|
|
|
63
82
|
public async GetAvatars(): Promise<AvatarInfo[]> {
|
|
64
83
|
const result: AvatarInfo[] = [];
|
|
65
84
|
try {
|
|
66
|
-
const response = await
|
|
67
|
-
|
|
85
|
+
const response = await HttpGet<HeyGenAvatarsResponse>(this._avatarsUrl, {
|
|
86
|
+
Headers: { Accept: 'application/json', 'X-Api-Key': this.apiKey }
|
|
68
87
|
});
|
|
69
|
-
for (const avatar of response.
|
|
88
|
+
for (const avatar of response.Data.data.avatars) {
|
|
70
89
|
const avatarInfo = new AvatarInfo();
|
|
71
90
|
avatarInfo.id = avatar.avatar_id;
|
|
72
91
|
avatarInfo.name = avatar.avatar_name;
|