@hyperframes/producer 0.2.5 → 0.3.1
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/index.js +222 -149
- package/dist/index.js.map +4 -4
- package/dist/public-server.js +222 -149
- package/dist/public-server.js.map +4 -4
- package/dist/services/deterministicFonts.d.ts +1 -1
- package/dist/services/deterministicFonts.d.ts.map +1 -1
- package/package.json +3 -3
package/dist/public-server.js
CHANGED
|
@@ -57895,7 +57895,7 @@ var require_util2 = __commonJS({
|
|
|
57895
57895
|
return path12;
|
|
57896
57896
|
}
|
|
57897
57897
|
exports.normalize = normalize2;
|
|
57898
|
-
function
|
|
57898
|
+
function join18(aRoot, aPath) {
|
|
57899
57899
|
if (aRoot === "") {
|
|
57900
57900
|
aRoot = ".";
|
|
57901
57901
|
}
|
|
@@ -57927,7 +57927,7 @@ var require_util2 = __commonJS({
|
|
|
57927
57927
|
}
|
|
57928
57928
|
return joined;
|
|
57929
57929
|
}
|
|
57930
|
-
exports.join =
|
|
57930
|
+
exports.join = join18;
|
|
57931
57931
|
exports.isAbsolute = function(aPath) {
|
|
57932
57932
|
return aPath.charAt(0) === "/" || urlRegexp.test(aPath);
|
|
57933
57933
|
};
|
|
@@ -58100,7 +58100,7 @@ var require_util2 = __commonJS({
|
|
|
58100
58100
|
parsed.path = parsed.path.substring(0, index + 1);
|
|
58101
58101
|
}
|
|
58102
58102
|
}
|
|
58103
|
-
sourceURL =
|
|
58103
|
+
sourceURL = join18(urlGenerate(parsed), sourceURL);
|
|
58104
58104
|
}
|
|
58105
58105
|
return normalize2(sourceURL);
|
|
58106
58106
|
}
|
|
@@ -59902,7 +59902,7 @@ var require_escodegen = __commonJS({
|
|
|
59902
59902
|
function noEmptySpace() {
|
|
59903
59903
|
return space ? space : " ";
|
|
59904
59904
|
}
|
|
59905
|
-
function
|
|
59905
|
+
function join18(left2, right2) {
|
|
59906
59906
|
var leftSource, rightSource, leftCharCode, rightCharCode;
|
|
59907
59907
|
leftSource = toSourceNodeWhenNeeded(left2).toString();
|
|
59908
59908
|
if (leftSource.length === 0) {
|
|
@@ -60233,8 +60233,8 @@ var require_escodegen = __commonJS({
|
|
|
60233
60233
|
} else {
|
|
60234
60234
|
result.push(that.generateExpression(stmt.left, Precedence.Call, E_TTT));
|
|
60235
60235
|
}
|
|
60236
|
-
result =
|
|
60237
|
-
result = [
|
|
60236
|
+
result = join18(result, operator);
|
|
60237
|
+
result = [join18(
|
|
60238
60238
|
result,
|
|
60239
60239
|
that.generateExpression(stmt.right, Precedence.Assignment, E_TTT)
|
|
60240
60240
|
), ")"];
|
|
@@ -60377,11 +60377,11 @@ var require_escodegen = __commonJS({
|
|
|
60377
60377
|
var result, fragment;
|
|
60378
60378
|
result = ["class"];
|
|
60379
60379
|
if (stmt.id) {
|
|
60380
|
-
result =
|
|
60380
|
+
result = join18(result, this.generateExpression(stmt.id, Precedence.Sequence, E_TTT));
|
|
60381
60381
|
}
|
|
60382
60382
|
if (stmt.superClass) {
|
|
60383
|
-
fragment =
|
|
60384
|
-
result =
|
|
60383
|
+
fragment = join18("extends", this.generateExpression(stmt.superClass, Precedence.Unary, E_TTT));
|
|
60384
|
+
result = join18(result, fragment);
|
|
60385
60385
|
}
|
|
60386
60386
|
result.push(space);
|
|
60387
60387
|
result.push(this.generateStatement(stmt.body, S_TFFT));
|
|
@@ -60394,9 +60394,9 @@ var require_escodegen = __commonJS({
|
|
|
60394
60394
|
return escapeDirective(stmt.directive) + this.semicolon(flags);
|
|
60395
60395
|
},
|
|
60396
60396
|
DoWhileStatement: function(stmt, flags) {
|
|
60397
|
-
var result =
|
|
60397
|
+
var result = join18("do", this.maybeBlock(stmt.body, S_TFFF));
|
|
60398
60398
|
result = this.maybeBlockSuffix(stmt.body, result);
|
|
60399
|
-
return
|
|
60399
|
+
return join18(result, [
|
|
60400
60400
|
"while" + space + "(",
|
|
60401
60401
|
this.generateExpression(stmt.test, Precedence.Sequence, E_TTT),
|
|
60402
60402
|
")" + this.semicolon(flags)
|
|
@@ -60432,11 +60432,11 @@ var require_escodegen = __commonJS({
|
|
|
60432
60432
|
ExportDefaultDeclaration: function(stmt, flags) {
|
|
60433
60433
|
var result = ["export"], bodyFlags;
|
|
60434
60434
|
bodyFlags = flags & F_SEMICOLON_OPT ? S_TFFT : S_TFFF;
|
|
60435
|
-
result =
|
|
60435
|
+
result = join18(result, "default");
|
|
60436
60436
|
if (isStatement(stmt.declaration)) {
|
|
60437
|
-
result =
|
|
60437
|
+
result = join18(result, this.generateStatement(stmt.declaration, bodyFlags));
|
|
60438
60438
|
} else {
|
|
60439
|
-
result =
|
|
60439
|
+
result = join18(result, this.generateExpression(stmt.declaration, Precedence.Assignment, E_TTT) + this.semicolon(flags));
|
|
60440
60440
|
}
|
|
60441
60441
|
return result;
|
|
60442
60442
|
},
|
|
@@ -60444,15 +60444,15 @@ var require_escodegen = __commonJS({
|
|
|
60444
60444
|
var result = ["export"], bodyFlags, that = this;
|
|
60445
60445
|
bodyFlags = flags & F_SEMICOLON_OPT ? S_TFFT : S_TFFF;
|
|
60446
60446
|
if (stmt.declaration) {
|
|
60447
|
-
return
|
|
60447
|
+
return join18(result, this.generateStatement(stmt.declaration, bodyFlags));
|
|
60448
60448
|
}
|
|
60449
60449
|
if (stmt.specifiers) {
|
|
60450
60450
|
if (stmt.specifiers.length === 0) {
|
|
60451
|
-
result =
|
|
60451
|
+
result = join18(result, "{" + space + "}");
|
|
60452
60452
|
} else if (stmt.specifiers[0].type === Syntax.ExportBatchSpecifier) {
|
|
60453
|
-
result =
|
|
60453
|
+
result = join18(result, this.generateExpression(stmt.specifiers[0], Precedence.Sequence, E_TTT));
|
|
60454
60454
|
} else {
|
|
60455
|
-
result =
|
|
60455
|
+
result = join18(result, "{");
|
|
60456
60456
|
withIndent(function(indent2) {
|
|
60457
60457
|
var i, iz;
|
|
60458
60458
|
result.push(newline);
|
|
@@ -60470,7 +60470,7 @@ var require_escodegen = __commonJS({
|
|
|
60470
60470
|
result.push(base + "}");
|
|
60471
60471
|
}
|
|
60472
60472
|
if (stmt.source) {
|
|
60473
|
-
result =
|
|
60473
|
+
result = join18(result, [
|
|
60474
60474
|
"from" + space,
|
|
60475
60475
|
// ModuleSpecifier
|
|
60476
60476
|
this.generateExpression(stmt.source, Precedence.Sequence, E_TTT),
|
|
@@ -60558,7 +60558,7 @@ var require_escodegen = __commonJS({
|
|
|
60558
60558
|
];
|
|
60559
60559
|
cursor = 0;
|
|
60560
60560
|
if (stmt.specifiers[cursor].type === Syntax.ImportDefaultSpecifier) {
|
|
60561
|
-
result =
|
|
60561
|
+
result = join18(result, [
|
|
60562
60562
|
this.generateExpression(stmt.specifiers[cursor], Precedence.Sequence, E_TTT)
|
|
60563
60563
|
]);
|
|
60564
60564
|
++cursor;
|
|
@@ -60568,7 +60568,7 @@ var require_escodegen = __commonJS({
|
|
|
60568
60568
|
result.push(",");
|
|
60569
60569
|
}
|
|
60570
60570
|
if (stmt.specifiers[cursor].type === Syntax.ImportNamespaceSpecifier) {
|
|
60571
|
-
result =
|
|
60571
|
+
result = join18(result, [
|
|
60572
60572
|
space,
|
|
60573
60573
|
this.generateExpression(stmt.specifiers[cursor], Precedence.Sequence, E_TTT)
|
|
60574
60574
|
]);
|
|
@@ -60597,7 +60597,7 @@ var require_escodegen = __commonJS({
|
|
|
60597
60597
|
}
|
|
60598
60598
|
}
|
|
60599
60599
|
}
|
|
60600
|
-
result =
|
|
60600
|
+
result = join18(result, [
|
|
60601
60601
|
"from" + space,
|
|
60602
60602
|
// ModuleSpecifier
|
|
60603
60603
|
this.generateExpression(stmt.source, Precedence.Sequence, E_TTT),
|
|
@@ -60651,7 +60651,7 @@ var require_escodegen = __commonJS({
|
|
|
60651
60651
|
return result;
|
|
60652
60652
|
},
|
|
60653
60653
|
ThrowStatement: function(stmt, flags) {
|
|
60654
|
-
return [
|
|
60654
|
+
return [join18(
|
|
60655
60655
|
"throw",
|
|
60656
60656
|
this.generateExpression(stmt.argument, Precedence.Sequence, E_TTT)
|
|
60657
60657
|
), this.semicolon(flags)];
|
|
@@ -60662,7 +60662,7 @@ var require_escodegen = __commonJS({
|
|
|
60662
60662
|
result = this.maybeBlockSuffix(stmt.block, result);
|
|
60663
60663
|
if (stmt.handlers) {
|
|
60664
60664
|
for (i = 0, iz = stmt.handlers.length; i < iz; ++i) {
|
|
60665
|
-
result =
|
|
60665
|
+
result = join18(result, this.generateStatement(stmt.handlers[i], S_TFFF));
|
|
60666
60666
|
if (stmt.finalizer || i + 1 !== iz) {
|
|
60667
60667
|
result = this.maybeBlockSuffix(stmt.handlers[i].body, result);
|
|
60668
60668
|
}
|
|
@@ -60670,7 +60670,7 @@ var require_escodegen = __commonJS({
|
|
|
60670
60670
|
} else {
|
|
60671
60671
|
guardedHandlers = stmt.guardedHandlers || [];
|
|
60672
60672
|
for (i = 0, iz = guardedHandlers.length; i < iz; ++i) {
|
|
60673
|
-
result =
|
|
60673
|
+
result = join18(result, this.generateStatement(guardedHandlers[i], S_TFFF));
|
|
60674
60674
|
if (stmt.finalizer || i + 1 !== iz) {
|
|
60675
60675
|
result = this.maybeBlockSuffix(guardedHandlers[i].body, result);
|
|
60676
60676
|
}
|
|
@@ -60678,13 +60678,13 @@ var require_escodegen = __commonJS({
|
|
|
60678
60678
|
if (stmt.handler) {
|
|
60679
60679
|
if (Array.isArray(stmt.handler)) {
|
|
60680
60680
|
for (i = 0, iz = stmt.handler.length; i < iz; ++i) {
|
|
60681
|
-
result =
|
|
60681
|
+
result = join18(result, this.generateStatement(stmt.handler[i], S_TFFF));
|
|
60682
60682
|
if (stmt.finalizer || i + 1 !== iz) {
|
|
60683
60683
|
result = this.maybeBlockSuffix(stmt.handler[i].body, result);
|
|
60684
60684
|
}
|
|
60685
60685
|
}
|
|
60686
60686
|
} else {
|
|
60687
|
-
result =
|
|
60687
|
+
result = join18(result, this.generateStatement(stmt.handler, S_TFFF));
|
|
60688
60688
|
if (stmt.finalizer) {
|
|
60689
60689
|
result = this.maybeBlockSuffix(stmt.handler.body, result);
|
|
60690
60690
|
}
|
|
@@ -60692,7 +60692,7 @@ var require_escodegen = __commonJS({
|
|
|
60692
60692
|
}
|
|
60693
60693
|
}
|
|
60694
60694
|
if (stmt.finalizer) {
|
|
60695
|
-
result =
|
|
60695
|
+
result = join18(result, ["finally", this.maybeBlock(stmt.finalizer, S_TFFF)]);
|
|
60696
60696
|
}
|
|
60697
60697
|
return result;
|
|
60698
60698
|
},
|
|
@@ -60726,7 +60726,7 @@ var require_escodegen = __commonJS({
|
|
|
60726
60726
|
withIndent(function() {
|
|
60727
60727
|
if (stmt.test) {
|
|
60728
60728
|
result = [
|
|
60729
|
-
|
|
60729
|
+
join18("case", that.generateExpression(stmt.test, Precedence.Sequence, E_TTT)),
|
|
60730
60730
|
":"
|
|
60731
60731
|
];
|
|
60732
60732
|
} else {
|
|
@@ -60774,9 +60774,9 @@ var require_escodegen = __commonJS({
|
|
|
60774
60774
|
result.push(this.maybeBlock(stmt.consequent, S_TFFF));
|
|
60775
60775
|
result = this.maybeBlockSuffix(stmt.consequent, result);
|
|
60776
60776
|
if (stmt.alternate.type === Syntax.IfStatement) {
|
|
60777
|
-
result =
|
|
60777
|
+
result = join18(result, ["else ", this.generateStatement(stmt.alternate, bodyFlags)]);
|
|
60778
60778
|
} else {
|
|
60779
|
-
result =
|
|
60779
|
+
result = join18(result, join18("else", this.maybeBlock(stmt.alternate, bodyFlags)));
|
|
60780
60780
|
}
|
|
60781
60781
|
} else {
|
|
60782
60782
|
result.push(this.maybeBlock(stmt.consequent, bodyFlags));
|
|
@@ -60877,7 +60877,7 @@ var require_escodegen = __commonJS({
|
|
|
60877
60877
|
},
|
|
60878
60878
|
ReturnStatement: function(stmt, flags) {
|
|
60879
60879
|
if (stmt.argument) {
|
|
60880
|
-
return [
|
|
60880
|
+
return [join18(
|
|
60881
60881
|
"return",
|
|
60882
60882
|
this.generateExpression(stmt.argument, Precedence.Sequence, E_TTT)
|
|
60883
60883
|
), this.semicolon(flags)];
|
|
@@ -60966,14 +60966,14 @@ var require_escodegen = __commonJS({
|
|
|
60966
60966
|
if (leftSource.charCodeAt(leftSource.length - 1) === 47 && esutils.code.isIdentifierPartES5(expr.operator.charCodeAt(0))) {
|
|
60967
60967
|
result = [fragment, noEmptySpace(), expr.operator];
|
|
60968
60968
|
} else {
|
|
60969
|
-
result =
|
|
60969
|
+
result = join18(fragment, expr.operator);
|
|
60970
60970
|
}
|
|
60971
60971
|
fragment = this.generateExpression(expr.right, rightPrecedence, flags);
|
|
60972
60972
|
if (expr.operator === "/" && fragment.toString().charAt(0) === "/" || expr.operator.slice(-1) === "<" && fragment.toString().slice(0, 3) === "!--") {
|
|
60973
60973
|
result.push(noEmptySpace());
|
|
60974
60974
|
result.push(fragment);
|
|
60975
60975
|
} else {
|
|
60976
|
-
result =
|
|
60976
|
+
result = join18(result, fragment);
|
|
60977
60977
|
}
|
|
60978
60978
|
if (expr.operator === "in" && !(flags & F_ALLOW_IN)) {
|
|
60979
60979
|
return ["(", result, ")"];
|
|
@@ -61013,7 +61013,7 @@ var require_escodegen = __commonJS({
|
|
|
61013
61013
|
var result, length, i, iz, itemFlags;
|
|
61014
61014
|
length = expr["arguments"].length;
|
|
61015
61015
|
itemFlags = flags & F_ALLOW_UNPARATH_NEW && !parentheses && length === 0 ? E_TFT : E_TFF;
|
|
61016
|
-
result =
|
|
61016
|
+
result = join18(
|
|
61017
61017
|
"new",
|
|
61018
61018
|
this.generateExpression(expr.callee, Precedence.New, itemFlags)
|
|
61019
61019
|
);
|
|
@@ -61063,11 +61063,11 @@ var require_escodegen = __commonJS({
|
|
|
61063
61063
|
var result, fragment, rightCharCode, leftSource, leftCharCode;
|
|
61064
61064
|
fragment = this.generateExpression(expr.argument, Precedence.Unary, E_TTT);
|
|
61065
61065
|
if (space === "") {
|
|
61066
|
-
result =
|
|
61066
|
+
result = join18(expr.operator, fragment);
|
|
61067
61067
|
} else {
|
|
61068
61068
|
result = [expr.operator];
|
|
61069
61069
|
if (expr.operator.length > 2) {
|
|
61070
|
-
result =
|
|
61070
|
+
result = join18(result, fragment);
|
|
61071
61071
|
} else {
|
|
61072
61072
|
leftSource = toSourceNodeWhenNeeded(result).toString();
|
|
61073
61073
|
leftCharCode = leftSource.charCodeAt(leftSource.length - 1);
|
|
@@ -61090,7 +61090,7 @@ var require_escodegen = __commonJS({
|
|
|
61090
61090
|
result = "yield";
|
|
61091
61091
|
}
|
|
61092
61092
|
if (expr.argument) {
|
|
61093
|
-
result =
|
|
61093
|
+
result = join18(
|
|
61094
61094
|
result,
|
|
61095
61095
|
this.generateExpression(expr.argument, Precedence.Yield, E_TTT)
|
|
61096
61096
|
);
|
|
@@ -61098,7 +61098,7 @@ var require_escodegen = __commonJS({
|
|
|
61098
61098
|
return parenthesize(result, Precedence.Yield, precedence);
|
|
61099
61099
|
},
|
|
61100
61100
|
AwaitExpression: function(expr, precedence, flags) {
|
|
61101
|
-
var result =
|
|
61101
|
+
var result = join18(
|
|
61102
61102
|
expr.all ? "await*" : "await",
|
|
61103
61103
|
this.generateExpression(expr.argument, Precedence.Await, E_TTT)
|
|
61104
61104
|
);
|
|
@@ -61181,11 +61181,11 @@ var require_escodegen = __commonJS({
|
|
|
61181
61181
|
var result, fragment;
|
|
61182
61182
|
result = ["class"];
|
|
61183
61183
|
if (expr.id) {
|
|
61184
|
-
result =
|
|
61184
|
+
result = join18(result, this.generateExpression(expr.id, Precedence.Sequence, E_TTT));
|
|
61185
61185
|
}
|
|
61186
61186
|
if (expr.superClass) {
|
|
61187
|
-
fragment =
|
|
61188
|
-
result =
|
|
61187
|
+
fragment = join18("extends", this.generateExpression(expr.superClass, Precedence.Unary, E_TTT));
|
|
61188
|
+
result = join18(result, fragment);
|
|
61189
61189
|
}
|
|
61190
61190
|
result.push(space);
|
|
61191
61191
|
result.push(this.generateStatement(expr.body, S_TFFT));
|
|
@@ -61200,7 +61200,7 @@ var require_escodegen = __commonJS({
|
|
|
61200
61200
|
}
|
|
61201
61201
|
if (expr.kind === "get" || expr.kind === "set") {
|
|
61202
61202
|
fragment = [
|
|
61203
|
-
|
|
61203
|
+
join18(expr.kind, this.generatePropertyKey(expr.key, expr.computed)),
|
|
61204
61204
|
this.generateFunctionBody(expr.value)
|
|
61205
61205
|
];
|
|
61206
61206
|
} else {
|
|
@@ -61210,7 +61210,7 @@ var require_escodegen = __commonJS({
|
|
|
61210
61210
|
this.generateFunctionBody(expr.value)
|
|
61211
61211
|
];
|
|
61212
61212
|
}
|
|
61213
|
-
return
|
|
61213
|
+
return join18(result, fragment);
|
|
61214
61214
|
},
|
|
61215
61215
|
Property: function(expr, precedence, flags) {
|
|
61216
61216
|
if (expr.kind === "get" || expr.kind === "set") {
|
|
@@ -61405,7 +61405,7 @@ var require_escodegen = __commonJS({
|
|
|
61405
61405
|
for (i = 0, iz = expr.blocks.length; i < iz; ++i) {
|
|
61406
61406
|
fragment = that.generateExpression(expr.blocks[i], Precedence.Sequence, E_TTT);
|
|
61407
61407
|
if (i > 0 || extra.moz.comprehensionExpressionStartsWithAssignment) {
|
|
61408
|
-
result =
|
|
61408
|
+
result = join18(result, fragment);
|
|
61409
61409
|
} else {
|
|
61410
61410
|
result.push(fragment);
|
|
61411
61411
|
}
|
|
@@ -61413,13 +61413,13 @@ var require_escodegen = __commonJS({
|
|
|
61413
61413
|
});
|
|
61414
61414
|
}
|
|
61415
61415
|
if (expr.filter) {
|
|
61416
|
-
result =
|
|
61416
|
+
result = join18(result, "if" + space);
|
|
61417
61417
|
fragment = this.generateExpression(expr.filter, Precedence.Sequence, E_TTT);
|
|
61418
|
-
result =
|
|
61418
|
+
result = join18(result, ["(", fragment, ")"]);
|
|
61419
61419
|
}
|
|
61420
61420
|
if (!extra.moz.comprehensionExpressionStartsWithAssignment) {
|
|
61421
61421
|
fragment = this.generateExpression(expr.body, Precedence.Assignment, E_TTT);
|
|
61422
|
-
result =
|
|
61422
|
+
result = join18(result, fragment);
|
|
61423
61423
|
}
|
|
61424
61424
|
result.push(expr.type === Syntax.GeneratorExpression ? ")" : "]");
|
|
61425
61425
|
return result;
|
|
@@ -61435,8 +61435,8 @@ var require_escodegen = __commonJS({
|
|
|
61435
61435
|
} else {
|
|
61436
61436
|
fragment = this.generateExpression(expr.left, Precedence.Call, E_TTT);
|
|
61437
61437
|
}
|
|
61438
|
-
fragment =
|
|
61439
|
-
fragment =
|
|
61438
|
+
fragment = join18(fragment, expr.of ? "of" : "in");
|
|
61439
|
+
fragment = join18(fragment, this.generateExpression(expr.right, Precedence.Sequence, E_TTT));
|
|
61440
61440
|
return ["for" + space + "(", fragment, ")"];
|
|
61441
61441
|
},
|
|
61442
61442
|
SpreadElement: function(expr, precedence, flags) {
|
|
@@ -87598,9 +87598,9 @@ async function getConnectionTransport(options) {
|
|
|
87598
87598
|
throw new Error("Could not detect required browser platform");
|
|
87599
87599
|
}
|
|
87600
87600
|
const { convertPuppeteerChannelToBrowsersChannel: convertPuppeteerChannelToBrowsersChannel2 } = await Promise.resolve().then(() => (init_LaunchOptions(), LaunchOptions_exports));
|
|
87601
|
-
const { join:
|
|
87601
|
+
const { join: join18 } = await import("node:path");
|
|
87602
87602
|
const userDataDir = resolveDefaultUserDataDir3(Browser4.CHROME, platform, convertPuppeteerChannelToBrowsersChannel2(options.channel));
|
|
87603
|
-
const portPath =
|
|
87603
|
+
const portPath = join18(userDataDir, "DevToolsActivePort");
|
|
87604
87604
|
try {
|
|
87605
87605
|
const fileContent = await environment.value.fs.promises.readFile(portPath, "ascii");
|
|
87606
87606
|
const [rawPort, rawPath] = fileContent.split("\n").map((line) => {
|
|
@@ -89418,15 +89418,15 @@ var init_puppeteer_core = __esm({
|
|
|
89418
89418
|
|
|
89419
89419
|
// src/server.ts
|
|
89420
89420
|
import {
|
|
89421
|
-
existsSync as
|
|
89422
|
-
mkdirSync as
|
|
89421
|
+
existsSync as existsSync17,
|
|
89422
|
+
mkdirSync as mkdirSync11,
|
|
89423
89423
|
statSync as statSync7,
|
|
89424
89424
|
mkdtempSync,
|
|
89425
|
-
writeFileSync as
|
|
89425
|
+
writeFileSync as writeFileSync5,
|
|
89426
89426
|
rmSync as rmSync4,
|
|
89427
89427
|
createReadStream as createReadStream2
|
|
89428
89428
|
} from "node:fs";
|
|
89429
|
-
import { resolve as resolve12, dirname as dirname11, join as
|
|
89429
|
+
import { resolve as resolve12, dirname as dirname11, join as join17 } from "node:path";
|
|
89430
89430
|
import { tmpdir as tmpdir2 } from "node:os";
|
|
89431
89431
|
import { parseArgs } from "node:util";
|
|
89432
89432
|
import crypto2 from "node:crypto";
|
|
@@ -92206,11 +92206,11 @@ var serve = (options, listeningListener) => {
|
|
|
92206
92206
|
|
|
92207
92207
|
// src/services/renderOrchestrator.ts
|
|
92208
92208
|
import {
|
|
92209
|
-
existsSync as
|
|
92210
|
-
mkdirSync as
|
|
92209
|
+
existsSync as existsSync15,
|
|
92210
|
+
mkdirSync as mkdirSync10,
|
|
92211
92211
|
rmSync as rmSync3,
|
|
92212
|
-
readFileSync as
|
|
92213
|
-
writeFileSync as
|
|
92212
|
+
readFileSync as readFileSync9,
|
|
92213
|
+
writeFileSync as writeFileSync4,
|
|
92214
92214
|
copyFileSync as copyFileSync2,
|
|
92215
92215
|
appendFileSync
|
|
92216
92216
|
} from "fs";
|
|
@@ -105844,7 +105844,7 @@ async function mergeWorkerFrames(workDir, tasks, outputDir) {
|
|
|
105844
105844
|
}
|
|
105845
105845
|
|
|
105846
105846
|
// src/services/renderOrchestrator.ts
|
|
105847
|
-
import { join as
|
|
105847
|
+
import { join as join14, dirname as dirname10, resolve as resolve9 } from "path";
|
|
105848
105848
|
import { randomUUID } from "crypto";
|
|
105849
105849
|
import { freemem as freemem2 } from "os";
|
|
105850
105850
|
import { fileURLToPath as fileURLToPath3 } from "url";
|
|
@@ -106203,10 +106203,15 @@ function createFileServer2(options) {
|
|
|
106203
106203
|
}
|
|
106204
106204
|
|
|
106205
106205
|
// src/services/htmlCompiler.ts
|
|
106206
|
-
import { readFileSync as
|
|
106207
|
-
import { join as
|
|
106206
|
+
import { readFileSync as readFileSync8, existsSync as existsSync14, mkdirSync as mkdirSync9 } from "fs";
|
|
106207
|
+
import { join as join13, dirname as dirname9, resolve as resolve8 } from "path";
|
|
106208
106208
|
import postcss from "postcss";
|
|
106209
106209
|
|
|
106210
|
+
// src/services/deterministicFonts.ts
|
|
106211
|
+
import { existsSync as existsSync13, mkdirSync as mkdirSync8, readFileSync as readFileSync7, writeFileSync as writeFileSync3 } from "node:fs";
|
|
106212
|
+
import { homedir as homedir2 } from "node:os";
|
|
106213
|
+
import { join as join12 } from "node:path";
|
|
106214
|
+
|
|
106210
106215
|
// src/services/fontData.generated.ts
|
|
106211
106216
|
var EMBEDDED_FONT_DATA = /* @__PURE__ */ new Map([
|
|
106212
106217
|
["@fontsource/inter:400:normal", "data:font/woff2;base64,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"],
|
|
@@ -106426,32 +106431,40 @@ function extractRequestedFontFamilies(html) {
|
|
|
106426
106431
|
}
|
|
106427
106432
|
return requested;
|
|
106428
106433
|
}
|
|
106429
|
-
function
|
|
106434
|
+
function buildFontFaceRule(familyName, src, weight, style) {
|
|
106435
|
+
return [
|
|
106436
|
+
"@font-face {",
|
|
106437
|
+
` font-family: "${familyName}";`,
|
|
106438
|
+
` src: url("${src}") format("woff2");`,
|
|
106439
|
+
` font-style: ${style};`,
|
|
106440
|
+
` font-weight: ${weight};`,
|
|
106441
|
+
" font-display: block;",
|
|
106442
|
+
"}"
|
|
106443
|
+
].join("\n");
|
|
106444
|
+
}
|
|
106445
|
+
async function buildFontFaceCss(requestedFamilies) {
|
|
106430
106446
|
const rules = [];
|
|
106431
106447
|
const unresolved = [];
|
|
106432
106448
|
for (const [normalizedFamily, originalCaseFamily] of requestedFamilies) {
|
|
106433
106449
|
const canonicalKey = FONT_ALIASES[normalizedFamily];
|
|
106434
|
-
if (
|
|
106435
|
-
|
|
106450
|
+
if (canonicalKey) {
|
|
106451
|
+
const canonical = CANONICAL_FONTS[canonicalKey];
|
|
106452
|
+
if (!canonical) continue;
|
|
106453
|
+
for (const face of canonical.faces) {
|
|
106454
|
+
const style = face.style || "normal";
|
|
106455
|
+
const src = fontDataUri(canonical.packageName, face.weight, style);
|
|
106456
|
+
rules.push(buildFontFaceRule(originalCaseFamily, src, face.weight, style));
|
|
106457
|
+
}
|
|
106436
106458
|
continue;
|
|
106437
106459
|
}
|
|
106438
|
-
const
|
|
106439
|
-
if (
|
|
106440
|
-
|
|
106441
|
-
|
|
106442
|
-
|
|
106443
|
-
|
|
106444
|
-
[
|
|
106445
|
-
"@font-face {",
|
|
106446
|
-
` font-family: "${originalCaseFamily}";`,
|
|
106447
|
-
` src: url("${src}") format("woff2");`,
|
|
106448
|
-
` font-style: ${style};`,
|
|
106449
|
-
` font-weight: ${face.weight};`,
|
|
106450
|
-
" font-display: block;",
|
|
106451
|
-
"}"
|
|
106452
|
-
].join("\n")
|
|
106453
|
-
);
|
|
106460
|
+
const googleFaces = await fetchGoogleFont(originalCaseFamily);
|
|
106461
|
+
if (googleFaces.length > 0) {
|
|
106462
|
+
for (const face of googleFaces) {
|
|
106463
|
+
rules.push(buildFontFaceRule(originalCaseFamily, face.dataUri, face.weight, face.style));
|
|
106464
|
+
}
|
|
106465
|
+
continue;
|
|
106454
106466
|
}
|
|
106467
|
+
unresolved.push(originalCaseFamily);
|
|
106455
106468
|
}
|
|
106456
106469
|
return {
|
|
106457
106470
|
css: rules.join("\n\n").trim(),
|
|
@@ -106475,7 +106488,67 @@ function warnUnresolvedFonts(unresolved) {
|
|
|
106475
106488
|
Docs: https://hyperframes.heygen.com/docs/fonts`
|
|
106476
106489
|
);
|
|
106477
106490
|
}
|
|
106478
|
-
|
|
106491
|
+
var GOOGLE_FONTS_CACHE_DIR = join12(homedir2(), ".cache", "hyperframes", "fonts");
|
|
106492
|
+
var WOFF2_USER_AGENT = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36";
|
|
106493
|
+
function fontSlug(familyName) {
|
|
106494
|
+
return familyName.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "");
|
|
106495
|
+
}
|
|
106496
|
+
function fontCacheDir(slug) {
|
|
106497
|
+
const dir = join12(GOOGLE_FONTS_CACHE_DIR, slug);
|
|
106498
|
+
if (!existsSync13(dir)) {
|
|
106499
|
+
mkdirSync8(dir, { recursive: true });
|
|
106500
|
+
}
|
|
106501
|
+
return dir;
|
|
106502
|
+
}
|
|
106503
|
+
function cachedWoff2Path(slug, weight, style) {
|
|
106504
|
+
return join12(fontCacheDir(slug), `${weight}-${style}.woff2`);
|
|
106505
|
+
}
|
|
106506
|
+
async function fetchGoogleFont(familyName) {
|
|
106507
|
+
const slug = fontSlug(familyName);
|
|
106508
|
+
const encodedFamily = encodeURIComponent(familyName);
|
|
106509
|
+
const url = `https://fonts.googleapis.com/css2?family=${encodedFamily}:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,400;1,700`;
|
|
106510
|
+
let cssText;
|
|
106511
|
+
try {
|
|
106512
|
+
const res = await fetch(url, {
|
|
106513
|
+
headers: { "User-Agent": WOFF2_USER_AGENT }
|
|
106514
|
+
});
|
|
106515
|
+
if (!res.ok) {
|
|
106516
|
+
return [];
|
|
106517
|
+
}
|
|
106518
|
+
cssText = await res.text();
|
|
106519
|
+
} catch {
|
|
106520
|
+
return [];
|
|
106521
|
+
}
|
|
106522
|
+
const faceRegex = /@font-face\s*\{[^}]*font-style:\s*(normal|italic)[^}]*font-weight:\s*(\d+)[^}]*src:\s*url\(([^)]+)\)\s*format\(['"]woff2['"]\)[^}]*\}/gi;
|
|
106523
|
+
const faces = [];
|
|
106524
|
+
for (const match2 of cssText.matchAll(faceRegex)) {
|
|
106525
|
+
const style = match2[1] || "normal";
|
|
106526
|
+
const weight = match2[2] || "400";
|
|
106527
|
+
const woff2Url = match2[3] || "";
|
|
106528
|
+
if (!woff2Url) continue;
|
|
106529
|
+
const cachePath = cachedWoff2Path(slug, weight, style);
|
|
106530
|
+
if (!existsSync13(cachePath)) {
|
|
106531
|
+
try {
|
|
106532
|
+
const fontRes = await fetch(woff2Url);
|
|
106533
|
+
if (!fontRes.ok) continue;
|
|
106534
|
+
const buffer = Buffer.from(await fontRes.arrayBuffer());
|
|
106535
|
+
writeFileSync3(cachePath, buffer);
|
|
106536
|
+
} catch {
|
|
106537
|
+
continue;
|
|
106538
|
+
}
|
|
106539
|
+
}
|
|
106540
|
+
const fontBytes = readFileSync7(cachePath);
|
|
106541
|
+
const dataUri = `data:font/woff2;base64,${fontBytes.toString("base64")}`;
|
|
106542
|
+
faces.push({ weight, style, dataUri });
|
|
106543
|
+
}
|
|
106544
|
+
if (faces.length > 0) {
|
|
106545
|
+
console.log(
|
|
106546
|
+
`[Compiler] Fetched ${faces.length} font face(s) for "${familyName}" from Google Fonts (cached to ${fontCacheDir(slug)})`
|
|
106547
|
+
);
|
|
106548
|
+
}
|
|
106549
|
+
return faces;
|
|
106550
|
+
}
|
|
106551
|
+
async function injectDeterministicFontFaces(html) {
|
|
106479
106552
|
const existingFaces = extractExistingFontFaces(html);
|
|
106480
106553
|
const requestedFamilies = extractRequestedFontFamilies(html);
|
|
106481
106554
|
const pendingFamilies = /* @__PURE__ */ new Map();
|
|
@@ -106487,7 +106560,7 @@ function injectDeterministicFontFaces(html) {
|
|
|
106487
106560
|
if (pendingFamilies.size === 0) {
|
|
106488
106561
|
return html;
|
|
106489
106562
|
}
|
|
106490
|
-
const { css, unresolved } = buildFontFaceCss(pendingFamilies);
|
|
106563
|
+
const { css, unresolved } = await buildFontFaceCss(pendingFamilies);
|
|
106491
106564
|
if (!css) {
|
|
106492
106565
|
if (unresolved.length > 0) {
|
|
106493
106566
|
warnUnresolvedFonts(unresolved);
|
|
@@ -106523,16 +106596,16 @@ function dedupeElementsById(elements) {
|
|
|
106523
106596
|
async function resolveMediaDuration(src, mediaStart, baseDir, downloadDir, tagName19) {
|
|
106524
106597
|
let filePath = src;
|
|
106525
106598
|
if (isHttpUrl(src)) {
|
|
106526
|
-
if (!
|
|
106599
|
+
if (!existsSync14(downloadDir)) mkdirSync9(downloadDir, { recursive: true });
|
|
106527
106600
|
try {
|
|
106528
106601
|
filePath = await downloadToTemp(src, downloadDir);
|
|
106529
106602
|
} catch {
|
|
106530
106603
|
return { duration: 0, resolvedPath: src };
|
|
106531
106604
|
}
|
|
106532
106605
|
} else if (!filePath.startsWith("/")) {
|
|
106533
|
-
filePath =
|
|
106606
|
+
filePath = join13(baseDir, filePath);
|
|
106534
106607
|
}
|
|
106535
|
-
if (!
|
|
106608
|
+
if (!existsSync14(filePath)) {
|
|
106536
106609
|
return { duration: 0, resolvedPath: filePath };
|
|
106537
106610
|
}
|
|
106538
106611
|
const metadata = tagName19 === "video" ? await extractVideoMetadata(filePath) : await extractAudioMetadata(filePath);
|
|
@@ -106600,10 +106673,10 @@ async function parseSubCompositions(html, projectDir, downloadDir, parentOffset
|
|
|
106600
106673
|
if (visited.has(filePath)) {
|
|
106601
106674
|
continue;
|
|
106602
106675
|
}
|
|
106603
|
-
if (!
|
|
106676
|
+
if (!existsSync14(filePath)) {
|
|
106604
106677
|
continue;
|
|
106605
106678
|
}
|
|
106606
|
-
const rawSubHtml =
|
|
106679
|
+
const rawSubHtml = readFileSync8(filePath, "utf-8");
|
|
106607
106680
|
const nestedVisited = new Set(visited);
|
|
106608
106681
|
nestedVisited.add(filePath);
|
|
106609
106682
|
workItems.push({ srcPath, absoluteStart, absoluteEnd, filePath, rawSubHtml, nestedVisited });
|
|
@@ -106797,8 +106870,8 @@ function inlineSubCompositions(html, subCompositions, projectDir) {
|
|
|
106797
106870
|
let compHtml = subCompositions.get(srcPath) || null;
|
|
106798
106871
|
if (!compHtml) {
|
|
106799
106872
|
const filePath = resolve8(projectDir, srcPath);
|
|
106800
|
-
if (
|
|
106801
|
-
compHtml =
|
|
106873
|
+
if (existsSync14(filePath)) {
|
|
106874
|
+
compHtml = readFileSync8(filePath, "utf-8");
|
|
106802
106875
|
}
|
|
106803
106876
|
}
|
|
106804
106877
|
if (!compHtml) {
|
|
@@ -107021,7 +107094,7 @@ function collectExternalAssets(html, projectDir) {
|
|
|
107021
107094
|
if (absPath.startsWith(absProjectDir + "/") || absPath === absProjectDir) {
|
|
107022
107095
|
return null;
|
|
107023
107096
|
}
|
|
107024
|
-
if (!
|
|
107097
|
+
if (!existsSync14(absPath)) return null;
|
|
107025
107098
|
const safeKey = "hf-ext/" + absPath.replace(/^\//, "");
|
|
107026
107099
|
externalAssets.set(safeKey, absPath);
|
|
107027
107100
|
return safeKey;
|
|
@@ -107066,7 +107139,7 @@ function collectExternalAssets(html, projectDir) {
|
|
|
107066
107139
|
};
|
|
107067
107140
|
}
|
|
107068
107141
|
async function compileForRender(projectDir, htmlPath, downloadDir) {
|
|
107069
|
-
const rawHtml =
|
|
107142
|
+
const rawHtml = readFileSync8(htmlPath, "utf-8");
|
|
107070
107143
|
const { html: compiledHtml, unresolvedCompositions } = await compileHtmlFile(
|
|
107071
107144
|
rawHtml,
|
|
107072
107145
|
projectDir,
|
|
@@ -107083,7 +107156,7 @@ async function compileForRender(projectDir, htmlPath, downloadDir) {
|
|
|
107083
107156
|
/(<(?:video|audio)\b[^>]*?)\s+preload\s*=\s*["']none["']/gi,
|
|
107084
107157
|
"$1"
|
|
107085
107158
|
);
|
|
107086
|
-
const coalescedHtml = injectDeterministicFontFaces(
|
|
107159
|
+
const coalescedHtml = await injectDeterministicFontFaces(
|
|
107087
107160
|
coalesceHeadStylesAndBodyScripts(promoteCssImportsToLinkTags(sanitizedHtml))
|
|
107088
107161
|
);
|
|
107089
107162
|
const assembledHtml = await inlineExternalScripts(coalescedHtml);
|
|
@@ -107321,21 +107394,21 @@ function installDebugLogger(logPath, log = defaultLogger) {
|
|
|
107321
107394
|
};
|
|
107322
107395
|
}
|
|
107323
107396
|
function writeCompiledArtifacts(compiled, workDir, includeSummary) {
|
|
107324
|
-
const compileDir =
|
|
107325
|
-
|
|
107326
|
-
|
|
107397
|
+
const compileDir = join14(workDir, "compiled");
|
|
107398
|
+
mkdirSync10(compileDir, { recursive: true });
|
|
107399
|
+
writeFileSync4(join14(compileDir, "index.html"), compiled.html, "utf-8");
|
|
107327
107400
|
for (const [srcPath, html] of compiled.subCompositions) {
|
|
107328
|
-
const outPath =
|
|
107329
|
-
|
|
107330
|
-
|
|
107401
|
+
const outPath = join14(compileDir, srcPath);
|
|
107402
|
+
mkdirSync10(dirname10(outPath), { recursive: true });
|
|
107403
|
+
writeFileSync4(outPath, html, "utf-8");
|
|
107331
107404
|
}
|
|
107332
107405
|
for (const [relativePath, absolutePath] of compiled.externalAssets) {
|
|
107333
|
-
const outPath = resolve9(
|
|
107406
|
+
const outPath = resolve9(join14(compileDir, relativePath));
|
|
107334
107407
|
if (!outPath.startsWith(compileDir + "/")) {
|
|
107335
107408
|
console.warn(`[Render] Skipping external asset with unsafe path: ${relativePath}`);
|
|
107336
107409
|
continue;
|
|
107337
107410
|
}
|
|
107338
|
-
|
|
107411
|
+
mkdirSync10(dirname10(outPath), { recursive: true });
|
|
107339
107412
|
copyFileSync2(absolutePath, outPath);
|
|
107340
107413
|
}
|
|
107341
107414
|
if (includeSummary) {
|
|
@@ -107359,7 +107432,7 @@ function writeCompiledArtifacts(compiled, workDir, includeSummary) {
|
|
|
107359
107432
|
})),
|
|
107360
107433
|
subCompositions: Array.from(compiled.subCompositions.keys())
|
|
107361
107434
|
};
|
|
107362
|
-
|
|
107435
|
+
writeFileSync4(join14(compileDir, "summary.json"), JSON.stringify(summary, null, 2), "utf-8");
|
|
107363
107436
|
}
|
|
107364
107437
|
}
|
|
107365
107438
|
function createRenderJob(config2) {
|
|
@@ -107404,8 +107477,8 @@ function extractStandaloneEntryFromIndex(indexHtml, entryFile) {
|
|
|
107404
107477
|
async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSignal) {
|
|
107405
107478
|
const moduleDir = dirname10(fileURLToPath3(import.meta.url));
|
|
107406
107479
|
const producerRoot = process.env.PRODUCER_RENDERS_DIR ? resolve9(process.env.PRODUCER_RENDERS_DIR, "..") : resolve9(moduleDir, "../..");
|
|
107407
|
-
const debugDir =
|
|
107408
|
-
const workDir = job.config.debug ?
|
|
107480
|
+
const debugDir = join14(producerRoot, ".debug");
|
|
107481
|
+
const workDir = job.config.debug ? join14(debugDir, job.id) : join14(dirname10(outputPath), `work-${job.id}`);
|
|
107409
107482
|
const pipelineStart = Date.now();
|
|
107410
107483
|
const log = job.config.logger ?? defaultLogger;
|
|
107411
107484
|
let fileServer = null;
|
|
@@ -107413,7 +107486,7 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
|
|
|
107413
107486
|
let lastBrowserConsole = [];
|
|
107414
107487
|
let restoreLogger = null;
|
|
107415
107488
|
const perfStages = {};
|
|
107416
|
-
const perfOutputPath =
|
|
107489
|
+
const perfOutputPath = join14(workDir, "perf-summary.json");
|
|
107417
107490
|
const cfg = { ...job.config.producerConfig ?? resolveConfig() };
|
|
107418
107491
|
const outputFormat = job.config.format ?? "mp4";
|
|
107419
107492
|
const isWebm = outputFormat === "webm";
|
|
@@ -107433,28 +107506,28 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
|
|
|
107433
107506
|
};
|
|
107434
107507
|
job.startedAt = /* @__PURE__ */ new Date();
|
|
107435
107508
|
assertNotAborted();
|
|
107436
|
-
if (!
|
|
107509
|
+
if (!existsSync15(workDir)) mkdirSync10(workDir, { recursive: true });
|
|
107437
107510
|
if (job.config.debug) {
|
|
107438
|
-
const logPath =
|
|
107511
|
+
const logPath = join14(workDir, "render.log");
|
|
107439
107512
|
restoreLogger = installDebugLogger(logPath, log);
|
|
107440
107513
|
}
|
|
107441
107514
|
const entryFile = job.config.entryFile || "index.html";
|
|
107442
|
-
let htmlPath =
|
|
107443
|
-
if (!
|
|
107515
|
+
let htmlPath = join14(projectDir, entryFile);
|
|
107516
|
+
if (!existsSync15(htmlPath)) {
|
|
107444
107517
|
throw new Error(`Entry file not found: ${htmlPath}`);
|
|
107445
107518
|
}
|
|
107446
107519
|
assertNotAborted();
|
|
107447
|
-
const rawEntry =
|
|
107520
|
+
const rawEntry = readFileSync9(htmlPath, "utf-8");
|
|
107448
107521
|
if (entryFile !== "index.html" && rawEntry.trimStart().startsWith("<template")) {
|
|
107449
|
-
const wrapperPath =
|
|
107450
|
-
const projectIndexPath =
|
|
107451
|
-
if (!
|
|
107522
|
+
const wrapperPath = join14(workDir, "standalone-entry.html");
|
|
107523
|
+
const projectIndexPath = join14(projectDir, "index.html");
|
|
107524
|
+
if (!existsSync15(projectIndexPath)) {
|
|
107452
107525
|
throw new Error(
|
|
107453
107526
|
`Template entry file "${entryFile}" requires a project index.html to extract its render shell.`
|
|
107454
107527
|
);
|
|
107455
107528
|
}
|
|
107456
107529
|
const standaloneHtml = extractStandaloneEntryFromIndex(
|
|
107457
|
-
|
|
107530
|
+
readFileSync9(projectIndexPath, "utf-8"),
|
|
107458
107531
|
entryFile
|
|
107459
107532
|
);
|
|
107460
107533
|
if (!standaloneHtml) {
|
|
@@ -107462,7 +107535,7 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
|
|
|
107462
107535
|
`Entry file "${entryFile}" is not mounted from index.html via data-composition-src, so it cannot be rendered independently.`
|
|
107463
107536
|
);
|
|
107464
107537
|
}
|
|
107465
|
-
|
|
107538
|
+
writeFileSync4(wrapperPath, standaloneHtml, "utf-8");
|
|
107466
107539
|
htmlPath = wrapperPath;
|
|
107467
107540
|
log.info("Extracted standalone entry from index.html host context", {
|
|
107468
107541
|
entryFile
|
|
@@ -107471,7 +107544,7 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
|
|
|
107471
107544
|
const stage1Start = Date.now();
|
|
107472
107545
|
updateJobStatus(job, "preprocessing", "Compiling composition", 5, onProgress);
|
|
107473
107546
|
const compileStart = Date.now();
|
|
107474
|
-
let compiled = await compileForRender(projectDir, htmlPath,
|
|
107547
|
+
let compiled = await compileForRender(projectDir, htmlPath, join14(workDir, "downloads"));
|
|
107475
107548
|
assertNotAborted();
|
|
107476
107549
|
perfStages.compileOnlyMs = Date.now() - compileStart;
|
|
107477
107550
|
writeCompiledArtifacts(compiled, workDir, Boolean(job.config.debug));
|
|
@@ -107500,7 +107573,7 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
|
|
|
107500
107573
|
reasons.push(`${compiled.unresolvedCompositions.length} unresolved composition(s)`);
|
|
107501
107574
|
fileServer = await createFileServer2({
|
|
107502
107575
|
projectDir,
|
|
107503
|
-
compiledDir:
|
|
107576
|
+
compiledDir: join14(workDir, "compiled"),
|
|
107504
107577
|
port: 0
|
|
107505
107578
|
});
|
|
107506
107579
|
assertNotAborted();
|
|
@@ -107513,7 +107586,7 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
|
|
|
107513
107586
|
};
|
|
107514
107587
|
probeSession = await createCaptureSession(
|
|
107515
107588
|
fileServer.url,
|
|
107516
|
-
|
|
107589
|
+
join14(workDir, "probe"),
|
|
107517
107590
|
captureOpts,
|
|
107518
107591
|
null,
|
|
107519
107592
|
cfg
|
|
@@ -107545,7 +107618,7 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
|
|
|
107545
107618
|
compiled,
|
|
107546
107619
|
resolutions,
|
|
107547
107620
|
projectDir,
|
|
107548
|
-
|
|
107621
|
+
join14(workDir, "downloads")
|
|
107549
107622
|
);
|
|
107550
107623
|
assertNotAborted();
|
|
107551
107624
|
composition.videos = compiled.videos;
|
|
@@ -107680,12 +107753,12 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
|
|
|
107680
107753
|
const stage2Start = Date.now();
|
|
107681
107754
|
updateJobStatus(job, "preprocessing", "Extracting video frames", 10, onProgress);
|
|
107682
107755
|
let frameLookup = null;
|
|
107683
|
-
const compiledDir =
|
|
107756
|
+
const compiledDir = join14(workDir, "compiled");
|
|
107684
107757
|
if (composition.videos.length > 0) {
|
|
107685
107758
|
const extractionResult = await extractAllVideoFrames(
|
|
107686
107759
|
composition.videos,
|
|
107687
107760
|
projectDir,
|
|
107688
|
-
{ fps: job.config.fps, outputDir:
|
|
107761
|
+
{ fps: job.config.fps, outputDir: join14(workDir, "video-frames") },
|
|
107689
107762
|
abortSignal,
|
|
107690
107763
|
void 0,
|
|
107691
107764
|
compiledDir
|
|
@@ -107719,13 +107792,13 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
|
|
|
107719
107792
|
}
|
|
107720
107793
|
const stage3Start = Date.now();
|
|
107721
107794
|
updateJobStatus(job, "preprocessing", "Processing audio tracks", 20, onProgress);
|
|
107722
|
-
const audioOutputPath =
|
|
107795
|
+
const audioOutputPath = join14(workDir, "audio.aac");
|
|
107723
107796
|
let hasAudio = false;
|
|
107724
107797
|
if (composition.audios.length > 0) {
|
|
107725
107798
|
const audioResult = await processCompositionAudio(
|
|
107726
107799
|
composition.audios,
|
|
107727
107800
|
projectDir,
|
|
107728
|
-
|
|
107801
|
+
join14(workDir, "audio-work"),
|
|
107729
107802
|
audioOutputPath,
|
|
107730
107803
|
job.duration,
|
|
107731
107804
|
abortSignal,
|
|
@@ -107743,13 +107816,13 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
|
|
|
107743
107816
|
if (!fileServer) {
|
|
107744
107817
|
fileServer = await createFileServer2({
|
|
107745
107818
|
projectDir,
|
|
107746
|
-
compiledDir:
|
|
107819
|
+
compiledDir: join14(workDir, "compiled"),
|
|
107747
107820
|
port: 0
|
|
107748
107821
|
});
|
|
107749
107822
|
assertNotAborted();
|
|
107750
107823
|
}
|
|
107751
|
-
const framesDir =
|
|
107752
|
-
if (!
|
|
107824
|
+
const framesDir = join14(workDir, "captured-frames");
|
|
107825
|
+
if (!existsSync15(framesDir)) mkdirSync10(framesDir, { recursive: true });
|
|
107753
107826
|
const captureOptions = {
|
|
107754
107827
|
width,
|
|
107755
107828
|
height,
|
|
@@ -107760,7 +107833,7 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
|
|
|
107760
107833
|
const workerCount = calculateOptimalWorkers(job.totalFrames, job.config.workers, cfg);
|
|
107761
107834
|
const FORMAT_EXT = { mp4: ".mp4", webm: ".webm", mov: ".mov" };
|
|
107762
107835
|
const videoExt = FORMAT_EXT[outputFormat] ?? ".mp4";
|
|
107763
|
-
const videoOnlyPath =
|
|
107836
|
+
const videoOnlyPath = join14(workDir, `video-only${videoExt}`);
|
|
107764
107837
|
const preset = getEncoderPreset(job.config.quality, outputFormat);
|
|
107765
107838
|
job.framesRendered = 0;
|
|
107766
107839
|
let streamingEncoder = null;
|
|
@@ -108029,7 +108102,7 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
|
|
|
108029
108102
|
job.perfSummary = perfSummary;
|
|
108030
108103
|
if (job.config.debug) {
|
|
108031
108104
|
try {
|
|
108032
|
-
|
|
108105
|
+
writeFileSync4(perfOutputPath, JSON.stringify(perfSummary, null, 2), "utf-8");
|
|
108033
108106
|
} catch (err) {
|
|
108034
108107
|
log.debug("Failed to write perf summary", {
|
|
108035
108108
|
perfOutputPath,
|
|
@@ -108038,8 +108111,8 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
|
|
|
108038
108111
|
}
|
|
108039
108112
|
}
|
|
108040
108113
|
if (job.config.debug) {
|
|
108041
|
-
if (
|
|
108042
|
-
const debugOutput =
|
|
108114
|
+
if (existsSync15(outputPath)) {
|
|
108115
|
+
const debugOutput = join14(workDir, `output${videoExt}`);
|
|
108043
108116
|
copyFileSync2(outputPath, debugOutput);
|
|
108044
108117
|
}
|
|
108045
108118
|
} else {
|
|
@@ -108122,7 +108195,7 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
|
|
|
108122
108195
|
await safeCleanup(
|
|
108123
108196
|
"remove workDir (error)",
|
|
108124
108197
|
() => {
|
|
108125
|
-
if (
|
|
108198
|
+
if (existsSync15(workDir)) rmSync3(workDir, { recursive: true, force: true });
|
|
108126
108199
|
},
|
|
108127
108200
|
log
|
|
108128
108201
|
);
|
|
@@ -108133,8 +108206,8 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
|
|
|
108133
108206
|
}
|
|
108134
108207
|
|
|
108135
108208
|
// src/services/hyperframeLint.ts
|
|
108136
|
-
import { existsSync as
|
|
108137
|
-
import { resolve as resolve10, join as
|
|
108209
|
+
import { existsSync as existsSync16, readFileSync as readFileSync10, statSync as statSync6 } from "node:fs";
|
|
108210
|
+
import { resolve as resolve10, join as join15 } from "node:path";
|
|
108138
108211
|
function isStringRecord(value) {
|
|
108139
108212
|
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
108140
108213
|
return false;
|
|
@@ -108162,7 +108235,7 @@ function pickEntryFile(files, preferredEntryFile) {
|
|
|
108162
108235
|
}
|
|
108163
108236
|
function readProjectEntryFile(projectDir, preferredEntryFile) {
|
|
108164
108237
|
const absProjectDir = resolve10(projectDir);
|
|
108165
|
-
if (!
|
|
108238
|
+
if (!existsSync16(absProjectDir) || !statSync6(absProjectDir).isDirectory()) {
|
|
108166
108239
|
return { error: `Project directory not found: ${absProjectDir}` };
|
|
108167
108240
|
}
|
|
108168
108241
|
const entryCandidates = [preferredEntryFile, "index.html", "src/index.html"].filter(
|
|
@@ -108173,16 +108246,16 @@ function readProjectEntryFile(projectDir, preferredEntryFile) {
|
|
|
108173
108246
|
if (!absoluteEntryPath.startsWith(absProjectDir)) {
|
|
108174
108247
|
return { error: `Entry file must stay inside project directory: ${entryFile}` };
|
|
108175
108248
|
}
|
|
108176
|
-
if (
|
|
108249
|
+
if (existsSync16(absoluteEntryPath) && statSync6(absoluteEntryPath).isFile()) {
|
|
108177
108250
|
return {
|
|
108178
108251
|
entryFile,
|
|
108179
|
-
html:
|
|
108252
|
+
html: readFileSync10(absoluteEntryPath, "utf-8"),
|
|
108180
108253
|
source: "projectDir"
|
|
108181
108254
|
};
|
|
108182
108255
|
}
|
|
108183
108256
|
}
|
|
108184
108257
|
return {
|
|
108185
|
-
error: `No HTML entry file found in project directory: ${
|
|
108258
|
+
error: `No HTML entry file found in project directory: ${join15(absProjectDir, preferredEntryFile || "index.html")}`
|
|
108186
108259
|
};
|
|
108187
108260
|
}
|
|
108188
108261
|
function prepareHyperframeLintBody(body) {
|
|
@@ -108223,12 +108296,12 @@ function runHyperframeLint(prepared) {
|
|
|
108223
108296
|
}
|
|
108224
108297
|
|
|
108225
108298
|
// src/utils/paths.ts
|
|
108226
|
-
import { resolve as resolve11, basename as basename2, join as
|
|
108299
|
+
import { resolve as resolve11, basename as basename2, join as join16 } from "node:path";
|
|
108227
108300
|
var DEFAULT_RENDERS_DIR = process.env.PRODUCER_RENDERS_DIR ?? resolve11(new URL(import.meta.url).pathname, "../../..", "renders");
|
|
108228
108301
|
function resolveRenderPaths(projectDir, outputPath, rendersDir = DEFAULT_RENDERS_DIR) {
|
|
108229
108302
|
const absoluteProjectDir = resolve11(projectDir);
|
|
108230
108303
|
const projectName = basename2(absoluteProjectDir);
|
|
108231
|
-
const resolvedOutputPath = outputPath ??
|
|
108304
|
+
const resolvedOutputPath = outputPath ?? join16(rendersDir, `${projectName}.mp4`);
|
|
108232
108305
|
const absoluteOutputPath = resolve11(resolvedOutputPath);
|
|
108233
108306
|
return { absoluteProjectDir, absoluteOutputPath };
|
|
108234
108307
|
}
|
|
@@ -108284,11 +108357,11 @@ async function prepareRenderBody(body) {
|
|
|
108284
108357
|
const projectDir = typeof body.projectDir === "string" ? body.projectDir : void 0;
|
|
108285
108358
|
if (projectDir) {
|
|
108286
108359
|
const absProjectDir = resolve12(projectDir);
|
|
108287
|
-
if (!
|
|
108360
|
+
if (!existsSync17(absProjectDir) || !statSync7(absProjectDir).isDirectory()) {
|
|
108288
108361
|
return { error: `Project directory not found: ${absProjectDir}` };
|
|
108289
108362
|
}
|
|
108290
108363
|
const entry = options.entryFile || "index.html";
|
|
108291
|
-
if (!
|
|
108364
|
+
if (!existsSync17(resolve12(absProjectDir, entry))) {
|
|
108292
108365
|
return { error: `Entry file "${entry}" not found in project directory: ${absProjectDir}` };
|
|
108293
108366
|
}
|
|
108294
108367
|
return { prepared: { input: { projectDir: absProjectDir, ...options } } };
|
|
@@ -108313,8 +108386,8 @@ async function prepareRenderBody(body) {
|
|
|
108313
108386
|
}
|
|
108314
108387
|
}
|
|
108315
108388
|
const tempRoot = process.env.PRODUCER_TMP_PROJECT_DIR || tmpdir2();
|
|
108316
|
-
const tempProjectDir = mkdtempSync(
|
|
108317
|
-
|
|
108389
|
+
const tempProjectDir = mkdtempSync(join17(tempRoot, "producer-project-"));
|
|
108390
|
+
writeFileSync5(join17(tempProjectDir, "index.html"), htmlContent, "utf-8");
|
|
108318
108391
|
return {
|
|
108319
108392
|
prepared: {
|
|
108320
108393
|
input: {
|
|
@@ -108437,7 +108510,7 @@ function createRenderHandlers(options = {}) {
|
|
|
108437
108510
|
log
|
|
108438
108511
|
);
|
|
108439
108512
|
const outputDir = dirname11(absoluteOutputPath);
|
|
108440
|
-
if (!
|
|
108513
|
+
if (!existsSync17(outputDir)) mkdirSync11(outputDir, { recursive: true });
|
|
108441
108514
|
const release = await renderSemaphore.acquire();
|
|
108442
108515
|
log.info("render started", {
|
|
108443
108516
|
requestId,
|
|
@@ -108464,7 +108537,7 @@ function createRenderHandlers(options = {}) {
|
|
|
108464
108537
|
log.info(`render progress ${pct}%`, { requestId, stage: j.currentStage, message });
|
|
108465
108538
|
}
|
|
108466
108539
|
});
|
|
108467
|
-
const fileSize =
|
|
108540
|
+
const fileSize = existsSync17(absoluteOutputPath) ? statSync7(absoluteOutputPath).size : 0;
|
|
108468
108541
|
const durationMs = Date.now() - t0;
|
|
108469
108542
|
const outputToken = store.register(absoluteOutputPath);
|
|
108470
108543
|
const outputUrl = `${outputUrlPrefix}/${outputToken}`;
|
|
@@ -108548,7 +108621,7 @@ function createRenderHandlers(options = {}) {
|
|
|
108548
108621
|
log
|
|
108549
108622
|
);
|
|
108550
108623
|
const outputDir = dirname11(absoluteOutputPath);
|
|
108551
|
-
if (!
|
|
108624
|
+
if (!existsSync17(outputDir)) mkdirSync11(outputDir, { recursive: true });
|
|
108552
108625
|
log.info("render-stream started", { requestId, projectDir: input2.projectDir });
|
|
108553
108626
|
const job = createRenderJob({
|
|
108554
108627
|
fps: input2.fps,
|
|
@@ -108593,7 +108666,7 @@ function createRenderHandlers(options = {}) {
|
|
|
108593
108666
|
},
|
|
108594
108667
|
abortController.signal
|
|
108595
108668
|
);
|
|
108596
|
-
const fileSize =
|
|
108669
|
+
const fileSize = existsSync17(absoluteOutputPath) ? statSync7(absoluteOutputPath).size : 0;
|
|
108597
108670
|
const outputToken = store.register(absoluteOutputPath);
|
|
108598
108671
|
const outputUrl = `${outputUrlPrefix}/${outputToken}`;
|
|
108599
108672
|
log.info("render-stream completed", { requestId, fileSize, perf: job.perfSummary ?? null });
|
|
@@ -108652,7 +108725,7 @@ function createRenderHandlers(options = {}) {
|
|
|
108652
108725
|
if (!artifact) {
|
|
108653
108726
|
return c.json({ success: false, error: "Output artifact not found or expired" }, 404);
|
|
108654
108727
|
}
|
|
108655
|
-
if (!
|
|
108728
|
+
if (!existsSync17(artifact.path)) {
|
|
108656
108729
|
store.delete(token);
|
|
108657
108730
|
return c.json({ success: false, error: "Output artifact file missing" }, 404);
|
|
108658
108731
|
}
|