dsh-plugin-streamnest 0.0.0-stage → 0.0.2
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/LICENSE +27 -0
- package/README.en.md +106 -0
- package/README.md +105 -2
- package/assets/logo.svg +5 -0
- package/assets/reference-projects.json +16 -0
- package/assets/screenshots/deepseek-harness-installed.png +0 -0
- package/lib/THIRD_PARTY_LICENSES.txt +2068 -0
- package/lib/apps/api/src/app.module.js +52 -0
- package/lib/apps/api/src/app.module.js.map +1 -0
- package/lib/apps/api/src/common/api-error.filter.js +22 -0
- package/lib/apps/api/src/common/api-error.filter.js.map +1 -0
- package/lib/apps/api/src/common/business-error.js +21 -0
- package/lib/apps/api/src/common/business-error.js.map +1 -0
- package/lib/apps/api/src/common/network.js +89 -0
- package/lib/apps/api/src/common/network.js.map +1 -0
- package/lib/apps/api/src/common/process.js +101 -0
- package/lib/apps/api/src/common/process.js.map +1 -0
- package/lib/apps/api/src/common/validation.js +30 -0
- package/lib/apps/api/src/common/validation.js.map +1 -0
- package/lib/apps/api/src/create-application.js +65 -0
- package/lib/apps/api/src/create-application.js.map +1 -0
- package/lib/apps/api/src/main.js +9 -0
- package/lib/apps/api/src/main.js.map +1 -0
- package/lib/apps/api/src/media/arguments.js +120 -0
- package/lib/apps/api/src/media/arguments.js.map +1 -0
- package/lib/apps/api/src/media/delete-downloads.js +129 -0
- package/lib/apps/api/src/media/delete-downloads.js.map +1 -0
- package/lib/apps/api/src/media/directory-sync.js +152 -0
- package/lib/apps/api/src/media/directory-sync.js.map +1 -0
- package/lib/apps/api/src/media/dto/media.dto.js +268 -0
- package/lib/apps/api/src/media/dto/media.dto.js.map +1 -0
- package/lib/apps/api/src/media/engines/aria2-progress.js +11 -0
- package/lib/apps/api/src/media/engines/aria2-progress.js.map +1 -0
- package/lib/apps/api/src/media/engines/aria2.js +85 -0
- package/lib/apps/api/src/media/engines/aria2.js.map +1 -0
- package/lib/apps/api/src/media/engines/direct-state.js +42 -0
- package/lib/apps/api/src/media/engines/direct-state.js.map +1 -0
- package/lib/apps/api/src/media/engines/direct.js +269 -0
- package/lib/apps/api/src/media/engines/direct.js.map +1 -0
- package/lib/apps/api/src/media/engines/js-runtime.js +125 -0
- package/lib/apps/api/src/media/engines/js-runtime.js.map +1 -0
- package/lib/apps/api/src/media/engines/types.js +2 -0
- package/lib/apps/api/src/media/engines/types.js.map +1 -0
- package/lib/apps/api/src/media/formats.js +106 -0
- package/lib/apps/api/src/media/formats.js.map +1 -0
- package/lib/apps/api/src/media/media.controller.js +312 -0
- package/lib/apps/api/src/media/media.controller.js.map +1 -0
- package/lib/apps/api/src/media/media.engine.js +446 -0
- package/lib/apps/api/src/media/media.engine.js.map +1 -0
- package/lib/apps/api/src/media/media.service.js +563 -0
- package/lib/apps/api/src/media/media.service.js.map +1 -0
- package/lib/apps/api/src/media/parsing/browser-paths.js +105 -0
- package/lib/apps/api/src/media/parsing/browser-paths.js.map +1 -0
- package/lib/apps/api/src/media/parsing/browser-pool.service.js +84 -0
- package/lib/apps/api/src/media/parsing/browser-pool.service.js.map +1 -0
- package/lib/apps/api/src/media/parsing/cache.service.js +123 -0
- package/lib/apps/api/src/media/parsing/cache.service.js.map +1 -0
- package/lib/apps/api/src/media/parsing/cookie.service.js +243 -0
- package/lib/apps/api/src/media/parsing/cookie.service.js.map +1 -0
- package/lib/apps/api/src/media/parsing/platform-data.js +131 -0
- package/lib/apps/api/src/media/parsing/platform-data.js.map +1 -0
- package/lib/apps/api/src/media/parsing/platform-parser.service.js +230 -0
- package/lib/apps/api/src/media/parsing/platform-parser.service.js.map +1 -0
- package/lib/apps/api/src/media/parsing/youtube-retry.js +24 -0
- package/lib/apps/api/src/media/parsing/youtube-retry.js.map +1 -0
- package/lib/apps/api/src/media/thumbnail.service.js +189 -0
- package/lib/apps/api/src/media/thumbnail.service.js.map +1 -0
- package/lib/apps/api/src/media/wechat/api.js +251 -0
- package/lib/apps/api/src/media/wechat/api.js.map +1 -0
- package/lib/apps/api/src/media/wechat/decode.js +121 -0
- package/lib/apps/api/src/media/wechat/decode.js.map +1 -0
- package/lib/apps/api/src/media/wechat/wechat.service.js +61 -0
- package/lib/apps/api/src/media/wechat/wechat.service.js.map +1 -0
- package/lib/apps/api/src/runtime/assets.json +98 -0
- package/lib/apps/api/src/runtime/runtime-archive.js +44 -0
- package/lib/apps/api/src/runtime/runtime-archive.js.map +1 -0
- package/lib/apps/api/src/runtime/runtime-discovery.js +163 -0
- package/lib/apps/api/src/runtime/runtime-discovery.js.map +1 -0
- package/lib/apps/api/src/runtime/runtime-installer.js +93 -0
- package/lib/apps/api/src/runtime/runtime-installer.js.map +1 -0
- package/lib/apps/api/src/runtime/runtime-manager.js +180 -0
- package/lib/apps/api/src/runtime/runtime-manager.js.map +1 -0
- package/lib/apps/api/src/runtime/runtime-manifest.js +48 -0
- package/lib/apps/api/src/runtime/runtime-manifest.js.map +1 -0
- package/lib/apps/api/src/runtime/runtime.service.js +2 -0
- package/lib/apps/api/src/runtime/runtime.service.js.map +1 -0
- package/lib/apps/api/src/storage/legacy-vault.js +66 -0
- package/lib/apps/api/src/storage/legacy-vault.js.map +1 -0
- package/lib/apps/api/src/storage/task-record.js +87 -0
- package/lib/apps/api/src/storage/task-record.js.map +1 -0
- package/lib/apps/api/src/storage/vault.store.js +321 -0
- package/lib/apps/api/src/storage/vault.store.js.map +1 -0
- package/lib/apps/api/src/system/browser-profiles.js +117 -0
- package/lib/apps/api/src/system/browser-profiles.js.map +1 -0
- package/lib/apps/api/src/system/journal.service.js +87 -0
- package/lib/apps/api/src/system/journal.service.js.map +1 -0
- package/lib/apps/api/src/system/native.service.js +106 -0
- package/lib/apps/api/src/system/native.service.js.map +1 -0
- package/lib/apps/api/src/system/system.controller.js +162 -0
- package/lib/apps/api/src/system/system.controller.js.map +1 -0
- package/lib/apps/api/src/system/system.dto.js +127 -0
- package/lib/apps/api/src/system/system.dto.js.map +1 -0
- package/lib/apps/api/src/system/system.service.js +191 -0
- package/lib/apps/api/src/system/system.service.js.map +1 -0
- package/lib/apps/shared/src/brand.js +9 -0
- package/lib/apps/shared/src/brand.js.map +1 -0
- package/lib/apps/shared/src/browser-profiles.js +15 -0
- package/lib/apps/shared/src/browser-profiles.js.map +1 -0
- package/lib/apps/shared/src/contracts.js +13 -0
- package/lib/apps/shared/src/contracts.js.map +1 -0
- package/lib/apps/shared/src/cookies.js +23 -0
- package/lib/apps/shared/src/cookies.js.map +1 -0
- package/lib/apps/shared/src/links.js +7 -0
- package/lib/apps/shared/src/links.js.map +1 -0
- package/lib/apps/shared/src/media-files.js +17 -0
- package/lib/apps/shared/src/media-files.js.map +1 -0
- package/lib/apps/shared/src/messages.js +255 -0
- package/lib/apps/shared/src/messages.js.map +1 -0
- package/lib/apps/shared/src/parse-errors.js +69 -0
- package/lib/apps/shared/src/parse-errors.js.map +1 -0
- package/lib/apps/shared/src/preferences.js +26 -0
- package/lib/apps/shared/src/preferences.js.map +1 -0
- package/lib/apps/shared/src/system.js +7 -0
- package/lib/apps/shared/src/system.js.map +1 -0
- package/lib/apps/shared/src/task-messages.js +21 -0
- package/lib/apps/shared/src/task-messages.js.map +1 -0
- package/lib/apps/shared/src/thumbnail.js +16 -0
- package/lib/apps/shared/src/thumbnail.js.map +1 -0
- package/lib/client.js +43785 -0
- package/lib/index.js +1 -0
- package/lib/packages/harness/src/index.js +46 -0
- package/lib/packages/harness/src/index.js.map +1 -0
- package/lib/packages/harness/src/tools/business-errors.js +47 -0
- package/lib/packages/harness/src/tools/business-errors.js.map +1 -0
- package/lib/packages/harness/src/tools/permissions.js +24 -0
- package/lib/packages/harness/src/tools/permissions.js.map +1 -0
- package/lib/packages/harness/src/tools/register.js +356 -0
- package/lib/packages/harness/src/tools/register.js.map +1 -0
- package/lib/packages/harness/src/tools/schemas.js +248 -0
- package/lib/packages/harness/src/tools/schemas.js.map +1 -0
- package/lib/packages/harness/src/tools/system-schemas.js +88 -0
- package/lib/packages/harness/src/tools/system-schemas.js.map +1 -0
- package/lib/packages/harness/src/tools/system-tools.js +193 -0
- package/lib/packages/harness/src/tools/system-tools.js.map +1 -0
- package/licenses/downvid.LICENSE +22 -0
- package/licenses/wx_channels_download.LICENSE +35 -0
- package/package.json +150 -3
- package/packages/harness/cordis.patch.yml +3 -0
- package/packages/harness/locale/en.json +6 -0
- package/packages/harness/locale/zh.json +6 -0
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var AppModule_1;
|
|
8
|
+
import { Module } from '@nestjs/common';
|
|
9
|
+
import { WechatService } from './media/wechat/wechat.service.js';
|
|
10
|
+
import { MediaController } from './media/media.controller.js';
|
|
11
|
+
import { MediaEngine } from './media/media.engine.js';
|
|
12
|
+
import { MediaService } from './media/media.service.js';
|
|
13
|
+
import { RuntimeService } from './runtime/runtime.service.js';
|
|
14
|
+
import { DATA_DIRECTORY, VaultStore } from './storage/vault.store.js';
|
|
15
|
+
import { ParseCache } from './media/parsing/cache.service.js';
|
|
16
|
+
import { CookieService } from './media/parsing/cookie.service.js';
|
|
17
|
+
import { PlatformParser } from './media/parsing/platform-parser.service.js';
|
|
18
|
+
import { BrowserPool } from './media/parsing/browser-pool.service.js';
|
|
19
|
+
import { NativeService } from './system/native.service.js';
|
|
20
|
+
import { SystemService } from './system/system.service.js';
|
|
21
|
+
import { JournalService } from './system/journal.service.js';
|
|
22
|
+
import { SystemController } from './system/system.controller.js';
|
|
23
|
+
import { ThumbnailService } from './media/thumbnail.service.js';
|
|
24
|
+
let AppModule = AppModule_1 = class AppModule {
|
|
25
|
+
static register(directory) {
|
|
26
|
+
return {
|
|
27
|
+
module: AppModule_1,
|
|
28
|
+
controllers: [MediaController, SystemController],
|
|
29
|
+
providers: [
|
|
30
|
+
{ provide: DATA_DIRECTORY, useValue: directory },
|
|
31
|
+
VaultStore,
|
|
32
|
+
RuntimeService,
|
|
33
|
+
ParseCache,
|
|
34
|
+
CookieService,
|
|
35
|
+
BrowserPool,
|
|
36
|
+
PlatformParser,
|
|
37
|
+
WechatService,
|
|
38
|
+
JournalService,
|
|
39
|
+
NativeService,
|
|
40
|
+
SystemService,
|
|
41
|
+
MediaEngine,
|
|
42
|
+
ThumbnailService,
|
|
43
|
+
MediaService,
|
|
44
|
+
],
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
AppModule = AppModule_1 = __decorate([
|
|
49
|
+
Module({})
|
|
50
|
+
], AppModule);
|
|
51
|
+
export { AppModule };
|
|
52
|
+
//# sourceMappingURL=app.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app.module.js","sourceRoot":"","sources":["../../../../apps/api/src/app.module.ts"],"names":[],"mappings":";;;;;;;AAAA,OAAO,EAAE,MAAM,EAAsB,MAAM,gBAAgB,CAAC;AAE5D,OAAO,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,4CAA4C,CAAC;AAC5E,OAAO,EAAE,WAAW,EAAE,MAAM,yCAAyC,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAGzD,IAAM,SAAS,iBAAf,MAAM,SAAS;IACpB,MAAM,CAAC,QAAQ,CAAC,SAAiB;QAC/B,OAAO;YACL,MAAM,EAAE,WAAS;YACjB,WAAW,EAAE,CAAC,eAAe,EAAE,gBAAgB,CAAC;YAChD,SAAS,EAAE;gBACT,EAAE,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,SAAS,EAAE;gBAChD,UAAU;gBACV,cAAc;gBACd,UAAU;gBACV,aAAa;gBACb,WAAW;gBACX,cAAc;gBACd,aAAa;gBACb,cAAc;gBACd,aAAa;gBACb,aAAa;gBACb,WAAW;gBACX,gBAAgB;gBAChB,YAAY;aACb;SACF,CAAC;IACJ,CAAC;CACF,CAAA;AAvBY,SAAS;IADrB,MAAM,CAAC,EAAE,CAAC;GACE,SAAS,CAuBrB"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { Catch, HttpException } from '@nestjs/common';
|
|
8
|
+
import { businessErrorResponse } from './business-error.js';
|
|
9
|
+
/** Preserve actionable dependency/extractor messages without exposing a stack. */
|
|
10
|
+
let ApiErrorFilter = class ApiErrorFilter {
|
|
11
|
+
catch(error, host) {
|
|
12
|
+
const response = host.switchToHttp().getResponse();
|
|
13
|
+
response
|
|
14
|
+
.status(error instanceof HttpException ? error.getStatus() : 503)
|
|
15
|
+
.json(businessErrorResponse(error));
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
ApiErrorFilter = __decorate([
|
|
19
|
+
Catch()
|
|
20
|
+
], ApiErrorFilter);
|
|
21
|
+
export { ApiErrorFilter };
|
|
22
|
+
//# sourceMappingURL=api-error.filter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-error.filter.js","sourceRoot":"","sources":["../../../../../apps/api/src/common/api-error.filter.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,KAAK,EAAE,aAAa,EAA4C,MAAM,gBAAgB,CAAC;AAEhG,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,kFAAkF;AAE3E,IAAM,cAAc,GAApB,MAAM,cAAc;IACzB,KAAK,CAAC,KAAc,EAAE,IAAmB;QACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,WAAW,EAAY,CAAC;QAC7D,QAAQ;aACL,MAAM,CAAC,KAAK,YAAY,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;aAChE,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC,CAAC;IACxC,CAAC;CACF,CAAA;AAPY,cAAc;IAD1B,KAAK,EAAE;GACK,cAAc,CAO1B"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { HttpException } from '@nestjs/common';
|
|
2
|
+
import { businessMessage, errorMessage, readBusinessMessage, } from '../../../shared/src/messages.js';
|
|
3
|
+
/** The HTTP and Agent boundaries serialize the same service errors. */
|
|
4
|
+
export function businessErrorResponse(error, fallback) {
|
|
5
|
+
if (!(error instanceof HttpException))
|
|
6
|
+
return errorMessage(error, fallback);
|
|
7
|
+
const response = error.getResponse();
|
|
8
|
+
const known = readBusinessMessage(response);
|
|
9
|
+
if (known)
|
|
10
|
+
return known;
|
|
11
|
+
const status = error.getStatus();
|
|
12
|
+
const code = status === 400 ? 'VALIDATION_FAILED' : status === 404 ? 'ROUTE_NOT_FOUND' : 'REQUEST_FAILED';
|
|
13
|
+
const value = typeof response === 'string' ? response : response.message;
|
|
14
|
+
const detail = Array.isArray(value)
|
|
15
|
+
? value.join('; ')
|
|
16
|
+
: typeof value === 'string'
|
|
17
|
+
? value
|
|
18
|
+
: error.message;
|
|
19
|
+
return businessMessage(code, { fields: detail }, detail);
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=business-error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"business-error.js","sourceRoot":"","sources":["../../../../../apps/api/src/common/business-error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C,OAAO,EACL,eAAe,EACf,YAAY,EACZ,mBAAmB,GAGpB,MAAM,iCAAiC,CAAC;AAEzC,uEAAuE;AACvE,MAAM,UAAU,qBAAqB,CAAC,KAAc,EAAE,QAAuB;IAC3E,IAAI,CAAC,CAAC,KAAK,YAAY,aAAa,CAAC;QAAE,OAAO,YAAY,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAE5E,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IACrC,MAAM,KAAK,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IAC5C,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC;IAExB,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;IACjC,MAAM,IAAI,GACR,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,gBAAgB,CAAC;IAC/F,MAAM,KAAK,GACT,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAE,QAAkC,CAAC,OAAO,CAAC;IACxF,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACjC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;QAClB,CAAC,CAAC,OAAO,KAAK,KAAK,QAAQ;YACzB,CAAC,CAAC,KAAK;YACP,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC;IACpB,OAAO,eAAe,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,MAAM,CAAC,CAAC;AAC3D,CAAC"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { BusinessError } from '../../../shared/src/messages.js';
|
|
2
|
+
import { request as requestHttp } from 'node:http';
|
|
3
|
+
import { request as requestHttps } from 'node:https';
|
|
4
|
+
import { Readable } from 'node:stream';
|
|
5
|
+
import { createBrotliDecompress, createGunzip, createInflate } from 'node:zlib';
|
|
6
|
+
import { HttpProxyAgent } from 'http-proxy-agent';
|
|
7
|
+
import { HttpsProxyAgent } from 'https-proxy-agent';
|
|
8
|
+
import { SocksProxyAgent } from 'socks-proxy-agent';
|
|
9
|
+
/** 同一传输层用于平台 API、CDN、缩略图与代理测试;保留证书校验。 */
|
|
10
|
+
async function requestOnce(url, options) {
|
|
11
|
+
options.signal?.throwIfAborted();
|
|
12
|
+
if (!['http:', 'https:'].includes(url.protocol))
|
|
13
|
+
throw new BusinessError('HTTP_ONLY');
|
|
14
|
+
const agent = !options.proxy
|
|
15
|
+
? undefined
|
|
16
|
+
: options.proxy.startsWith('socks')
|
|
17
|
+
? new SocksProxyAgent(options.proxy)
|
|
18
|
+
: url.protocol === 'https:'
|
|
19
|
+
? new HttpsProxyAgent(options.proxy)
|
|
20
|
+
: new HttpProxyAgent(options.proxy);
|
|
21
|
+
return new Promise((resolve, reject) => {
|
|
22
|
+
const send = url.protocol === 'https:' ? requestHttps : requestHttp;
|
|
23
|
+
const request = send(url, { method: options.method ?? 'GET', headers: options.headers, agent, signal: options.signal }, (incoming) => {
|
|
24
|
+
clearTimeout(headerTimer);
|
|
25
|
+
const headers = new Headers();
|
|
26
|
+
for (let index = 0; index < incoming.rawHeaders.length; index += 2) {
|
|
27
|
+
headers.append(incoming.rawHeaders[index], incoming.rawHeaders[index + 1]);
|
|
28
|
+
}
|
|
29
|
+
incoming.once('close', () => agent?.destroy());
|
|
30
|
+
const status = incoming.statusCode ?? 502;
|
|
31
|
+
const withoutBody = options.method === 'HEAD' || [204, 205, 304].includes(status);
|
|
32
|
+
const encoding = incoming.headers['content-encoding'];
|
|
33
|
+
const decompressor = encoding === 'gzip'
|
|
34
|
+
? createGunzip()
|
|
35
|
+
: encoding === 'br'
|
|
36
|
+
? createBrotliDecompress()
|
|
37
|
+
: encoding === 'deflate'
|
|
38
|
+
? createInflate()
|
|
39
|
+
: undefined;
|
|
40
|
+
if (decompressor) {
|
|
41
|
+
incoming.once('error', (error) => decompressor.destroy(error));
|
|
42
|
+
headers.delete('content-encoding');
|
|
43
|
+
headers.delete('content-length');
|
|
44
|
+
}
|
|
45
|
+
const stream = decompressor ? incoming.pipe(decompressor) : incoming;
|
|
46
|
+
const body = withoutBody ? null : Readable.toWeb(stream);
|
|
47
|
+
if (withoutBody)
|
|
48
|
+
incoming.resume();
|
|
49
|
+
const result = new Response(body, { status, statusText: incoming.statusMessage, headers });
|
|
50
|
+
Object.defineProperty(result, 'url', { value: url.href });
|
|
51
|
+
resolve(result);
|
|
52
|
+
});
|
|
53
|
+
const headerTimer = setTimeout(() => request.destroy(new BusinessError('RESPONSE_TIMEOUT')), options.timeoutMs ?? 30_000);
|
|
54
|
+
headerTimer.unref();
|
|
55
|
+
request.setTimeout(options.timeoutMs ?? 30_000, () => request.destroy(new BusinessError('CONNECTION_TIMEOUT')));
|
|
56
|
+
request.once('error', (error) => {
|
|
57
|
+
clearTimeout(headerTimer);
|
|
58
|
+
agent?.destroy();
|
|
59
|
+
reject(error);
|
|
60
|
+
});
|
|
61
|
+
if (options.body)
|
|
62
|
+
request.write(options.body);
|
|
63
|
+
request.end();
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
export async function fetchNetwork(input, options = {}) {
|
|
67
|
+
let url = new URL(input);
|
|
68
|
+
let current = { ...options, headers: { ...options.headers } };
|
|
69
|
+
for (let redirects = 0; redirects <= 8; redirects++) {
|
|
70
|
+
await current.validateUrl?.(url);
|
|
71
|
+
const response = await requestOnce(url, current);
|
|
72
|
+
if (![301, 302, 303, 307, 308].includes(response.status))
|
|
73
|
+
return response;
|
|
74
|
+
const location = response.headers.get('location');
|
|
75
|
+
if (!location)
|
|
76
|
+
return response;
|
|
77
|
+
await response.body?.cancel();
|
|
78
|
+
const next = new URL(location, url);
|
|
79
|
+
if (next.origin !== url.origin) {
|
|
80
|
+
current.headers = Object.fromEntries(Object.entries(current.headers).filter(([name]) => !['cookie', 'authorization'].includes(name.toLowerCase())));
|
|
81
|
+
}
|
|
82
|
+
if (response.status === 303 ||
|
|
83
|
+
([301, 302].includes(response.status) && current.method === 'POST'))
|
|
84
|
+
current = { ...current, method: 'GET', body: undefined };
|
|
85
|
+
url = next;
|
|
86
|
+
}
|
|
87
|
+
throw new BusinessError('TOO_MANY_REDIRECTS');
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=network.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"network.js","sourceRoot":"","sources":["../../../../../apps/api/src/common/network.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { BusinessError } from '../../../shared/src/messages.js';
|
|
2
|
+
import { spawn } from 'node:child_process';
|
|
3
|
+
import { createInterface } from 'node:readline';
|
|
4
|
+
import { StringDecoder } from 'node:string_decoder';
|
|
5
|
+
/** Kill the full process group, including FFmpeg, and settle only after close. */
|
|
6
|
+
function terminate(child) {
|
|
7
|
+
if (!child.pid)
|
|
8
|
+
return;
|
|
9
|
+
if (process.platform === 'win32') {
|
|
10
|
+
const killer = spawn('taskkill', ['/pid', String(child.pid), '/T', '/F'], {
|
|
11
|
+
windowsHide: true,
|
|
12
|
+
stdio: 'ignore',
|
|
13
|
+
});
|
|
14
|
+
killer.on('error', () => child.kill());
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
try {
|
|
18
|
+
process.kill(-child.pid, 'SIGTERM');
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
child.kill('SIGTERM');
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export function runProcess(binary, args, options = {}) {
|
|
25
|
+
options.signal?.throwIfAborted();
|
|
26
|
+
return new Promise((resolve, reject) => {
|
|
27
|
+
const child = spawn(binary, args, {
|
|
28
|
+
windowsHide: true,
|
|
29
|
+
detached: process.platform !== 'win32',
|
|
30
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
31
|
+
});
|
|
32
|
+
let stdout = '';
|
|
33
|
+
let stderr = '';
|
|
34
|
+
let failure;
|
|
35
|
+
let killTimer;
|
|
36
|
+
const decoder = new StringDecoder('utf8');
|
|
37
|
+
const stop = () => {
|
|
38
|
+
terminate(child);
|
|
39
|
+
killTimer ??= setTimeout(() => {
|
|
40
|
+
if (!child.pid || process.platform === 'win32')
|
|
41
|
+
return;
|
|
42
|
+
try {
|
|
43
|
+
process.kill(-child.pid, 'SIGKILL');
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
/* Already closed. */
|
|
47
|
+
}
|
|
48
|
+
}, 3_000);
|
|
49
|
+
killTimer.unref();
|
|
50
|
+
};
|
|
51
|
+
const timer = options.timeoutMs === 0
|
|
52
|
+
? undefined
|
|
53
|
+
: setTimeout(() => {
|
|
54
|
+
failure = new BusinessError('PROCESS_TIMEOUT');
|
|
55
|
+
stop();
|
|
56
|
+
}, options.timeoutMs ?? 3_600_000);
|
|
57
|
+
timer?.unref();
|
|
58
|
+
options.signal?.addEventListener('abort', stop, { once: true });
|
|
59
|
+
child.stdout.on('data', (chunk) => {
|
|
60
|
+
stdout += decoder.write(chunk);
|
|
61
|
+
if (stdout.length > 8 * 1024 * 1024) {
|
|
62
|
+
if (options.line)
|
|
63
|
+
stdout = stdout.slice(-512_000);
|
|
64
|
+
else {
|
|
65
|
+
failure = new BusinessError('PROCESS_OUTPUT_LIMIT');
|
|
66
|
+
stop();
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
child.stderr.on('data', (chunk) => {
|
|
71
|
+
stderr = (stderr + chunk.toString('utf8')).slice(-16_000);
|
|
72
|
+
});
|
|
73
|
+
const readers = options.line
|
|
74
|
+
? [child.stdout, child.stderr].map((stream) => {
|
|
75
|
+
const reader = createInterface({ input: stream });
|
|
76
|
+
reader.on('line', options.line);
|
|
77
|
+
return reader;
|
|
78
|
+
})
|
|
79
|
+
: [];
|
|
80
|
+
child.on('error', (error) => {
|
|
81
|
+
failure = error;
|
|
82
|
+
});
|
|
83
|
+
child.on('close', (code) => {
|
|
84
|
+
clearTimeout(timer);
|
|
85
|
+
clearTimeout(killTimer);
|
|
86
|
+
options.signal?.removeEventListener('abort', stop);
|
|
87
|
+
readers.forEach((reader) => reader.close());
|
|
88
|
+
if (options.signal?.aborted)
|
|
89
|
+
return reject(options.signal.reason);
|
|
90
|
+
if (failure)
|
|
91
|
+
return reject(failure);
|
|
92
|
+
if (code !== 0)
|
|
93
|
+
return reject(new BusinessError('PROCESS_FAILED', {
|
|
94
|
+
reason: stderr.trim().slice(-2_000) || String(code),
|
|
95
|
+
exitCode: code ?? -1,
|
|
96
|
+
}));
|
|
97
|
+
resolve({ stdout: stdout + decoder.end(), stderr });
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=process.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process.js","sourceRoot":"","sources":["../../../../../apps/api/src/common/process.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,KAAK,EAAqB,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAOpD,kFAAkF;AAClF,SAAS,SAAS,CAAC,KAAmB;IACpC,IAAI,CAAC,KAAK,CAAC,GAAG;QAAE,OAAO;IAEvB,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,MAAM,MAAM,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE;YACxE,WAAW,EAAE,IAAI;YACjB,KAAK,EAAE,QAAQ;SAChB,CAAC,CAAC;QACH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QACvC,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACxB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CACxB,MAAc,EACd,IAAc,EACd,UAAuF,EAAE;IAEzF,OAAO,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC;IAEjC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE;YAChC,WAAW,EAAE,IAAI;YACjB,QAAQ,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO;YACtC,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;SAClC,CAAC,CAAC;QACH,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,OAA0B,CAAC;QAC/B,IAAI,SAAoD,CAAC;QACzD,MAAM,OAAO,GAAG,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC;QAE1C,MAAM,IAAI,GAAG,GAAG,EAAE;YAChB,SAAS,CAAC,KAAK,CAAC,CAAC;YACjB,SAAS,KAAK,UAAU,CAAC,GAAG,EAAE;gBAC5B,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;oBAAE,OAAO;gBACvD,IAAI,CAAC;oBACH,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;gBACtC,CAAC;gBAAC,MAAM,CAAC;oBACP,qBAAqB;gBACvB,CAAC;YACH,CAAC,EAAE,KAAK,CAAC,CAAC;YACV,SAAS,CAAC,KAAK,EAAE,CAAC;QACpB,CAAC,CAAC;QACF,MAAM,KAAK,GACT,OAAO,CAAC,SAAS,KAAK,CAAC;YACrB,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE;gBACd,OAAO,GAAG,IAAI,aAAa,CAAC,iBAAiB,CAAC,CAAC;gBAC/C,IAAI,EAAE,CAAC;YACT,CAAC,EAAE,OAAO,CAAC,SAAS,IAAI,SAAS,CAAC,CAAC;QACzC,KAAK,EAAE,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAEhE,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YACxC,MAAM,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC/B,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC;gBACpC,IAAI,OAAO,CAAC,IAAI;oBAAE,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC;qBAC7C,CAAC;oBACJ,OAAO,GAAG,IAAI,aAAa,CAAC,sBAAsB,CAAC,CAAC;oBACpD,IAAI,EAAE,CAAC;gBACT,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YACxC,MAAM,GAAG,CAAC,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI;YAC1B,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;gBAC1C,MAAM,MAAM,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;gBAClD,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,IAAK,CAAC,CAAC;gBACjC,OAAO,MAAM,CAAC;YAChB,CAAC,CAAC;YACJ,CAAC,CAAC,EAAE,CAAC;QAEP,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YAC1B,OAAO,GAAG,KAAK,CAAC;QAClB,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACzB,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,YAAY,CAAC,SAAS,CAAC,CAAC;YACxB,OAAO,CAAC,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YACnD,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YAE5C,IAAI,OAAO,CAAC,MAAM,EAAE,OAAO;gBAAE,OAAO,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAClE,IAAI,OAAO;gBAAE,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC;YACpC,IAAI,IAAI,KAAK,CAAC;gBACZ,OAAO,MAAM,CACX,IAAI,aAAa,CAAC,gBAAgB,EAAE;oBAClC,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC;oBACnD,QAAQ,EAAE,IAAI,IAAI,CAAC,CAAC;iBACrB,CAAC,CACH,CAAC;YAEJ,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { BadRequestException } from '@nestjs/common';
|
|
2
|
+
import { plainToInstance } from 'class-transformer';
|
|
3
|
+
import { isUUID, validate } from 'class-validator';
|
|
4
|
+
import { businessMessage } from '../../../shared/src/messages.js';
|
|
5
|
+
export function validateUuid(value, field) {
|
|
6
|
+
if (!isUUID(value))
|
|
7
|
+
throw new BadRequestException(businessMessage('VALIDATION_FAILED', { fields: field }));
|
|
8
|
+
}
|
|
9
|
+
export function invalidDto(errors) {
|
|
10
|
+
const fields = (items, prefix = '') => items.flatMap((error) => {
|
|
11
|
+
const property = prefix ? `${prefix}.${error.property}` : error.property;
|
|
12
|
+
return [...(error.constraints ? [property] : []), ...fields(error.children ?? [], property)];
|
|
13
|
+
});
|
|
14
|
+
return new BadRequestException(businessMessage('VALIDATION_FAILED', {
|
|
15
|
+
fields: [...new Set(fields(errors))].sort().join(', '),
|
|
16
|
+
}));
|
|
17
|
+
}
|
|
18
|
+
/** The Agent boundary uses the same DTO validation as HTTP controllers. */
|
|
19
|
+
export async function validateDto(type, value) {
|
|
20
|
+
const dto = plainToInstance(type, value);
|
|
21
|
+
const errors = await validate(dto, {
|
|
22
|
+
whitelist: true,
|
|
23
|
+
forbidNonWhitelisted: true,
|
|
24
|
+
forbidUnknownValues: true,
|
|
25
|
+
});
|
|
26
|
+
if (errors.length)
|
|
27
|
+
throw invalidDto(errors);
|
|
28
|
+
return dto;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../../../../apps/api/src/common/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAyB,MAAM,mBAAmB,CAAC;AAC3E,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAwB,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAElE,MAAM,UAAU,YAAY,CAAC,KAAa,EAAE,KAAa;IACvD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;QAChB,MAAM,IAAI,mBAAmB,CAAC,eAAe,CAAC,mBAAmB,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;AAC3F,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAyB;IAClD,MAAM,MAAM,GAAG,CAAC,KAAwB,EAAE,MAAM,GAAG,EAAE,EAAY,EAAE,CACjE,KAAK,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;QACtB,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC;QACzE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,IAAI,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC/F,CAAC,CAAC,CAAC;IAEL,OAAO,IAAI,mBAAmB,CAC5B,eAAe,CAAC,mBAAmB,EAAE;QACnC,MAAM,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;KACvD,CAAC,CACH,CAAC;AACJ,CAAC;AAED,2EAA2E;AAC3E,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,IAAyB,EACzB,KAAc;IAEd,MAAM,GAAG,GAAG,eAAe,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,GAAG,EAAE;QACjC,SAAS,EAAE,IAAI;QACf,oBAAoB,EAAE,IAAI;QAC1B,mBAAmB,EAAE,IAAI;KAC1B,CAAC,CAAC;IACH,IAAI,MAAM,CAAC,MAAM;QAAE,MAAM,UAAU,CAAC,MAAM,CAAC,CAAC;IAE5C,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
import { NestFactory } from '@nestjs/core';
|
|
3
|
+
import { ValidationPipe } from '@nestjs/common';
|
|
4
|
+
import { ExpressAdapter } from '@nestjs/platform-express';
|
|
5
|
+
import express from 'express';
|
|
6
|
+
import { API_PREFIX } from '../../shared/src/contracts.js';
|
|
7
|
+
import { AppModule } from './app.module.js';
|
|
8
|
+
import { MediaService } from './media/media.service.js';
|
|
9
|
+
import { ApiErrorFilter } from './common/api-error.filter.js';
|
|
10
|
+
import { invalidDto } from './common/validation.js';
|
|
11
|
+
import { businessMessage } from '../../shared/src/messages.js';
|
|
12
|
+
export function localRequestPolicy(request, response, next) {
|
|
13
|
+
const allowed = new Set(['127.0.0.1', 'localhost', '[::1]']);
|
|
14
|
+
let target;
|
|
15
|
+
try {
|
|
16
|
+
target = new URL(`http://${request.headers.host ?? ''}`);
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
response.status(403).json(businessMessage('REQUEST_FORBIDDEN'));
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
if (!allowed.has(target.hostname) ||
|
|
23
|
+
!['127.0.0.1', '::1', '::ffff:127.0.0.1'].includes(request.socket.remoteAddress ?? '') ||
|
|
24
|
+
(request.headers.origin !== undefined && request.headers.origin !== target.origin) ||
|
|
25
|
+
request.headers['sec-fetch-site'] === 'cross-site') {
|
|
26
|
+
response.status(403).json(businessMessage('REQUEST_FORBIDDEN'));
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
next();
|
|
30
|
+
}
|
|
31
|
+
export async function createApplication(directory, standalone = false) {
|
|
32
|
+
const http = express();
|
|
33
|
+
http.disable('x-powered-by');
|
|
34
|
+
if (standalone)
|
|
35
|
+
http.use(API_PREFIX, localRequestPolicy);
|
|
36
|
+
http.use((_request, response, next) => {
|
|
37
|
+
response.setHeader('Cache-Control', 'no-store');
|
|
38
|
+
response.setHeader('X-Content-Type-Options', 'nosniff');
|
|
39
|
+
next();
|
|
40
|
+
});
|
|
41
|
+
const app = await NestFactory.create(AppModule.register(directory), new ExpressAdapter(http), {
|
|
42
|
+
logger: ['error', 'warn'],
|
|
43
|
+
bodyParser: false,
|
|
44
|
+
});
|
|
45
|
+
app.use(express.json({ limit: '64kb' }));
|
|
46
|
+
app.setGlobalPrefix(API_PREFIX.slice(1));
|
|
47
|
+
app.useGlobalPipes(new ValidationPipe({
|
|
48
|
+
transform: true,
|
|
49
|
+
whitelist: true,
|
|
50
|
+
forbidNonWhitelisted: true,
|
|
51
|
+
forbidUnknownValues: true,
|
|
52
|
+
exceptionFactory: invalidDto,
|
|
53
|
+
}));
|
|
54
|
+
app.useGlobalFilters(new ApiErrorFilter());
|
|
55
|
+
await app.init();
|
|
56
|
+
try {
|
|
57
|
+
await app.get(MediaService).initialize();
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
await app.close();
|
|
61
|
+
throw error;
|
|
62
|
+
}
|
|
63
|
+
return { app, http };
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=create-application.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-application.js","sourceRoot":"","sources":["../../../../apps/api/src/create-application.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { resolve } from 'node:path';
|
|
2
|
+
import { createApplication } from './create-application.js';
|
|
3
|
+
import { API_PREFIX } from '../../shared/src/contracts.js';
|
|
4
|
+
const { app } = await createApplication(resolve(process.env.STREAMNEST_DATA_DIR ?? '.data'), true);
|
|
5
|
+
const port = Number(process.env.STREAMNEST_PORT ?? 4322);
|
|
6
|
+
app.enableShutdownHooks();
|
|
7
|
+
await app.listen(port, '127.0.0.1');
|
|
8
|
+
console.log(`拾流 API:http://127.0.0.1:${port}${API_PREFIX}`);
|
|
9
|
+
//# sourceMappingURL=main.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../../../apps/api/src/main.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAE3D,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,iBAAiB,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,OAAO,CAAC,EAAE,IAAI,CAAC,CAAC;AACnG,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,IAAI,CAAC,CAAC;AAEzD,GAAG,CAAC,mBAAmB,EAAE,CAAC;AAC1B,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;AACpC,OAAO,CAAC,GAAG,CAAC,2BAA2B,IAAI,GAAG,UAAU,EAAE,CAAC,CAAC"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { dirname } from 'node:path';
|
|
2
|
+
import { browserCookieSource, effectiveLoginPreferences } from '../../../shared/src/cookies.js';
|
|
3
|
+
export const PROGRESS_PREFIX = '[mv-progress]';
|
|
4
|
+
export const FILE_PREFIX = '[mv-file]';
|
|
5
|
+
export const POSTPROCESS_PREFIX = '[mv-process]';
|
|
6
|
+
export const ENGINE_PREFIX = '[mv-engine]';
|
|
7
|
+
export function commonArguments(preferences, options = {}) {
|
|
8
|
+
preferences = effectiveLoginPreferences(preferences);
|
|
9
|
+
const args = [
|
|
10
|
+
'--ignore-config',
|
|
11
|
+
'--no-playlist',
|
|
12
|
+
'--playlist-items',
|
|
13
|
+
'1',
|
|
14
|
+
'--encoding',
|
|
15
|
+
'utf-8',
|
|
16
|
+
'--socket-timeout',
|
|
17
|
+
'20',
|
|
18
|
+
'--retries',
|
|
19
|
+
'3',
|
|
20
|
+
];
|
|
21
|
+
if (preferences.proxy)
|
|
22
|
+
args.push('--proxy', preferences.proxy);
|
|
23
|
+
if (options.cookies !== false && preferences.cookiesFile)
|
|
24
|
+
args.push('--cookies', preferences.cookiesFile);
|
|
25
|
+
else if (options.cookies !== false && preferences.cookieBrowser)
|
|
26
|
+
args.push('--cookies-from-browser', browserCookieSource(preferences));
|
|
27
|
+
// Harness runs on Node; never use the Electron launcher as a JS runtime.
|
|
28
|
+
if (options.runtime !== false && !process.versions.electron)
|
|
29
|
+
args.push('--js-runtimes', `node:${process.execPath}`);
|
|
30
|
+
return args;
|
|
31
|
+
}
|
|
32
|
+
export function downloadArguments(media, request, preferences, outputDirectory, ffmpeg, context) {
|
|
33
|
+
const format = media.formats.find((entry) => entry.id === request.formatId);
|
|
34
|
+
const track = media.audioTracks.find((entry) => entry.id === request.audioTrackId);
|
|
35
|
+
const audio = track?.id ?? 'bestaudio';
|
|
36
|
+
const preferredHeight = Number(preferences.preferredQuality);
|
|
37
|
+
const bestVideo = preferredHeight > 0
|
|
38
|
+
? `bv*[height<=${preferredHeight}]+${audio}/b[height<=${preferredHeight}]`
|
|
39
|
+
: `bv*+${audio}/b`;
|
|
40
|
+
const selector = track?.isM3u8
|
|
41
|
+
? (track.formatId ?? track.id)
|
|
42
|
+
: !format
|
|
43
|
+
? bestVideo
|
|
44
|
+
: format.hasAudio && !track
|
|
45
|
+
? `${format.id}/bv*+ba/b`
|
|
46
|
+
: `${format.id}+${audio}/${format.id}/bv*+ba/b`;
|
|
47
|
+
const args = [
|
|
48
|
+
...commonArguments(preferences, context ? { cookies: false, runtime: !context.jsRuntime } : {}),
|
|
49
|
+
'--no-overwrites',
|
|
50
|
+
'--continue',
|
|
51
|
+
'--newline',
|
|
52
|
+
'--progress',
|
|
53
|
+
'--progress-template',
|
|
54
|
+
`download:${PROGRESS_PREFIX}%(progress.downloaded_bytes)s|%(progress.total_bytes)s|%(progress.total_bytes_estimate)s|%(progress.speed)s|%(progress.eta)s`,
|
|
55
|
+
'--progress-template',
|
|
56
|
+
`postprocess:${POSTPROCESS_PREFIX}%(progress.status)s`,
|
|
57
|
+
'--print',
|
|
58
|
+
`after_move:${FILE_PREFIX}%(filepath)s`,
|
|
59
|
+
'--concurrent-fragments',
|
|
60
|
+
String(preferences.fragments),
|
|
61
|
+
'--http-chunk-size',
|
|
62
|
+
'10M',
|
|
63
|
+
'--paths',
|
|
64
|
+
outputDirectory,
|
|
65
|
+
'-o',
|
|
66
|
+
completeFilenameTemplate(preferences.filenameTemplate),
|
|
67
|
+
];
|
|
68
|
+
if (ffmpeg)
|
|
69
|
+
args.push('--ffmpeg-location', dirname(ffmpeg));
|
|
70
|
+
if (request.mode === 'subtitle')
|
|
71
|
+
args.push('--skip-download');
|
|
72
|
+
else if (request.mode === 'audio')
|
|
73
|
+
args.push('-f', request.audioFormatId ?? track?.id ?? 'bestaudio/best', '-x', '--audio-format', 'mp3', '--audio-quality', '0');
|
|
74
|
+
else
|
|
75
|
+
args.push('-f', selector, '--merge-output-format', 'mp4');
|
|
76
|
+
if (request.subtitles?.length)
|
|
77
|
+
args.push('--write-subs', '--write-auto-subs', '--sub-langs', request.subtitles.join(','), '--sub-format', 'srt/best');
|
|
78
|
+
if (request.subtitles?.length && request.subtitleFormat !== 'source')
|
|
79
|
+
args.push('--convert-subs', 'srt');
|
|
80
|
+
if (context) {
|
|
81
|
+
args.push(...context.cookieArgs, ...context.extractorArgs);
|
|
82
|
+
if (context.jsRuntime)
|
|
83
|
+
args.push('--js-runtimes', `${context.jsRuntime.kind}:${context.jsRuntime.path}`);
|
|
84
|
+
if (context.aria2Path) {
|
|
85
|
+
const connections = preferences.acceleration?.enabled === false
|
|
86
|
+
? 1
|
|
87
|
+
: (preferences.acceleration?.maxConnections ?? 8);
|
|
88
|
+
args.push('--downloader', `http:${context.aria2Path}`, '--downloader', 'dash,m3u8:native', '--downloader-args', `aria2c:--no-conf=true --max-connection-per-server=${connections} --split=${connections} --min-split-size=1M --file-allocation=none --max-tries=3 --retry-wait=2 --connect-timeout=15 --timeout=30 --auto-save-interval=1 --check-certificate=true --enable-color=false --human-readable=false --summary-interval=1`, '--paths', `temp:${outputDirectory}/.aria2`);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
if (context?.cachePath)
|
|
92
|
+
args.push('--load-info-json', context.cachePath);
|
|
93
|
+
else
|
|
94
|
+
args.push('--', media.url);
|
|
95
|
+
return args;
|
|
96
|
+
}
|
|
97
|
+
export function completeFilenameTemplate(template = '%(title).160B [%(id)s].%(ext)s') {
|
|
98
|
+
return template.includes('%(ext)') ? template : `${template}.%(ext)s`;
|
|
99
|
+
}
|
|
100
|
+
export function parseProgress(line) {
|
|
101
|
+
if (!line.startsWith(PROGRESS_PREFIX))
|
|
102
|
+
return undefined;
|
|
103
|
+
const values = line
|
|
104
|
+
.slice(PROGRESS_PREFIX.length)
|
|
105
|
+
.split('|')
|
|
106
|
+
.map((value) => {
|
|
107
|
+
const number = Number(value);
|
|
108
|
+
return Number.isFinite(number) ? Math.max(0, number) : 0;
|
|
109
|
+
});
|
|
110
|
+
const [downloadedBytes = 0, exact = 0, estimate = 0, speed = 0, eta = 0] = values;
|
|
111
|
+
const totalBytes = exact || estimate;
|
|
112
|
+
return {
|
|
113
|
+
downloadedBytes,
|
|
114
|
+
totalBytes,
|
|
115
|
+
speed,
|
|
116
|
+
eta,
|
|
117
|
+
progress: totalBytes ? Math.min(99, (downloadedBytes / totalBytes) * 100) : 0,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=arguments.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arguments.js","sourceRoot":"","sources":["../../../../../apps/api/src/media/arguments.ts"],"names":[],"mappings":"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"}
|