libre-webui 0.33.0 → 0.34.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/backend/dist/db.d.ts +2 -2
- package/backend/dist/db.d.ts.map +1 -1
- package/backend/dist/db.js +14 -6
- package/backend/dist/db.js.map +1 -1
- package/backend/dist/env.d.ts.map +1 -1
- package/backend/dist/env.js +21 -9
- package/backend/dist/env.js.map +1 -1
- package/backend/dist/index.js +4 -4
- package/backend/dist/index.js.map +1 -1
- package/backend/dist/middleware/cors.d.ts +23 -0
- package/backend/dist/middleware/cors.d.ts.map +1 -0
- package/backend/dist/middleware/cors.js +69 -0
- package/backend/dist/middleware/cors.js.map +1 -0
- package/backend/dist/models/personaModel.d.ts.map +1 -1
- package/backend/dist/models/personaModel.js +2 -2
- package/backend/dist/models/personaModel.js.map +1 -1
- package/backend/dist/models/userModel.d.ts.map +1 -1
- package/backend/dist/models/userModel.js +3 -3
- package/backend/dist/models/userModel.js.map +1 -1
- package/backend/dist/persistence/postgresResourceRepositories.js +3 -3
- package/backend/dist/persistence/postgresResourceRepositories.js.map +1 -1
- package/backend/dist/persistence/sqliteResourceRepositories.js +3 -3
- package/backend/dist/persistence/sqliteResourceRepositories.js.map +1 -1
- package/backend/dist/routes/calendar.js +2 -2
- package/backend/dist/routes/calendar.js.map +1 -1
- package/backend/dist/routes/documents.js +2 -2
- package/backend/dist/routes/documents.js.map +1 -1
- package/backend/dist/routes/huggingfaceHub.d.ts.map +1 -1
- package/backend/dist/routes/huggingfaceHub.js +47 -21
- package/backend/dist/routes/huggingfaceHub.js.map +1 -1
- package/backend/dist/services/agentCliService.d.ts.map +1 -1
- package/backend/dist/services/agentCliService.js +3 -1
- package/backend/dist/services/agentCliService.js.map +1 -1
- package/backend/dist/services/automationService.d.ts.map +1 -1
- package/backend/dist/services/automationService.js +3 -4
- package/backend/dist/services/automationService.js.map +1 -1
- package/backend/dist/services/chatService.d.ts.map +1 -1
- package/backend/dist/services/chatService.js +11 -11
- package/backend/dist/services/chatService.js.map +1 -1
- package/backend/dist/services/chatToolRuntimeService.d.ts +11 -0
- package/backend/dist/services/chatToolRuntimeService.d.ts.map +1 -1
- package/backend/dist/services/chatToolRuntimeService.js +2 -13
- package/backend/dist/services/chatToolRuntimeService.js.map +1 -1
- package/backend/dist/services/codexOAuthService.js +11 -7
- package/backend/dist/services/codexOAuthService.js.map +1 -1
- package/backend/dist/services/documentService.d.ts.map +1 -1
- package/backend/dist/services/documentService.js +3 -3
- package/backend/dist/services/documentService.js.map +1 -1
- package/backend/dist/services/galleryService.d.ts.map +1 -1
- package/backend/dist/services/galleryService.js +2 -2
- package/backend/dist/services/galleryService.js.map +1 -1
- package/backend/dist/services/libreClawService.d.ts +1 -1
- package/backend/dist/services/libreClawService.d.ts.map +1 -1
- package/backend/dist/services/libreClawService.js +16 -16
- package/backend/dist/services/libreClawService.js.map +1 -1
- package/backend/dist/services/memoryService.d.ts.map +1 -1
- package/backend/dist/services/memoryService.js +2 -2
- package/backend/dist/services/memoryService.js.map +1 -1
- package/backend/dist/services/mutationEngineService.js +2 -2
- package/backend/dist/services/mutationEngineService.js.map +1 -1
- package/backend/dist/services/ollamaService.d.ts +7 -2
- package/backend/dist/services/ollamaService.d.ts.map +1 -1
- package/backend/dist/services/ollamaService.js +120 -98
- package/backend/dist/services/ollamaService.js.map +1 -1
- package/backend/dist/services/ollamaSettingsService.js +1 -1
- package/backend/dist/services/ollamaSettingsService.js.map +1 -1
- package/backend/dist/services/pluginAudioGenerationService.d.ts.map +1 -1
- package/backend/dist/services/pluginAudioGenerationService.js +24 -11
- package/backend/dist/services/pluginAudioGenerationService.js.map +1 -1
- package/backend/dist/services/pluginCredentialsService.js +2 -2
- package/backend/dist/services/pluginCredentialsService.js.map +1 -1
- package/backend/dist/services/pluginEmbeddingService.d.ts.map +1 -1
- package/backend/dist/services/pluginEmbeddingService.js +20 -16
- package/backend/dist/services/pluginEmbeddingService.js.map +1 -1
- package/backend/dist/services/pluginImageGenerationService.d.ts.map +1 -1
- package/backend/dist/services/pluginImageGenerationService.js +93 -62
- package/backend/dist/services/pluginImageGenerationService.js.map +1 -1
- package/backend/dist/services/pluginSTTService.d.ts.map +1 -1
- package/backend/dist/services/pluginSTTService.js +15 -11
- package/backend/dist/services/pluginSTTService.js.map +1 -1
- package/backend/dist/services/pluginService.d.ts.map +1 -1
- package/backend/dist/services/pluginService.js +26 -23
- package/backend/dist/services/pluginService.js.map +1 -1
- package/backend/dist/services/pluginTTSService.d.ts.map +1 -1
- package/backend/dist/services/pluginTTSService.js +34 -27
- package/backend/dist/services/pluginTTSService.js.map +1 -1
- package/backend/dist/services/pluginVariablesService.d.ts.map +1 -1
- package/backend/dist/services/pluginVariablesService.js +2 -2
- package/backend/dist/services/pluginVariablesService.js.map +1 -1
- package/backend/dist/services/pluginVideoGenerationService.d.ts.map +1 -1
- package/backend/dist/services/pluginVideoGenerationService.js +33 -24
- package/backend/dist/services/pluginVideoGenerationService.js.map +1 -1
- package/backend/dist/services/preferencesService.d.ts +5 -0
- package/backend/dist/services/preferencesService.d.ts.map +1 -1
- package/backend/dist/services/preferencesService.js +8 -0
- package/backend/dist/services/preferencesService.js.map +1 -1
- package/backend/dist/services/promptService.d.ts.map +1 -1
- package/backend/dist/services/promptService.js +4 -4
- package/backend/dist/services/promptService.js.map +1 -1
- package/backend/dist/services/skillService.d.ts.map +1 -1
- package/backend/dist/services/skillService.js +6 -6
- package/backend/dist/services/skillService.js.map +1 -1
- package/backend/dist/services/toolApprovalService.d.ts.map +1 -1
- package/backend/dist/services/toolApprovalService.js +2 -3
- package/backend/dist/services/toolApprovalService.js.map +1 -1
- package/backend/dist/services/toolServerService.d.ts.map +1 -1
- package/backend/dist/services/toolServerService.js +4 -5
- package/backend/dist/services/toolServerService.js.map +1 -1
- package/backend/dist/services/workApprovalService.d.ts.map +1 -1
- package/backend/dist/services/workApprovalService.js +3 -3
- package/backend/dist/services/workApprovalService.js.map +1 -1
- package/backend/dist/services/workModelProviderService.d.ts +13 -2
- package/backend/dist/services/workModelProviderService.d.ts.map +1 -1
- package/backend/dist/services/workModelProviderService.js +16 -5
- package/backend/dist/services/workModelProviderService.js.map +1 -1
- package/backend/dist/services/workPolicyService.d.ts.map +1 -1
- package/backend/dist/services/workPolicyService.js +2 -2
- package/backend/dist/services/workPolicyService.js.map +1 -1
- package/backend/dist/services/workTaskService.d.ts.map +1 -1
- package/backend/dist/services/workTaskService.js +7 -7
- package/backend/dist/services/workTaskService.js.map +1 -1
- package/backend/dist/storage.d.ts.map +1 -1
- package/backend/dist/storage.js +2 -2
- package/backend/dist/storage.js.map +1 -1
- package/backend/dist/utils/hash.js +1 -1
- package/backend/dist/utils/hash.js.map +1 -1
- package/backend/dist/utils/pluginDefinitionTrust.js +1 -1
- package/backend/dist/utils/providerFetch.d.ts +90 -0
- package/backend/dist/utils/providerFetch.d.ts.map +1 -0
- package/backend/dist/utils/providerFetch.js +316 -0
- package/backend/dist/utils/providerFetch.js.map +1 -0
- package/backend/dist/utils/websocketCloseCodes.d.ts +31 -0
- package/backend/dist/utils/websocketCloseCodes.d.ts.map +1 -0
- package/backend/dist/utils/websocketCloseCodes.js +134 -0
- package/backend/dist/utils/websocketCloseCodes.js.map +1 -0
- package/backend/dist/workScreenServer.d.ts.map +1 -1
- package/backend/dist/workScreenServer.js +7 -2
- package/backend/dist/workScreenServer.js.map +1 -1
- package/backend/package.json +5 -14
- package/bin/cli-args.js +71 -0
- package/bin/cli.js +14 -3
- package/frontend/dist/artifact-runtime/.build-fingerprint +1 -1
- package/frontend/dist/assets/index-By_-fwuh.css +1 -0
- package/frontend/dist/assets/index-D3XhYdgN.js +108 -0
- package/frontend/dist/index.html +25 -25
- package/frontend/dist/js/{ArtifactContainer-BB6A8cT5.js → ArtifactContainer-8ZacPNwg.js} +1 -1
- package/frontend/dist/js/{ArtifactDemoPage-Bf1dW5Z3.js → ArtifactDemoPage-DvvT45ZJ.js} +1 -1
- package/frontend/dist/js/{ArtifactSandboxFrame-DsZW0Axy.js → ArtifactSandboxFrame-Dbp1bB_9.js} +1 -1
- package/frontend/dist/js/ArtifactSlideOutPanel-Ct9nlG_6.js +1 -0
- package/frontend/dist/js/AutomationModal-Ie_MxC18.js +1 -0
- package/frontend/dist/js/AutomationsPage-Czg-rMEr.js +1 -0
- package/frontend/dist/js/{AvatarUpload-gfZ9QWR3.js → AvatarUpload-DgyIHr7P.js} +1 -1
- package/frontend/dist/js/{Button-BQ5JnUVj.js → Button-BxwbQ5xw.js} +1 -1
- package/frontend/dist/js/CalendarPage-D1ZeHpZ0.js +1 -0
- package/frontend/dist/js/ChannelsPage-DgXZdSLa.js +1 -0
- package/frontend/dist/js/ChatPage-ov4Xlf8Q.js +14 -0
- package/frontend/dist/js/ConnectModels-Cg7Wp-43.js +1 -0
- package/frontend/dist/js/{EvaluationsPage-Cydglp6R.js → EvaluationsPage-BBafHC8o.js} +2 -2
- package/frontend/dist/js/{FirstTimeSetup-C5cc-bc9.js → FirstTimeSetup-Cd9cLLz6.js} +1 -1
- package/frontend/dist/js/{GalleryPage-Dvq2GVoH.js → GalleryPage-6aa0A9fS.js} +1 -1
- package/frontend/dist/js/HomePage-1vKjY6Aw.js +1 -0
- package/frontend/dist/js/LibreClawPage-DXxJP96Q.js +1 -0
- package/frontend/dist/js/{Logo-BlcOFpac.js → Logo-BHz_QQlV.js} +1 -1
- package/frontend/dist/js/{LogoMark-CNeQ6eO9.js → LogoMark-BDqTSfCe.js} +1 -1
- package/frontend/dist/js/{ModelManagerModals-K1oiXMTv.js → ModelManagerModals-BBGWbTTi.js} +1 -1
- package/frontend/dist/js/NotesPage-DCLkl9a9.js +3 -0
- package/frontend/dist/js/{PasswordStrengthMeter-DVFLKG_-.js → PasswordStrengthMeter-DLQ5jaO_.js} +1 -1
- package/frontend/dist/js/{PersonasPage-DK9-SDZQ.js → PersonasPage-HYkaAXAe.js} +2 -2
- package/frontend/dist/js/PluginUsagePage-B2MRIZme.js +1 -0
- package/frontend/dist/js/RichMessageContent-2fzm0XIM.js +1 -0
- package/frontend/dist/js/{RichMessageContent-XMkRvBen.js → RichMessageContent-BnpRgouz.js} +1 -1
- package/frontend/dist/js/SettingsModal-4ITUSJqi.js +19 -0
- package/frontend/dist/js/SettingsToggle-DdhWCK7-.js +1 -0
- package/frontend/dist/js/{ShareDialog-CZpU1itx.js → ShareDialog-BdFJRfxV.js} +1 -1
- package/frontend/dist/js/{SystemPage-BVaaKTRs.js → SystemPage-DkKnu35i.js} +1 -1
- package/frontend/dist/js/UserManagementPanel-Dpn15Nyr.js +1 -0
- package/frontend/dist/js/{WhatsNewModal-CoFCdUpf.js → WhatsNewModal-BH-kE-Wb.js} +1 -1
- package/frontend/dist/js/WorkPage-CCyCPnwr.js +7 -0
- package/frontend/dist/js/api-DOlirnw_.js +1 -0
- package/frontend/dist/js/{api-DQdJeQjd.js → api-HgGU3dII.js} +1 -1
- package/frontend/dist/js/{appNavigation-DRM2Jr4r.js → appNavigation-DAd7SkU_.js} +1 -1
- package/frontend/dist/js/appStore-DefVAJAx.js +2 -0
- package/frontend/dist/js/appVersion-RvElMU1Q.js +1 -0
- package/frontend/dist/js/{ar-C8Izi_rT.js → ar-CM3oZcHT.js} +1 -1
- package/frontend/dist/js/authStore-AE-cc9PJ.js +1 -0
- package/frontend/dist/js/{authStore-DkqtNSYP.js → authStore-DbDFBMx0.js} +3 -3
- package/frontend/dist/js/{bn-BJJgi-6Q.js → bn-BuYroL_j.js} +1 -1
- package/frontend/dist/js/{chatStore-8jYk48hC.js → chatStore-DYm9cXVV.js} +3 -3
- package/frontend/dist/js/{config-D4dduT3C.js → config-BH2zUU2X.js} +1 -1
- package/frontend/dist/js/{cs-DheVrMUl.js → cs-D3NqP5wD.js} +1 -1
- package/frontend/dist/js/{da-BLszIs3a.js → da-BGpE68rg.js} +1 -1
- package/frontend/dist/js/{de-BvWdcr7T.js → de-BjYUQYNL.js} +1 -1
- package/frontend/dist/js/{es-CQ8Yauda.js → es-vNJrO8Lj.js} +1 -1
- package/frontend/dist/js/{evaluationsApi-CBKjxZUn.js → evaluationsApi-v6Qj2fFv.js} +1 -1
- package/frontend/dist/js/{fr-BD5h-w8z.js → fr-BvtHFXNM.js} +1 -1
- package/frontend/dist/js/{hi-IlRhC5IE.js → hi-CUfuHlbY.js} +1 -1
- package/frontend/dist/js/{id-DalGMQEJ.js → id-B4CE64s6.js} +1 -1
- package/frontend/dist/js/{is-DuQqmHeS.js → is-Dr6Is7-Q.js} +1 -1
- package/frontend/dist/js/{it-DDaqAdB1.js → it-Cj4NfoeU.js} +1 -1
- package/frontend/dist/js/{ja-CYCu9F9Y.js → ja-DByiJVO0.js} +1 -1
- package/frontend/dist/js/{ko-P3JZPOXE.js → ko-DqBvZqIv.js} +1 -1
- package/frontend/dist/js/{messageCodeStyles-0_YpQDk4.js → messageCodeStyles-ERvWXB7Y.js} +2 -2
- package/frontend/dist/js/{ms-B3ZIqlUn.js → ms-DobJ-R5X.js} +1 -1
- package/frontend/dist/js/{nl-1Qpsmmz1.js → nl-D4tVIakl.js} +1 -1
- package/frontend/dist/js/{pl-ErrMri3_.js → pl-BIoYiVJA.js} +1 -1
- package/frontend/dist/js/{pt-0T0R9AtX.js → pt-Bzww3XtB.js} +1 -1
- package/frontend/dist/js/{ru-B34INyPg.js → ru-lqQ-JuMd.js} +1 -1
- package/frontend/dist/js/{sv-BSqDwAur.js → sv-9dcksSEJ.js} +1 -1
- package/frontend/dist/js/{teamEventStream-RoMYo102.js → teamEventStream-CTyr4r5f.js} +1 -1
- package/frontend/dist/js/{th-DK9M4-Iy.js → th-DuOX28lk.js} +1 -1
- package/frontend/dist/js/{tr-DUrkEwr1.js → tr-Dz7bMTi1.js} +1 -1
- package/frontend/dist/js/{ui-UU79S5lB.js → ui-CHgZA8lG.js} +2 -2
- package/frontend/dist/js/{ui-vendor-6y6qiSk5.js → ui-vendor-BvD5yGW1.js} +1 -1
- package/frontend/dist/js/{uk-B5DYTi0e.js → uk-aTAky5l4.js} +1 -1
- package/frontend/dist/js/{useChat-ImXXcy0q.js → useChat-CXcosgJB.js} +1 -1
- package/frontend/dist/js/useDictation-BGlY44fp.js +1 -0
- package/frontend/dist/js/{useTranslation-D0mJ4NnO.js → useTranslation-rdLmo6zV.js} +1 -1
- package/frontend/dist/js/{utils-Bn0RE9_8.js → utils-CKWltgs8.js} +1 -1
- package/frontend/dist/js/utils-vendor-Bla8iz2s.js +1 -0
- package/frontend/dist/js/{vi-CrtPQUIM.js → vi-CHcYXhCs.js} +1 -1
- package/frontend/dist/js/webauthnClient-B1yv1m81.js +1 -0
- package/frontend/dist/js/workApi-CntsmsAA.js +6 -0
- package/frontend/dist/js/workApi-nKavXIsg.js +1 -0
- package/frontend/dist/js/{zh-gbOKajYe.js → zh-DvvksD8_.js} +1 -1
- package/package.json +4 -14
- package/plugins/codex-oauth.json +1 -0
- package/frontend/dist/assets/index-DegYzMyw.js +0 -70
- package/frontend/dist/assets/index-gKj8Y1JB.css +0 -1
- package/frontend/dist/js/ArtifactSlideOutPanel-Cartcixp.js +0 -1
- package/frontend/dist/js/AutomationModal-BI_3nFeg.js +0 -1
- package/frontend/dist/js/AutomationsPage-ChMXj4UG.js +0 -1
- package/frontend/dist/js/CalendarPage-Ce1ud5St.js +0 -1
- package/frontend/dist/js/ChannelsPage-kl8zJ2HA.js +0 -1
- package/frontend/dist/js/ChatPage-Bj98c6rc.js +0 -14
- package/frontend/dist/js/ConnectModels-CPftHmE3.js +0 -1
- package/frontend/dist/js/HomePage-zVjADRoX.js +0 -1
- package/frontend/dist/js/LibreClawPage-x0Qmtcnc.js +0 -1
- package/frontend/dist/js/NotesPage-BnqBv-n1.js +0 -3
- package/frontend/dist/js/PluginUsagePage-DX9uxdRr.js +0 -1
- package/frontend/dist/js/RichMessageContent-BzfhfzQ4.js +0 -1
- package/frontend/dist/js/SettingsModal-CMOwEhkG.js +0 -19
- package/frontend/dist/js/SettingsToggle-B7UynBmZ.js +0 -1
- package/frontend/dist/js/UserManagementPanel-BxAvybHj.js +0 -1
- package/frontend/dist/js/WorkPage-Du6llCSU.js +0 -7
- package/frontend/dist/js/api-CatP45JH.js +0 -1
- package/frontend/dist/js/appStore-BXbVcTeo.js +0 -2
- package/frontend/dist/js/appVersion-BUroqcki.js +0 -1
- package/frontend/dist/js/authStore-bqAN5v4N.js +0 -1
- package/frontend/dist/js/axios-CYkJpKn8.js +0 -1
- package/frontend/dist/js/useDictation-eMIAncoT.js +0 -1
- package/frontend/dist/js/utils-vendor-BbPbaAuC.js +0 -9
- package/frontend/dist/js/webauthnClient-CPSq528Q.js +0 -1
- package/frontend/dist/js/workApi-BM8qVq_w.js +0 -1
- package/frontend/dist/js/workApi-xhF57amo.js +0 -6
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Libre WebUI
|
|
3
|
+
* Copyright (C) 2025 Kroonen AI, Inc.
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at:
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/
|
|
17
|
+
import { Readable } from 'node:stream';
|
|
18
|
+
export class ProviderHttpError extends Error {
|
|
19
|
+
constructor(url, response, message) {
|
|
20
|
+
super(message || `Request failed with status code ${response.status}`);
|
|
21
|
+
this.name = 'ProviderHttpError';
|
|
22
|
+
this.url = url;
|
|
23
|
+
this.response = response;
|
|
24
|
+
this.code = response.status >= 500 ? 'ERR_BAD_RESPONSE' : 'ERR_BAD_REQUEST';
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
export class ProviderTimeoutError extends Error {
|
|
28
|
+
constructor(url, timeoutMs) {
|
|
29
|
+
super(`timeout of ${timeoutMs}ms exceeded`);
|
|
30
|
+
this.name = 'ProviderTimeoutError';
|
|
31
|
+
this.code = 'ECONNABORTED';
|
|
32
|
+
this.url = url;
|
|
33
|
+
this.request = { url };
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
export class ProviderNetworkError extends Error {
|
|
37
|
+
constructor(url, cause) {
|
|
38
|
+
super(describeCause(cause) || 'Network Error');
|
|
39
|
+
this.name = 'ProviderNetworkError';
|
|
40
|
+
this.url = url;
|
|
41
|
+
this.code = systemCode(cause) || 'ERR_NETWORK';
|
|
42
|
+
this.request = { url };
|
|
43
|
+
this.cause = cause;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/** Walk a fetch failure's cause chain for an OS-level error code. */
|
|
47
|
+
const systemCode = (cause, depth = 0) => {
|
|
48
|
+
if (!cause || typeof cause !== 'object' || depth > 4)
|
|
49
|
+
return '';
|
|
50
|
+
const error = cause;
|
|
51
|
+
if (typeof error.code === 'string' && /^E[A-Z]+$/.test(error.code)) {
|
|
52
|
+
return error.code;
|
|
53
|
+
}
|
|
54
|
+
if (Array.isArray(error.errors)) {
|
|
55
|
+
for (const inner of error.errors) {
|
|
56
|
+
const code = systemCode(inner, depth + 1);
|
|
57
|
+
if (code)
|
|
58
|
+
return code;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return systemCode(error.cause, depth + 1);
|
|
62
|
+
};
|
|
63
|
+
export class ProviderResponseTooLargeError extends Error {
|
|
64
|
+
constructor(url, limit) {
|
|
65
|
+
super(`maxContentLength size of ${limit} exceeded`);
|
|
66
|
+
this.name = 'ProviderResponseTooLargeError';
|
|
67
|
+
this.code = 'ERR_BAD_RESPONSE';
|
|
68
|
+
this.url = url;
|
|
69
|
+
this.limit = limit;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
const describeCause = (cause) => {
|
|
73
|
+
if (!cause || typeof cause !== 'object')
|
|
74
|
+
return '';
|
|
75
|
+
const error = cause;
|
|
76
|
+
const inner = error.cause;
|
|
77
|
+
const code = inner?.code ?? error.code;
|
|
78
|
+
const message = inner?.message ?? error.message;
|
|
79
|
+
if (typeof message === 'string' && message && message !== 'fetch failed') {
|
|
80
|
+
return message;
|
|
81
|
+
}
|
|
82
|
+
return typeof code === 'string' ? code : '';
|
|
83
|
+
};
|
|
84
|
+
const createCancelError = (reason) => {
|
|
85
|
+
const error = new Error(reason instanceof Error && reason.message ? reason.message : 'canceled');
|
|
86
|
+
error.name = 'AbortError';
|
|
87
|
+
error.code = 'ERR_CANCELED';
|
|
88
|
+
return error;
|
|
89
|
+
};
|
|
90
|
+
/** True for a caller abort, whichever layer produced the error. */
|
|
91
|
+
export const isProviderRequestCancelled = (error) => {
|
|
92
|
+
if (error instanceof DOMException && error.name === 'AbortError')
|
|
93
|
+
return true;
|
|
94
|
+
if (typeof error !== 'object' || error === null)
|
|
95
|
+
return false;
|
|
96
|
+
const candidate = error;
|
|
97
|
+
return (candidate.name === 'AbortError' ||
|
|
98
|
+
candidate.name === 'CanceledError' ||
|
|
99
|
+
candidate.code === 'ABORT_ERR' ||
|
|
100
|
+
candidate.code === 'ERR_CANCELED');
|
|
101
|
+
};
|
|
102
|
+
export const isProviderHttpError = (error) => error instanceof ProviderHttpError;
|
|
103
|
+
export const isProviderTimeout = (error) => error instanceof ProviderTimeoutError ||
|
|
104
|
+
(typeof error === 'object' &&
|
|
105
|
+
error !== null &&
|
|
106
|
+
error.code === 'ECONNABORTED');
|
|
107
|
+
const headersToRecord = (headers) => {
|
|
108
|
+
const record = {};
|
|
109
|
+
headers.forEach((value, key) => {
|
|
110
|
+
record[key.toLowerCase()] = value;
|
|
111
|
+
});
|
|
112
|
+
return record;
|
|
113
|
+
};
|
|
114
|
+
const compactHeaders = (headers) => {
|
|
115
|
+
const out = {};
|
|
116
|
+
for (const [key, value] of Object.entries(headers || {})) {
|
|
117
|
+
if (value !== undefined && value !== null)
|
|
118
|
+
out[key] = String(value);
|
|
119
|
+
}
|
|
120
|
+
return out;
|
|
121
|
+
};
|
|
122
|
+
const hasHeader = (headers, name) => Object.keys(headers).some(key => key.toLowerCase() === name.toLowerCase());
|
|
123
|
+
const looksLikeJson = (contentType, text) => contentType.includes('json') || /^\s*[[{]/.test(text.slice(0, 64));
|
|
124
|
+
const decodeText = (bytes, contentType) => {
|
|
125
|
+
const text = bytes.toString('utf8');
|
|
126
|
+
if (!text)
|
|
127
|
+
return null;
|
|
128
|
+
if (!looksLikeJson(contentType, text))
|
|
129
|
+
return text;
|
|
130
|
+
try {
|
|
131
|
+
return JSON.parse(text);
|
|
132
|
+
}
|
|
133
|
+
catch {
|
|
134
|
+
return text;
|
|
135
|
+
}
|
|
136
|
+
};
|
|
137
|
+
/** Read a body fully, refusing to buffer more than `limit` bytes. */
|
|
138
|
+
export async function readBodyBounded(response, url, limit, onChunk) {
|
|
139
|
+
if (limit !== undefined) {
|
|
140
|
+
const declared = Number(response.headers.get('content-length'));
|
|
141
|
+
if (Number.isFinite(declared) && declared > limit) {
|
|
142
|
+
await response.body?.cancel().catch(() => { });
|
|
143
|
+
throw new ProviderResponseTooLargeError(url, limit);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
if (!response.body)
|
|
147
|
+
return Buffer.alloc(0);
|
|
148
|
+
const reader = response.body.getReader();
|
|
149
|
+
const chunks = [];
|
|
150
|
+
let received = 0;
|
|
151
|
+
for (;;) {
|
|
152
|
+
const { done, value } = await reader.read();
|
|
153
|
+
if (done)
|
|
154
|
+
break;
|
|
155
|
+
onChunk?.();
|
|
156
|
+
received += value.byteLength;
|
|
157
|
+
if (limit !== undefined && received > limit) {
|
|
158
|
+
await reader.cancel().catch(() => { });
|
|
159
|
+
throw new ProviderResponseTooLargeError(url, limit);
|
|
160
|
+
}
|
|
161
|
+
chunks.push(Buffer.from(value));
|
|
162
|
+
}
|
|
163
|
+
return Buffer.concat(chunks);
|
|
164
|
+
}
|
|
165
|
+
const ERROR_BODY_MAX_BYTES = 1024 * 1024;
|
|
166
|
+
const decodeErrorBody = async (response, url, responseType) => {
|
|
167
|
+
try {
|
|
168
|
+
const bytes = await readBodyBounded(response, url, ERROR_BODY_MAX_BYTES);
|
|
169
|
+
if (responseType === 'bytes')
|
|
170
|
+
return bytes;
|
|
171
|
+
return decodeText(bytes, response.headers.get('content-type') || '');
|
|
172
|
+
}
|
|
173
|
+
catch {
|
|
174
|
+
return null;
|
|
175
|
+
}
|
|
176
|
+
};
|
|
177
|
+
/**
|
|
178
|
+
* Perform one outbound request. See the module comment for the contract.
|
|
179
|
+
*/
|
|
180
|
+
export async function providerRequest(options) {
|
|
181
|
+
const { url, signal, timeoutMs = 0, responseType = 'json', maxResponseBytes, redirect = 'error', } = options;
|
|
182
|
+
const method = (options.method ||
|
|
183
|
+
(options.body !== undefined || options.json !== undefined ? 'POST' : 'GET')).toUpperCase();
|
|
184
|
+
const headers = compactHeaders(options.headers);
|
|
185
|
+
let body = options.body;
|
|
186
|
+
if (options.json !== undefined) {
|
|
187
|
+
body = JSON.stringify(options.json);
|
|
188
|
+
if (!hasHeader(headers, 'content-type')) {
|
|
189
|
+
headers['Content-Type'] = 'application/json';
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
else if (Buffer.isBuffer(body)) {
|
|
193
|
+
body = new Uint8Array(body.buffer, body.byteOffset, body.byteLength);
|
|
194
|
+
}
|
|
195
|
+
if (signal?.aborted)
|
|
196
|
+
throw createCancelError(signal.reason);
|
|
197
|
+
// The timeout is an idle timeout, as the axios socket timeout was: it is
|
|
198
|
+
// re-armed on every chunk, so a slow but live download or a long stream is
|
|
199
|
+
// not cut off, while a stalled peer still fails after `timeoutMs`.
|
|
200
|
+
const signals = [];
|
|
201
|
+
if (signal)
|
|
202
|
+
signals.push(signal);
|
|
203
|
+
const timeoutController = timeoutMs > 0 ? new AbortController() : undefined;
|
|
204
|
+
let timer;
|
|
205
|
+
let timedOut = false;
|
|
206
|
+
const armTimer = () => {
|
|
207
|
+
if (!timeoutController)
|
|
208
|
+
return;
|
|
209
|
+
clearTimeout(timer);
|
|
210
|
+
timer = setTimeout(() => {
|
|
211
|
+
timedOut = true;
|
|
212
|
+
timeoutController.abort();
|
|
213
|
+
}, timeoutMs);
|
|
214
|
+
};
|
|
215
|
+
const disarmTimer = () => clearTimeout(timer);
|
|
216
|
+
if (timeoutController)
|
|
217
|
+
signals.push(timeoutController.signal);
|
|
218
|
+
const combined = signals.length > 1 ? AbortSignal.any(signals) : signals[0];
|
|
219
|
+
armTimer();
|
|
220
|
+
const translate = (error) => {
|
|
221
|
+
if (timedOut && !signal?.aborted) {
|
|
222
|
+
return new ProviderTimeoutError(url, timeoutMs);
|
|
223
|
+
}
|
|
224
|
+
if (signal?.aborted || isProviderRequestCancelled(error)) {
|
|
225
|
+
return createCancelError(signal?.reason);
|
|
226
|
+
}
|
|
227
|
+
if (error instanceof ProviderResponseTooLargeError)
|
|
228
|
+
return error;
|
|
229
|
+
return new ProviderNetworkError(url, error);
|
|
230
|
+
};
|
|
231
|
+
let response;
|
|
232
|
+
try {
|
|
233
|
+
response = await globalThis.fetch(url, {
|
|
234
|
+
method,
|
|
235
|
+
headers,
|
|
236
|
+
body,
|
|
237
|
+
signal: combined,
|
|
238
|
+
redirect,
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
catch (error) {
|
|
242
|
+
disarmTimer();
|
|
243
|
+
throw translate(error);
|
|
244
|
+
}
|
|
245
|
+
armTimer();
|
|
246
|
+
const meta = {
|
|
247
|
+
status: response.status,
|
|
248
|
+
statusText: response.statusText,
|
|
249
|
+
headers: headersToRecord(response.headers),
|
|
250
|
+
};
|
|
251
|
+
if (!response.ok) {
|
|
252
|
+
try {
|
|
253
|
+
const data = await decodeErrorBody(response, url, responseType);
|
|
254
|
+
throw new ProviderHttpError(url, { ...meta, data });
|
|
255
|
+
}
|
|
256
|
+
finally {
|
|
257
|
+
disarmTimer();
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
try {
|
|
261
|
+
if (responseType === 'stream') {
|
|
262
|
+
disarmTimer();
|
|
263
|
+
return {
|
|
264
|
+
...meta,
|
|
265
|
+
data: watchedStream(response.body, url, timeoutMs),
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
const bytes = await readBodyBounded(response, url, maxResponseBytes, armTimer);
|
|
269
|
+
if (responseType === 'bytes')
|
|
270
|
+
return { ...meta, data: bytes };
|
|
271
|
+
if (responseType === 'text') {
|
|
272
|
+
return { ...meta, data: bytes.toString('utf8') };
|
|
273
|
+
}
|
|
274
|
+
return {
|
|
275
|
+
...meta,
|
|
276
|
+
data: decodeText(bytes, meta.headers['content-type'] || ''),
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
catch (error) {
|
|
280
|
+
throw translate(error);
|
|
281
|
+
}
|
|
282
|
+
finally {
|
|
283
|
+
disarmTimer();
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Turn a response body into a Node Readable that fails with a
|
|
288
|
+
* ProviderTimeoutError when the peer goes quiet for `timeoutMs`. The idle
|
|
289
|
+
* check rides on a TransformStream so the Readable's own mode (events or
|
|
290
|
+
* async iteration) is left to the consumer.
|
|
291
|
+
*/
|
|
292
|
+
const watchedStream = (body, url, timeoutMs) => {
|
|
293
|
+
if (!body)
|
|
294
|
+
return Readable.from([]);
|
|
295
|
+
if (!(timeoutMs > 0)) {
|
|
296
|
+
return Readable.fromWeb(body);
|
|
297
|
+
}
|
|
298
|
+
const idle = new AbortController();
|
|
299
|
+
let idleTimer;
|
|
300
|
+
const armIdle = () => {
|
|
301
|
+
clearTimeout(idleTimer);
|
|
302
|
+
idleTimer = setTimeout(() => idle.abort(new ProviderTimeoutError(url, timeoutMs)), timeoutMs);
|
|
303
|
+
};
|
|
304
|
+
const watched = body.pipeThrough(new TransformStream({
|
|
305
|
+
start: armIdle,
|
|
306
|
+
transform(chunk, controller) {
|
|
307
|
+
armIdle();
|
|
308
|
+
controller.enqueue(chunk);
|
|
309
|
+
},
|
|
310
|
+
flush: () => clearTimeout(idleTimer),
|
|
311
|
+
}), { signal: idle.signal });
|
|
312
|
+
const stream = Readable.fromWeb(watched);
|
|
313
|
+
stream.once('close', () => clearTimeout(idleTimer));
|
|
314
|
+
return stream;
|
|
315
|
+
};
|
|
316
|
+
//# sourceMappingURL=providerFetch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"providerFetch.js","sourceRoot":"","sources":["../../src/utils/providerFetch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { Transform, type TransformCallback } from 'node:stream';
|
|
2
|
+
/**
|
|
3
|
+
* Rewrites reserved WebSocket close codes in a server-to-client frame stream.
|
|
4
|
+
*
|
|
5
|
+
* websockify closes a viewer with a code that RFC 6455 reserves for local
|
|
6
|
+
* use (1005, 1006, 1015) when its VNC target disappears. A browser rejects
|
|
7
|
+
* such a frame as "a broken close frame containing a reserved status code"
|
|
8
|
+
* and reports a failed connection instead of a close. The screen relay pipes
|
|
9
|
+
* websockify's bytes through untouched, so this Transform walks the frame
|
|
10
|
+
* boundaries and replaces a reserved code with 1011 (internal error), the
|
|
11
|
+
* closest code a server is allowed to send. Everything else passes through
|
|
12
|
+
* byte for byte. Server frames are never masked, so the code can be edited
|
|
13
|
+
* in place.
|
|
14
|
+
*/
|
|
15
|
+
export declare const REPLACEMENT_CLOSE_CODE = 1011;
|
|
16
|
+
export declare const isReservedCloseCode: (code: number) => boolean;
|
|
17
|
+
export declare class WebSocketCloseCodeSanitizer extends Transform {
|
|
18
|
+
/** Header bytes of the frame being parsed, until its length is known. */
|
|
19
|
+
private pendingHeader;
|
|
20
|
+
/** Payload bytes still to pass through for the current frame. */
|
|
21
|
+
private remainingPayload;
|
|
22
|
+
/** True while the current close frame's two code bytes are outstanding. */
|
|
23
|
+
private closeCodePending;
|
|
24
|
+
private closeCodeBytes;
|
|
25
|
+
_transform(chunk: Buffer, _encoding: BufferEncoding, callback: TransformCallback): void;
|
|
26
|
+
_flush(callback: TransformCallback): void;
|
|
27
|
+
/** Pass payload bytes through, editing a close code once it is complete. */
|
|
28
|
+
private forwardPayload;
|
|
29
|
+
}
|
|
30
|
+
export declare const createCloseCodeSanitizer: () => WebSocketCloseCodeSanitizer;
|
|
31
|
+
//# sourceMappingURL=websocketCloseCodes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"websocketCloseCodes.d.ts","sourceRoot":"","sources":["../../src/utils/websocketCloseCodes.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,SAAS,EAAE,KAAK,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhE;;;;;;;;;;;;GAYG;AAEH,eAAO,MAAM,sBAAsB,OAAO,CAAC;AAE3C,eAAO,MAAM,mBAAmB,SAAU,MAAM,KAAG,OAMnB,CAAC;AA8BjC,qBAAa,2BAA4B,SAAQ,SAAS;IACxD,yEAAyE;IACzE,OAAO,CAAC,aAAa,CAAmB;IACxC,iEAAiE;IACjE,OAAO,CAAC,gBAAgB,CAAK;IAC7B,2EAA2E;IAC3E,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,cAAc,CAAmB;IAEzC,UAAU,CACR,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,cAAc,EACzB,QAAQ,EAAE,iBAAiB,GAC1B,IAAI,CAwBN;IAED,MAAM,CAAC,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAIxC;IAED,4EAA4E;IAC5E,OAAO,CAAC,cAAc;CAsBvB;AAED,eAAO,MAAM,wBAAwB,QAAO,2BACT,CAAC"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Libre WebUI
|
|
3
|
+
* Copyright (C) 2025 Kroonen AI, Inc.
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at:
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/
|
|
17
|
+
import { Transform } from 'node:stream';
|
|
18
|
+
/**
|
|
19
|
+
* Rewrites reserved WebSocket close codes in a server-to-client frame stream.
|
|
20
|
+
*
|
|
21
|
+
* websockify closes a viewer with a code that RFC 6455 reserves for local
|
|
22
|
+
* use (1005, 1006, 1015) when its VNC target disappears. A browser rejects
|
|
23
|
+
* such a frame as "a broken close frame containing a reserved status code"
|
|
24
|
+
* and reports a failed connection instead of a close. The screen relay pipes
|
|
25
|
+
* websockify's bytes through untouched, so this Transform walks the frame
|
|
26
|
+
* boundaries and replaces a reserved code with 1011 (internal error), the
|
|
27
|
+
* closest code a server is allowed to send. Everything else passes through
|
|
28
|
+
* byte for byte. Server frames are never masked, so the code can be edited
|
|
29
|
+
* in place.
|
|
30
|
+
*/
|
|
31
|
+
export const REPLACEMENT_CLOSE_CODE = 1011;
|
|
32
|
+
export const isReservedCloseCode = (code) => code < 1000 ||
|
|
33
|
+
code === 1004 ||
|
|
34
|
+
code === 1005 ||
|
|
35
|
+
code === 1006 ||
|
|
36
|
+
code === 1015 ||
|
|
37
|
+
(code >= 1016 && code <= 2999);
|
|
38
|
+
const CLOSE_OPCODE = 0x8;
|
|
39
|
+
const parseHeader = (buffer) => {
|
|
40
|
+
if (buffer.length < 2)
|
|
41
|
+
return null;
|
|
42
|
+
const opcode = buffer[0] & 0x0f;
|
|
43
|
+
const masked = (buffer[1] & 0x80) !== 0;
|
|
44
|
+
let payloadLength = buffer[1] & 0x7f;
|
|
45
|
+
let headerLength = 2;
|
|
46
|
+
if (payloadLength === 126) {
|
|
47
|
+
if (buffer.length < 4)
|
|
48
|
+
return null;
|
|
49
|
+
payloadLength = buffer.readUInt16BE(2);
|
|
50
|
+
headerLength = 4;
|
|
51
|
+
}
|
|
52
|
+
else if (payloadLength === 127) {
|
|
53
|
+
if (buffer.length < 10)
|
|
54
|
+
return null;
|
|
55
|
+
payloadLength = Number(buffer.readBigUInt64BE(2));
|
|
56
|
+
headerLength = 10;
|
|
57
|
+
}
|
|
58
|
+
if (masked)
|
|
59
|
+
headerLength += 4;
|
|
60
|
+
if (buffer.length < headerLength)
|
|
61
|
+
return null;
|
|
62
|
+
return { headerLength, payloadLength, opcode };
|
|
63
|
+
};
|
|
64
|
+
export class WebSocketCloseCodeSanitizer extends Transform {
|
|
65
|
+
constructor() {
|
|
66
|
+
super(...arguments);
|
|
67
|
+
/** Header bytes of the frame being parsed, until its length is known. */
|
|
68
|
+
this.pendingHeader = Buffer.alloc(0);
|
|
69
|
+
/** Payload bytes still to pass through for the current frame. */
|
|
70
|
+
this.remainingPayload = 0;
|
|
71
|
+
/** True while the current close frame's two code bytes are outstanding. */
|
|
72
|
+
this.closeCodePending = false;
|
|
73
|
+
this.closeCodeBytes = Buffer.alloc(0);
|
|
74
|
+
}
|
|
75
|
+
_transform(chunk, _encoding, callback) {
|
|
76
|
+
let data = chunk;
|
|
77
|
+
let offset = 0;
|
|
78
|
+
while (offset < data.length) {
|
|
79
|
+
if (this.remainingPayload > 0) {
|
|
80
|
+
offset = this.forwardPayload(data, offset);
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
this.pendingHeader = Buffer.concat([
|
|
84
|
+
this.pendingHeader,
|
|
85
|
+
data.subarray(offset),
|
|
86
|
+
]);
|
|
87
|
+
const header = parseHeader(this.pendingHeader);
|
|
88
|
+
if (!header)
|
|
89
|
+
break; // Wait for more header bytes.
|
|
90
|
+
this.push(this.pendingHeader.subarray(0, header.headerLength));
|
|
91
|
+
data = this.pendingHeader.subarray(header.headerLength);
|
|
92
|
+
offset = 0;
|
|
93
|
+
this.pendingHeader = Buffer.alloc(0);
|
|
94
|
+
this.remainingPayload = header.payloadLength;
|
|
95
|
+
this.closeCodePending =
|
|
96
|
+
header.opcode === CLOSE_OPCODE && header.payloadLength >= 2;
|
|
97
|
+
this.closeCodeBytes = Buffer.alloc(0);
|
|
98
|
+
}
|
|
99
|
+
callback();
|
|
100
|
+
}
|
|
101
|
+
_flush(callback) {
|
|
102
|
+
if (this.pendingHeader.length > 0)
|
|
103
|
+
this.push(this.pendingHeader);
|
|
104
|
+
if (this.closeCodeBytes.length > 0)
|
|
105
|
+
this.push(this.closeCodeBytes);
|
|
106
|
+
callback();
|
|
107
|
+
}
|
|
108
|
+
/** Pass payload bytes through, editing a close code once it is complete. */
|
|
109
|
+
forwardPayload(chunk, offset) {
|
|
110
|
+
const take = Math.min(this.remainingPayload, chunk.length - offset);
|
|
111
|
+
let slice = chunk.subarray(offset, offset + take);
|
|
112
|
+
if (this.closeCodePending) {
|
|
113
|
+
const needed = 2 - this.closeCodeBytes.length;
|
|
114
|
+
const codePart = slice.subarray(0, needed);
|
|
115
|
+
this.closeCodeBytes = Buffer.concat([this.closeCodeBytes, codePart]);
|
|
116
|
+
slice = slice.subarray(codePart.length);
|
|
117
|
+
if (this.closeCodeBytes.length === 2) {
|
|
118
|
+
const bytes = Buffer.from(this.closeCodeBytes);
|
|
119
|
+
if (isReservedCloseCode(bytes.readUInt16BE(0))) {
|
|
120
|
+
bytes.writeUInt16BE(REPLACEMENT_CLOSE_CODE, 0);
|
|
121
|
+
}
|
|
122
|
+
this.push(bytes);
|
|
123
|
+
this.closeCodePending = false;
|
|
124
|
+
this.closeCodeBytes = Buffer.alloc(0);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
if (slice.length > 0)
|
|
128
|
+
this.push(slice);
|
|
129
|
+
this.remainingPayload -= take;
|
|
130
|
+
return offset + take;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
export const createCloseCodeSanitizer = () => new WebSocketCloseCodeSanitizer();
|
|
134
|
+
//# sourceMappingURL=websocketCloseCodes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"websocketCloseCodes.js","sourceRoot":"","sources":["../../src/utils/websocketCloseCodes.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workScreenServer.d.ts","sourceRoot":"","sources":["../src/workScreenServer.ts"],"names":[],"mappings":"AAkCA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,MAAM,CAAC;AAC5C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"workScreenServer.d.ts","sourceRoot":"","sources":["../src/workScreenServer.ts"],"names":[],"mappings":"AAkCA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,MAAM,CAAC;AAC5C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAerC,eAAO,MAAM,mBAAmB,oBAAoB,CAAC;AACrD,eAAO,MAAM,kBAAkB,mBAAmB,CAAC;AACnD,+EAA+E;AAC/E,eAAO,MAAM,gCAAgC,IAAI,CAAC;AAiFlD;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,eAAe,EACxB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,GACX,OAAO,CAoBT"}
|
|
@@ -36,6 +36,7 @@ import workRuntimeService from './services/workRuntimeService.js';
|
|
|
36
36
|
import workPolicyService from './services/workPolicyService.js';
|
|
37
37
|
import { WorkRuntimeError } from './services/workRuntimeShared.js';
|
|
38
38
|
import { createLogger } from './utils/logger.js';
|
|
39
|
+
import { createCloseCodeSanitizer } from './utils/websocketCloseCodes.js';
|
|
39
40
|
const logger = createLogger('work-screen');
|
|
40
41
|
export const WORK_SCREEN_WS_PATH = '/ws/work-screen';
|
|
41
42
|
export const WORK_AUDIO_WS_PATH = '/ws/work-audio';
|
|
@@ -260,8 +261,12 @@ async function handleScreenUpgrade(request, socket, head, surface) {
|
|
|
260
261
|
: undefined;
|
|
261
262
|
expiryTimer?.unref();
|
|
262
263
|
socket.write(`HTTP/1.1 101 Switching Protocols\r\n${safeLines.join('\r\n')}\r\n\r\n`);
|
|
264
|
+
// Everything websockify sends after the handshake crosses the sanitizer,
|
|
265
|
+
// which rewrites a reserved close code into one a browser accepts.
|
|
266
|
+
const upstreamFrames = createCloseCodeSanitizer();
|
|
267
|
+
upstreamFrames.pipe(socket);
|
|
263
268
|
if (remainder.length > 0)
|
|
264
|
-
|
|
269
|
+
upstreamFrames.write(remainder);
|
|
265
270
|
if (head.length > 0)
|
|
266
271
|
upstreamSocket.write(head);
|
|
267
272
|
const cleanup = () => {
|
|
@@ -283,7 +288,7 @@ async function handleScreenUpgrade(request, socket, head, surface) {
|
|
|
283
288
|
upstreamSocket.destroy();
|
|
284
289
|
cleanup();
|
|
285
290
|
});
|
|
286
|
-
upstreamSocket.pipe(
|
|
291
|
+
upstreamSocket.pipe(upstreamFrames);
|
|
287
292
|
socket.pipe(upstreamSocket);
|
|
288
293
|
};
|
|
289
294
|
upstreamSocket.on('data', onHandshakeData);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workScreenServer.js","sourceRoot":"","sources":["../src/workScreenServer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH;;;;;;;;;;;;;GAaG;AAEH,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,GAAG,MAAM,KAAK,CAAC;AAGtB,OAAO,EACL,sBAAsB,EACtB,gCAAgC,GACjC,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,kBAAkB,MAAM,kCAAkC,CAAC;AAClE,OAAO,iBAAiB,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAEnE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"workScreenServer.js","sourceRoot":"","sources":["../src/workScreenServer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH;;;;;;;;;;;;;GAaG;AAEH,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,GAAG,MAAM,KAAK,CAAC;AAGtB,OAAO,EACL,sBAAsB,EACtB,gCAAgC,GACjC,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,kBAAkB,MAAM,kCAAkC,CAAC;AAClE,OAAO,iBAAiB,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAEnE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;AAE1E,MAAM,MAAM,GAAG,YAAY,CAAC,aAAa,CAAC,CAAC;AAE3C,MAAM,CAAC,MAAM,mBAAmB,GAAG,iBAAiB,CAAC;AACrD,MAAM,CAAC,MAAM,kBAAkB,GAAG,gBAAgB,CAAC;AACnD,+EAA+E;AAC/E,MAAM,CAAC,MAAM,gCAAgC,GAAG,CAAC,CAAC;AAGlD,2EAA2E;AAC3E,MAAM,gBAAgB,GAAG,KAAM,CAAC;AAEhC,yEAAyE;AACzE,MAAM,qBAAqB,GAAG,IAAI,GAAG,CAAC;IACpC,SAAS;IACT,YAAY;IACZ,sBAAsB;IACtB,wBAAwB;IACxB,0BAA0B;CAC3B,CAAC,CAAC;AAEH,MAAM,aAAa,GAAG,IAAI,GAAG,EAAkB,CAAC;AAEhD,MAAM,SAAS,GAAG,CAAC,MAAc,EAAE,MAAc,EAAE,OAAe,EAAQ,EAAE;IAC1E,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;QACtB,MAAM,CAAC,GAAG,CACR,YAAY,MAAM,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,OAAO,MAAM;YAC9D,wDAAwD,OAAO,EAAE,CACpE,CAAC;IACJ,CAAC;AACH,CAAC,CAAC;AAQF,KAAK,UAAU,sBAAsB,CACnC,GAAoB;IAEpB,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,EAAE,kBAAkB,CAAC,CAAC;IACvD,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;IACpD,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;IACpD,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QACvB,MAAM,IAAI,gBAAgB,CACxB,mDAAmD,EACnD,GAAG,EACH,0BAA0B,CAC3B,CAAC;IACJ,CAAC;IACD,IAAI,QAAQ,CAAC;IACb,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,sBAAsB,CAAC,OAAO,CAC7C,MAAM,EACN,aAAa,EACb,MAAM,CACP,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,gCAAgC,EAAE,CAAC;YACtD,MAAM,IAAI,gBAAgB,CACxB,0DAA0D,EAC1D,GAAG,EACH,8BAA8B,CAC/B,CAAC;QACJ,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;IACD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,gBAAgB,CACxB,2CAA2C,EAC3C,GAAG,EACH,0BAA0B,CAC3B,CAAC;IACJ,CAAC;IACD,qEAAqE;IACrE,2EAA2E;IAC3E,MAAM,IAAI,GAAG,MAAM,0BAA0B,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvE,OAAO;QACL,IAAI;QACJ,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,GAAG,CAAC,QAAQ,CAAC,gBAAgB;YAC3B,CAAC,CAAC,EAAE,gBAAgB,EAAE,QAAQ,CAAC,gBAAgB,EAAE;YACjD,CAAC,CAAC,EAAE,CAAC;KACR,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CACpC,OAAwB,EACxB,MAAc,EACd,IAAY;IAEZ,IAAI,QAAgB,CAAC;IACrB,IAAI,CAAC;QACH,QAAQ,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,IAAI,EAAE,EAAE,kBAAkB,CAAC,CAAC,QAAQ,CAAC;IACrE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,OAAO,GACX,QAAQ,KAAK,mBAAmB;QAC9B,CAAC,CAAC,QAAQ;QACV,CAAC,CAAC,QAAQ,KAAK,kBAAkB;YAC/B,CAAC,CAAC,OAAO;YACT,CAAC,CAAC,SAAS,CAAC;IAClB,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAC3B,MAAM,CAAC,KAAK,EAAE,CAAC;IACf,KAAK,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;QACrE,MAAM,CAAC,IAAI,CAAC,QAAQ,OAAO,kBAAkB,EAAE,KAAK,CAAC,CAAC;QACtD,IAAI,CAAC,MAAM,CAAC,SAAS;YAAE,MAAM,CAAC,OAAO,EAAE,CAAC;IAC1C,CAAC,CAAC,CAAC;IACH,OAAO,IAAI,CAAC;AACd,CAAC;AAED,KAAK,UAAU,mBAAmB,CAChC,OAAwB,EACxB,MAAc,EACd,IAAY,EACZ,OAAsB;IAEtB,IAAI,IAAsB,CAAC;IAC3B,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,sBAAsB,CAAC,OAAO,CAAC,CAAC;IAC/C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,MAAM,GAAG,KAAK,YAAY,gBAAgB,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC;QACtE,MAAM,OAAO,GACX,KAAK,YAAY,gBAAgB;YAC/B,CAAC,CAAC,KAAK,CAAC,OAAO;YACf,CAAC,CAAC,8BAA8B,CAAC;QACrC,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QACnC,OAAO;IACT,CAAC;IACD,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;IAEtB,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC9D,IAAI,MAAM,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;QAC/B,SAAS,CAAC,MAAM,EAAE,GAAG,EAAE,iCAAiC,CAAC,CAAC;QAC1D,OAAO;IACT,CAAC;IACD,MAAM,SAAS,GAAG,GAAG,OAAO,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;IAC1C,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,gCAAgC,EAAE,CAAC;QAC5E,SAAS,CAAC,MAAM,EAAE,GAAG,EAAE,kCAAkC,CAAC,CAAC;QAC3D,OAAO;IACT,CAAC;IAED,IAAI,QAAQ,CAAC;IACb,IAAI,CAAC;QACH,QAAQ;YACN,OAAO,KAAK,OAAO;gBACjB,CAAC,CAAC,MAAM,kBAAkB,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC;gBACrD,CAAC,CAAC,MAAM,kBAAkB,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IAC7D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,IAAI,CACT,QAAQ,OAAO,+BAA+B,IAAI,CAAC,EAAE,GAAG,EACxD,KAAK,CACN,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,SAAS,CAAC,MAAM,EAAE,GAAG,EAAE,0CAA0C,CAAC,CAAC;QACnE,OAAO;IACT,CAAC;IACD,MAAM,CAAC,MAAM,EAAE,CAAC;IAEhB,qEAAqE;IACrE,yEAAyE;IACzE,sEAAsE;IACtE,yEAAyE;IACzE,wBAAwB;IACxB,MAAM,WAAW,GAAG;QAClB,gBAAgB;QAChB,SAAS,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,EAAE;QACzC,qBAAqB;QACrB,YAAY,OAAO,CAAC,OAAO,CAAC,OAAO,IAAI,WAAW,EAAE;KACrD,CAAC;IACF,KAAK,MAAM,IAAI,IAAI;QACjB,mBAAmB;QACnB,uBAAuB;QACvB,wBAAwB;QACxB,0BAA0B;KAC3B,EAAE,CAAC;QACF,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,WAAW,CAAC,IAAI,CAAC,GAAG,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE;QAC3B,MAAM,CAAC,KAAK,CAAC,4CAA4C,EAAE,KAAK,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,MAAM,cAAc,GAAG,GAAG,CAAC,OAAO,CAAC;QACjC,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,IAAI,EAAE,QAAQ,CAAC,IAAI;KACpB,CAAC,CAAC;IACH,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,cAAc,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACrC,IAAI,WAAW,GAAG,KAAK,CAAC;IAExB,MAAM,YAAY,GAAG,CAAC,OAAe,EAAQ,EAAE;QAC7C,MAAM,CAAC,IAAI,CAAC,6BAA6B,OAAO,EAAE,CAAC,CAAC;QACpD,IAAI,CAAC,WAAW;YAAE,SAAS,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;QAClD,cAAc,CAAC,OAAO,EAAE,CAAC;QACzB,IAAI,WAAW;YAAE,MAAM,CAAC,OAAO,EAAE,CAAC;IACpC,CAAC,CAAC;IACF,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE;QACnC,MAAM,CAAC,KAAK,CAAC,8CAA8C,EAAE,KAAK,CAAC,CAAC;QACpE,YAAY,CAAC,0CAA0C,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IACH,cAAc,CAAC,UAAU,CAAC,KAAM,EAAE,GAAG,EAAE;QACrC,IAAI,CAAC,WAAW;YAAE,YAAY,CAAC,qCAAqC,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IACH,cAAc,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE;QAClC,cAAc,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,MAAM,eAAe,GAAG,CAAC,KAAa,EAAQ,EAAE;QAC9C,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC,CAAC;QACxD,MAAM,SAAS,GAAG,cAAc,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACrD,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;YAClB,IAAI,cAAc,CAAC,MAAM,GAAG,KAAM,EAAE,CAAC;gBACnC,YAAY,CAAC,qDAAqD,CAAC,CAAC;YACtE,CAAC;YACD,OAAO;QACT,CAAC;QACD,cAAc,CAAC,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;QAC5C,MAAM,WAAW,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,QAAQ,EAAE,CAAC;QACrE,MAAM,SAAS,GAAG,cAAc,CAAC,QAAQ,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;QACzD,cAAc,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,CAAC,UAAU,GAAG,EAAE,EAAE,GAAG,mBAAmB,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC5E,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;YACzC,YAAY,CAAC,wBAAwB,CAAC,CAAC;YACvC,OAAO;QACT,CAAC;QACD,MAAM,SAAS,GAAG,mBAAmB,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;YAClD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YACnE,OAAO,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;QACH,WAAW,GAAG,IAAI,CAAC;QACnB,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAC7B,mEAAmE;QACnE,sEAAsE;QACtE,+BAA+B;QAC9B,MAAgD,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC;QACjE,MAAiD,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,CAAC;QAEtE,aAAa,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACtE,kBAAkB,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC7C,uEAAuE;QACvE,uEAAuE;QACvE,sDAAsD;QACtD,IAAI,oBAAuD,CAAC;QAC5D,KAAK,kBAAkB;aACpB,kBAAkB,CAAC,IAAI,CAAC;aACxB,IAAI,CAAC,OAAO,CAAC,EAAE;YACd,oBAAoB,GAAG,OAAO,CAAC;YAC/B,IAAI,MAAM,CAAC,SAAS;gBAAE,KAAK,OAAO,EAAE,CAAC;QACvC,CAAC,CAAC;aACD,KAAK,CAAC,KAAK,CAAC,EAAE;YACb,MAAM,CAAC,IAAI,CACT,6DAA6D,IAAI,CAAC,EAAE,GAAG,EACvE,KAAK,CACN,CAAC;QACJ,CAAC,CAAC,CAAC;QACL,MAAM,aAAa,GAAG,WAAW,CAAC,GAAG,EAAE;YACrC,kBAAkB,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC/C,CAAC,EAAE,gBAAgB,CAAC,CAAC;QACrB,aAAa,CAAC,KAAK,EAAE,CAAC;QACtB,uEAAuE;QACvE,MAAM,WAAW,GAAG,IAAI,CAAC,gBAAgB;YACvC,CAAC,CAAC,UAAU,CACR,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,EACtB,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAChD;YACH,CAAC,CAAC,SAAS,CAAC;QACd,WAAW,EAAE,KAAK,EAAE,CAAC;QAErB,MAAM,CAAC,KAAK,CACV,uCAAuC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CACxE,CAAC;QACF,yEAAyE;QACzE,mEAAmE;QACnE,MAAM,cAAc,GAAG,wBAAwB,EAAE,CAAC;QAClD,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC5B,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC;YAAE,cAAc,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC1D,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;YAAE,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAEhD,MAAM,OAAO,GAAG,GAAS,EAAE;YACzB,aAAa,CAAC,aAAa,CAAC,CAAC;YAC7B,IAAI,WAAW;gBAAE,YAAY,CAAC,WAAW,CAAC,CAAC;YAC3C,MAAM,SAAS,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YAC1D,IAAI,SAAS,IAAI,CAAC;gBAAE,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;;gBAC/C,aAAa,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;YAC7C,kBAAkB,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC7C,KAAK,oBAAoB,EAAE,EAAE,CAAC;QAChC,CAAC,CAAC;QACF,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE;YAChC,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE;YACxB,cAAc,CAAC,OAAO,EAAE,CAAC;YACzB,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC,CAAC;QACH,cAAc,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACpC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC9B,CAAC,CAAC;IACF,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;AAC7C,CAAC"}
|
package/backend/package.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "libre-webui-backend",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.34.0",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"description": "Backend API for Libre WebUI",
|
|
7
7
|
"main": "dist/main.js",
|
|
8
8
|
"scripts": {
|
|
9
|
-
"dev": "
|
|
9
|
+
"dev": "node --watch --import tsx src/main.ts",
|
|
10
10
|
"build": "node -e \"require('fs').rmSync('dist', { recursive: true, force: true })\" && tsc",
|
|
11
11
|
"start": "node dist/main.js",
|
|
12
12
|
"type-check": "tsc --noEmit",
|
|
@@ -24,20 +24,13 @@
|
|
|
24
24
|
"@aws-sdk/client-s3": "^3.1109.0",
|
|
25
25
|
"@aws-sdk/lib-storage": "^3.1109.0",
|
|
26
26
|
"@kubernetes/client-node": "^2.0.0",
|
|
27
|
-
"
|
|
28
|
-
"@types/multer": "^2.2.0",
|
|
29
|
-
"@types/pdf-parse": "^1.1.5",
|
|
30
|
-
"axios": "^1.13.2",
|
|
31
|
-
"bcrypt": "^6.0.0",
|
|
27
|
+
"bcryptjs": "^3.0.3",
|
|
32
28
|
"better-sqlite3": "^13.0.2",
|
|
33
|
-
"cors": "^2.8.5",
|
|
34
|
-
"dotenv": "^17.2.3",
|
|
35
29
|
"express": "^5.2.1",
|
|
36
30
|
"express-rate-limit": "^8.2.1",
|
|
37
31
|
"helmet": "^8.1.0",
|
|
38
32
|
"ipaddr.js": "^2.4.0",
|
|
39
33
|
"jsonwebtoken": "^9.0.3",
|
|
40
|
-
"morgan": "^1.10.0",
|
|
41
34
|
"multer": "^2.0.1",
|
|
42
35
|
"parse5": "^8.0.1",
|
|
43
36
|
"pdfjs-dist": "^6.0.227",
|
|
@@ -45,16 +38,14 @@
|
|
|
45
38
|
"redis": "^6.2.1",
|
|
46
39
|
"sanitize-filename": "^1.6.3",
|
|
47
40
|
"undici": "^8.10.0",
|
|
48
|
-
"uuid": "^14.0.0",
|
|
49
41
|
"ws": "^8.14.2"
|
|
50
42
|
},
|
|
51
43
|
"devDependencies": {
|
|
52
44
|
"@eslint/js": "^9.39.4",
|
|
53
|
-
"@types/bcrypt": "^6.0.0",
|
|
54
45
|
"@types/better-sqlite3": "^9.6.0",
|
|
55
|
-
"@types/cors": "^2.8.19",
|
|
56
46
|
"@types/express": "^5.0.6",
|
|
57
|
-
"@types/
|
|
47
|
+
"@types/jsonwebtoken": "^9.0.10",
|
|
48
|
+
"@types/multer": "^2.2.0",
|
|
58
49
|
"@types/node": "^26.4.0",
|
|
59
50
|
"@types/pg": "^8.23.1",
|
|
60
51
|
"@types/ws": "^8.5.10",
|