@lakphy/local-router 0.4.0 → 0.4.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/README.md +4 -1
- package/config.schema.json +33 -1
- package/dist/cli.js +8922 -8663
- package/dist/entry.js +488 -331
- package/dist/web/assets/index-Btoi8_O4.js +191 -0
- package/dist/web/assets/index-CgmYi3c6.css +2 -0
- package/dist/web/index.html +2 -2
- package/package.json +1 -1
- package/src/plugin.ts +10 -7
- package/dist/web/assets/index-BuPqjQdS.css +0 -2
- package/dist/web/assets/index-DVUjoZy3.js +0 -191
package/dist/entry.js
CHANGED
|
@@ -4934,7 +4934,7 @@ var require_compile = __commonJS((exports) => {
|
|
|
4934
4934
|
const schOrFunc = root2.refs[ref];
|
|
4935
4935
|
if (schOrFunc)
|
|
4936
4936
|
return schOrFunc;
|
|
4937
|
-
let _sch =
|
|
4937
|
+
let _sch = resolve4.call(this, root2, ref);
|
|
4938
4938
|
if (_sch === undefined) {
|
|
4939
4939
|
const schema = (_a21 = root2.localRefs) === null || _a21 === undefined ? undefined : _a21[ref];
|
|
4940
4940
|
const { schemaId } = this.opts;
|
|
@@ -4961,7 +4961,7 @@ var require_compile = __commonJS((exports) => {
|
|
|
4961
4961
|
function sameSchemaEnv(s1, s2) {
|
|
4962
4962
|
return s1.schema === s2.schema && s1.root === s2.root && s1.baseId === s2.baseId;
|
|
4963
4963
|
}
|
|
4964
|
-
function
|
|
4964
|
+
function resolve4(root2, ref) {
|
|
4965
4965
|
let sch;
|
|
4966
4966
|
while (typeof (sch = this.refs[ref]) == "string")
|
|
4967
4967
|
ref = sch;
|
|
@@ -5491,7 +5491,7 @@ var require_fast_uri = __commonJS((exports, module) => {
|
|
|
5491
5491
|
}
|
|
5492
5492
|
return uri;
|
|
5493
5493
|
}
|
|
5494
|
-
function
|
|
5494
|
+
function resolve4(baseURI, relativeURI, options) {
|
|
5495
5495
|
const schemelessOptions = options ? Object.assign({ scheme: "null" }, options) : { scheme: "null" };
|
|
5496
5496
|
const resolved = resolveComponent(parse7(baseURI, schemelessOptions), parse7(relativeURI, schemelessOptions), schemelessOptions, true);
|
|
5497
5497
|
schemelessOptions.skipEscape = true;
|
|
@@ -5719,7 +5719,7 @@ var require_fast_uri = __commonJS((exports, module) => {
|
|
|
5719
5719
|
var fastUri = {
|
|
5720
5720
|
SCHEMES,
|
|
5721
5721
|
normalize,
|
|
5722
|
-
resolve:
|
|
5722
|
+
resolve: resolve4,
|
|
5723
5723
|
resolveComponent,
|
|
5724
5724
|
equal,
|
|
5725
5725
|
serialize,
|
|
@@ -5856,7 +5856,7 @@ var require_core = __commonJS((exports) => {
|
|
|
5856
5856
|
opts = this.opts = { ...opts, ...requiredOptions(opts) };
|
|
5857
5857
|
const { es5, lines } = this.opts.code;
|
|
5858
5858
|
this.scope = new codegen_2.ValueScope({ scope: {}, prefixes: EXT_SCOPE_NAMES, es5, lines });
|
|
5859
|
-
this.logger =
|
|
5859
|
+
this.logger = getLogger(opts.logger);
|
|
5860
5860
|
const formatOpt = opts.validateFormats;
|
|
5861
5861
|
opts.validateFormats = false;
|
|
5862
5862
|
this.RULES = (0, rules_1.getRules)();
|
|
@@ -6253,7 +6253,7 @@ var require_core = __commonJS((exports) => {
|
|
|
6253
6253
|
return metaOpts;
|
|
6254
6254
|
}
|
|
6255
6255
|
var noLogs = { log() {}, warn() {}, error() {} };
|
|
6256
|
-
function
|
|
6256
|
+
function getLogger(logger) {
|
|
6257
6257
|
if (logger === false)
|
|
6258
6258
|
return noLogs;
|
|
6259
6259
|
if (logger === undefined)
|
|
@@ -40602,6 +40602,267 @@ function createOpenAICompatible(options) {
|
|
|
40602
40602
|
provider.imageModel = createImageModel;
|
|
40603
40603
|
return provider;
|
|
40604
40604
|
}
|
|
40605
|
+
|
|
40606
|
+
// node_modules/.bun/hono@4.12.5/node_modules/hono/dist/utils/html.js
|
|
40607
|
+
var HtmlEscapedCallbackPhase = {
|
|
40608
|
+
Stringify: 1,
|
|
40609
|
+
BeforeStream: 2,
|
|
40610
|
+
Stream: 3
|
|
40611
|
+
};
|
|
40612
|
+
var raw = (value, callbacks) => {
|
|
40613
|
+
const escapedString = new String(value);
|
|
40614
|
+
escapedString.isEscaped = true;
|
|
40615
|
+
escapedString.callbacks = callbacks;
|
|
40616
|
+
return escapedString;
|
|
40617
|
+
};
|
|
40618
|
+
var escapeRe = /[&<>'"]/;
|
|
40619
|
+
var stringBufferToString = async (buffer, callbacks) => {
|
|
40620
|
+
let str = "";
|
|
40621
|
+
callbacks ||= [];
|
|
40622
|
+
const resolvedBuffer = await Promise.all(buffer);
|
|
40623
|
+
for (let i = resolvedBuffer.length - 1;; i--) {
|
|
40624
|
+
str += resolvedBuffer[i];
|
|
40625
|
+
i--;
|
|
40626
|
+
if (i < 0) {
|
|
40627
|
+
break;
|
|
40628
|
+
}
|
|
40629
|
+
let r = resolvedBuffer[i];
|
|
40630
|
+
if (typeof r === "object") {
|
|
40631
|
+
callbacks.push(...r.callbacks || []);
|
|
40632
|
+
}
|
|
40633
|
+
const isEscaped = r.isEscaped;
|
|
40634
|
+
r = await (typeof r === "object" ? r.toString() : r);
|
|
40635
|
+
if (typeof r === "object") {
|
|
40636
|
+
callbacks.push(...r.callbacks || []);
|
|
40637
|
+
}
|
|
40638
|
+
if (r.isEscaped ?? isEscaped) {
|
|
40639
|
+
str += r;
|
|
40640
|
+
} else {
|
|
40641
|
+
const buf = [str];
|
|
40642
|
+
escapeToBuffer(r, buf);
|
|
40643
|
+
str = buf[0];
|
|
40644
|
+
}
|
|
40645
|
+
}
|
|
40646
|
+
return raw(str, callbacks);
|
|
40647
|
+
};
|
|
40648
|
+
var escapeToBuffer = (str, buffer) => {
|
|
40649
|
+
const match = str.search(escapeRe);
|
|
40650
|
+
if (match === -1) {
|
|
40651
|
+
buffer[0] += str;
|
|
40652
|
+
return;
|
|
40653
|
+
}
|
|
40654
|
+
let escape2;
|
|
40655
|
+
let index;
|
|
40656
|
+
let lastIndex = 0;
|
|
40657
|
+
for (index = match;index < str.length; index++) {
|
|
40658
|
+
switch (str.charCodeAt(index)) {
|
|
40659
|
+
case 34:
|
|
40660
|
+
escape2 = """;
|
|
40661
|
+
break;
|
|
40662
|
+
case 39:
|
|
40663
|
+
escape2 = "'";
|
|
40664
|
+
break;
|
|
40665
|
+
case 38:
|
|
40666
|
+
escape2 = "&";
|
|
40667
|
+
break;
|
|
40668
|
+
case 60:
|
|
40669
|
+
escape2 = "<";
|
|
40670
|
+
break;
|
|
40671
|
+
case 62:
|
|
40672
|
+
escape2 = ">";
|
|
40673
|
+
break;
|
|
40674
|
+
default:
|
|
40675
|
+
continue;
|
|
40676
|
+
}
|
|
40677
|
+
buffer[0] += str.substring(lastIndex, index) + escape2;
|
|
40678
|
+
lastIndex = index + 1;
|
|
40679
|
+
}
|
|
40680
|
+
buffer[0] += str.substring(lastIndex, index);
|
|
40681
|
+
};
|
|
40682
|
+
var resolveCallbackSync = (str) => {
|
|
40683
|
+
const callbacks = str.callbacks;
|
|
40684
|
+
if (!callbacks?.length) {
|
|
40685
|
+
return str;
|
|
40686
|
+
}
|
|
40687
|
+
const buffer = [str];
|
|
40688
|
+
const context = {};
|
|
40689
|
+
callbacks.forEach((c) => c({ phase: HtmlEscapedCallbackPhase.Stringify, buffer, context }));
|
|
40690
|
+
return buffer[0];
|
|
40691
|
+
};
|
|
40692
|
+
var resolveCallback = async (str, phase, preserveCallbacks, context, buffer) => {
|
|
40693
|
+
if (typeof str === "object" && !(str instanceof String)) {
|
|
40694
|
+
if (!(str instanceof Promise)) {
|
|
40695
|
+
str = str.toString();
|
|
40696
|
+
}
|
|
40697
|
+
if (str instanceof Promise) {
|
|
40698
|
+
str = await str;
|
|
40699
|
+
}
|
|
40700
|
+
}
|
|
40701
|
+
const callbacks = str.callbacks;
|
|
40702
|
+
if (!callbacks?.length) {
|
|
40703
|
+
return Promise.resolve(str);
|
|
40704
|
+
}
|
|
40705
|
+
if (buffer) {
|
|
40706
|
+
buffer[0] += str;
|
|
40707
|
+
} else {
|
|
40708
|
+
buffer = [str];
|
|
40709
|
+
}
|
|
40710
|
+
const resStr = Promise.all(callbacks.map((c) => c({ phase, buffer, context }))).then((res) => Promise.all(res.filter(Boolean).map((str2) => resolveCallback(str2, phase, false, context, buffer))).then(() => buffer[0]));
|
|
40711
|
+
if (preserveCallbacks) {
|
|
40712
|
+
return raw(await resStr, callbacks);
|
|
40713
|
+
} else {
|
|
40714
|
+
return resStr;
|
|
40715
|
+
}
|
|
40716
|
+
};
|
|
40717
|
+
|
|
40718
|
+
// node_modules/.bun/hono@4.12.5/node_modules/hono/dist/helper/html/index.js
|
|
40719
|
+
var html = (strings, ...values) => {
|
|
40720
|
+
const buffer = [""];
|
|
40721
|
+
for (let i = 0, len = strings.length - 1;i < len; i++) {
|
|
40722
|
+
buffer[0] += strings[i];
|
|
40723
|
+
const children = Array.isArray(values[i]) ? values[i].flat(Infinity) : [values[i]];
|
|
40724
|
+
for (let i2 = 0, len2 = children.length;i2 < len2; i2++) {
|
|
40725
|
+
const child = children[i2];
|
|
40726
|
+
if (typeof child === "string") {
|
|
40727
|
+
escapeToBuffer(child, buffer);
|
|
40728
|
+
} else if (typeof child === "number") {
|
|
40729
|
+
buffer[0] += child;
|
|
40730
|
+
} else if (typeof child === "boolean" || child === null || child === undefined) {
|
|
40731
|
+
continue;
|
|
40732
|
+
} else if (typeof child === "object" && child.isEscaped) {
|
|
40733
|
+
if (child.callbacks) {
|
|
40734
|
+
buffer.unshift("", child);
|
|
40735
|
+
} else {
|
|
40736
|
+
const tmp = child.toString();
|
|
40737
|
+
if (tmp instanceof Promise) {
|
|
40738
|
+
buffer.unshift("", tmp);
|
|
40739
|
+
} else {
|
|
40740
|
+
buffer[0] += tmp;
|
|
40741
|
+
}
|
|
40742
|
+
}
|
|
40743
|
+
} else if (child instanceof Promise) {
|
|
40744
|
+
buffer.unshift("", child);
|
|
40745
|
+
} else {
|
|
40746
|
+
escapeToBuffer(child.toString(), buffer);
|
|
40747
|
+
}
|
|
40748
|
+
}
|
|
40749
|
+
}
|
|
40750
|
+
buffer[0] += strings.at(-1);
|
|
40751
|
+
return buffer.length === 1 ? "callbacks" in buffer ? raw(resolveCallbackSync(raw(buffer[0], buffer.callbacks))) : raw(buffer[0]) : stringBufferToString(buffer, buffer.callbacks);
|
|
40752
|
+
};
|
|
40753
|
+
|
|
40754
|
+
// node_modules/.bun/@hono+swagger-ui@0.5.3+bac6debbfb5ded19/node_modules/@hono/swagger-ui/dist/index.js
|
|
40755
|
+
var RENDER_TYPE = {
|
|
40756
|
+
STRING_ARRAY: "string_array",
|
|
40757
|
+
STRING: "string",
|
|
40758
|
+
JSON_STRING: "json_string",
|
|
40759
|
+
RAW: "raw"
|
|
40760
|
+
};
|
|
40761
|
+
var RENDER_TYPE_MAP = {
|
|
40762
|
+
configUrl: RENDER_TYPE.STRING,
|
|
40763
|
+
deepLinking: RENDER_TYPE.RAW,
|
|
40764
|
+
presets: RENDER_TYPE.STRING_ARRAY,
|
|
40765
|
+
plugins: RENDER_TYPE.STRING_ARRAY,
|
|
40766
|
+
spec: RENDER_TYPE.JSON_STRING,
|
|
40767
|
+
url: RENDER_TYPE.STRING,
|
|
40768
|
+
urls: RENDER_TYPE.JSON_STRING,
|
|
40769
|
+
layout: RENDER_TYPE.STRING,
|
|
40770
|
+
docExpansion: RENDER_TYPE.STRING,
|
|
40771
|
+
maxDisplayedTags: RENDER_TYPE.RAW,
|
|
40772
|
+
operationsSorter: RENDER_TYPE.RAW,
|
|
40773
|
+
requestInterceptor: RENDER_TYPE.RAW,
|
|
40774
|
+
responseInterceptor: RENDER_TYPE.RAW,
|
|
40775
|
+
persistAuthorization: RENDER_TYPE.RAW,
|
|
40776
|
+
defaultModelsExpandDepth: RENDER_TYPE.RAW,
|
|
40777
|
+
defaultModelExpandDepth: RENDER_TYPE.RAW,
|
|
40778
|
+
defaultModelRendering: RENDER_TYPE.STRING,
|
|
40779
|
+
displayRequestDuration: RENDER_TYPE.RAW,
|
|
40780
|
+
filter: RENDER_TYPE.RAW,
|
|
40781
|
+
showExtensions: RENDER_TYPE.RAW,
|
|
40782
|
+
showCommonExtensions: RENDER_TYPE.RAW,
|
|
40783
|
+
queryConfigEnabled: RENDER_TYPE.RAW,
|
|
40784
|
+
displayOperationId: RENDER_TYPE.RAW,
|
|
40785
|
+
tagsSorter: RENDER_TYPE.RAW,
|
|
40786
|
+
onComplete: RENDER_TYPE.RAW,
|
|
40787
|
+
syntaxHighlight: RENDER_TYPE.JSON_STRING,
|
|
40788
|
+
tryItOutEnabled: RENDER_TYPE.RAW,
|
|
40789
|
+
requestSnippetsEnabled: RENDER_TYPE.RAW,
|
|
40790
|
+
requestSnippets: RENDER_TYPE.JSON_STRING,
|
|
40791
|
+
oauth2RedirectUrl: RENDER_TYPE.STRING,
|
|
40792
|
+
showMutabledRequest: RENDER_TYPE.RAW,
|
|
40793
|
+
request: RENDER_TYPE.JSON_STRING,
|
|
40794
|
+
supportedSubmitMethods: RENDER_TYPE.JSON_STRING,
|
|
40795
|
+
validatorUrl: RENDER_TYPE.STRING,
|
|
40796
|
+
withCredentials: RENDER_TYPE.RAW,
|
|
40797
|
+
modelPropertyMacro: RENDER_TYPE.RAW,
|
|
40798
|
+
parameterMacro: RENDER_TYPE.RAW
|
|
40799
|
+
};
|
|
40800
|
+
var renderSwaggerUIOptions = (options) => {
|
|
40801
|
+
return Object.entries(options).map(([k, v]) => {
|
|
40802
|
+
const key = k;
|
|
40803
|
+
if (!RENDER_TYPE_MAP[key] || v === undefined)
|
|
40804
|
+
return "";
|
|
40805
|
+
switch (RENDER_TYPE_MAP[key]) {
|
|
40806
|
+
case RENDER_TYPE.STRING:
|
|
40807
|
+
return `${key}: '${v}'`;
|
|
40808
|
+
case RENDER_TYPE.STRING_ARRAY:
|
|
40809
|
+
if (!Array.isArray(v))
|
|
40810
|
+
return "";
|
|
40811
|
+
return `${key}: [${v.map((ve) => `${ve}`).join(",")}]`;
|
|
40812
|
+
case RENDER_TYPE.JSON_STRING:
|
|
40813
|
+
return `${key}: ${JSON.stringify(v)}`;
|
|
40814
|
+
case RENDER_TYPE.RAW:
|
|
40815
|
+
return `${key}: ${v}`;
|
|
40816
|
+
default:
|
|
40817
|
+
return "";
|
|
40818
|
+
}
|
|
40819
|
+
}).filter((item) => item !== "").join(",");
|
|
40820
|
+
};
|
|
40821
|
+
var remoteAssets = ({ version: version2 }) => {
|
|
40822
|
+
const url2 = `https://cdn.jsdelivr.net/npm/swagger-ui-dist${version2 !== undefined ? `@${version2}` : ""}`;
|
|
40823
|
+
return {
|
|
40824
|
+
css: [`${url2}/swagger-ui.css`],
|
|
40825
|
+
js: [`${url2}/swagger-ui-bundle.js`]
|
|
40826
|
+
};
|
|
40827
|
+
};
|
|
40828
|
+
var SwaggerUI = (options) => {
|
|
40829
|
+
const asset = remoteAssets({ version: options?.version });
|
|
40830
|
+
delete options.version;
|
|
40831
|
+
if (options.manuallySwaggerUIHtml)
|
|
40832
|
+
return options.manuallySwaggerUIHtml(asset);
|
|
40833
|
+
const optionsStrings = renderSwaggerUIOptions(options);
|
|
40834
|
+
return `
|
|
40835
|
+
<div>
|
|
40836
|
+
<div id="swagger-ui"></div>
|
|
40837
|
+
${asset.css.map((url2) => html`<link rel="stylesheet" href="${url2}" />`)}
|
|
40838
|
+
${asset.js.map((url2) => html`<script src="${url2}" crossorigin="anonymous"><\/script>`)}
|
|
40839
|
+
<script>
|
|
40840
|
+
window.onload = () => {
|
|
40841
|
+
window.ui = SwaggerUIBundle({
|
|
40842
|
+
dom_id: '#swagger-ui',${optionsStrings},
|
|
40843
|
+
})
|
|
40844
|
+
}
|
|
40845
|
+
</script>
|
|
40846
|
+
</div>
|
|
40847
|
+
`;
|
|
40848
|
+
};
|
|
40849
|
+
var middleware = (options) => async (c) => {
|
|
40850
|
+
const title = options?.title ?? "SwaggerUI";
|
|
40851
|
+
return c.html(`
|
|
40852
|
+
<!doctype html>
|
|
40853
|
+
<html lang="en">
|
|
40854
|
+
<head>
|
|
40855
|
+
<meta charset="utf-8" />
|
|
40856
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
40857
|
+
<meta name="description" content="SwaggerUI" />
|
|
40858
|
+
<title>${title}</title>
|
|
40859
|
+
</head>
|
|
40860
|
+
<body>
|
|
40861
|
+
${SwaggerUI(options)}
|
|
40862
|
+
</body>
|
|
40863
|
+
</html>
|
|
40864
|
+
`);
|
|
40865
|
+
};
|
|
40605
40866
|
// node_modules/.bun/@ai-sdk+gateway@3.0.66+3c5d820c62823f0b/node_modules/@ai-sdk/gateway/dist/index.mjs
|
|
40606
40867
|
var import_oidc = __toESM(require_dist(), 1);
|
|
40607
40868
|
var import_oidc2 = __toESM(require_dist(), 1);
|
|
@@ -48100,267 +48361,6 @@ var _a20;
|
|
|
48100
48361
|
_a20 = symbol20;
|
|
48101
48362
|
var defaultDownload2 = createDownload();
|
|
48102
48363
|
|
|
48103
|
-
// node_modules/.bun/hono@4.12.5/node_modules/hono/dist/utils/html.js
|
|
48104
|
-
var HtmlEscapedCallbackPhase = {
|
|
48105
|
-
Stringify: 1,
|
|
48106
|
-
BeforeStream: 2,
|
|
48107
|
-
Stream: 3
|
|
48108
|
-
};
|
|
48109
|
-
var raw = (value, callbacks) => {
|
|
48110
|
-
const escapedString = new String(value);
|
|
48111
|
-
escapedString.isEscaped = true;
|
|
48112
|
-
escapedString.callbacks = callbacks;
|
|
48113
|
-
return escapedString;
|
|
48114
|
-
};
|
|
48115
|
-
var escapeRe = /[&<>'"]/;
|
|
48116
|
-
var stringBufferToString = async (buffer, callbacks) => {
|
|
48117
|
-
let str = "";
|
|
48118
|
-
callbacks ||= [];
|
|
48119
|
-
const resolvedBuffer = await Promise.all(buffer);
|
|
48120
|
-
for (let i = resolvedBuffer.length - 1;; i--) {
|
|
48121
|
-
str += resolvedBuffer[i];
|
|
48122
|
-
i--;
|
|
48123
|
-
if (i < 0) {
|
|
48124
|
-
break;
|
|
48125
|
-
}
|
|
48126
|
-
let r = resolvedBuffer[i];
|
|
48127
|
-
if (typeof r === "object") {
|
|
48128
|
-
callbacks.push(...r.callbacks || []);
|
|
48129
|
-
}
|
|
48130
|
-
const isEscaped = r.isEscaped;
|
|
48131
|
-
r = await (typeof r === "object" ? r.toString() : r);
|
|
48132
|
-
if (typeof r === "object") {
|
|
48133
|
-
callbacks.push(...r.callbacks || []);
|
|
48134
|
-
}
|
|
48135
|
-
if (r.isEscaped ?? isEscaped) {
|
|
48136
|
-
str += r;
|
|
48137
|
-
} else {
|
|
48138
|
-
const buf = [str];
|
|
48139
|
-
escapeToBuffer(r, buf);
|
|
48140
|
-
str = buf[0];
|
|
48141
|
-
}
|
|
48142
|
-
}
|
|
48143
|
-
return raw(str, callbacks);
|
|
48144
|
-
};
|
|
48145
|
-
var escapeToBuffer = (str, buffer) => {
|
|
48146
|
-
const match = str.search(escapeRe);
|
|
48147
|
-
if (match === -1) {
|
|
48148
|
-
buffer[0] += str;
|
|
48149
|
-
return;
|
|
48150
|
-
}
|
|
48151
|
-
let escape2;
|
|
48152
|
-
let index;
|
|
48153
|
-
let lastIndex = 0;
|
|
48154
|
-
for (index = match;index < str.length; index++) {
|
|
48155
|
-
switch (str.charCodeAt(index)) {
|
|
48156
|
-
case 34:
|
|
48157
|
-
escape2 = """;
|
|
48158
|
-
break;
|
|
48159
|
-
case 39:
|
|
48160
|
-
escape2 = "'";
|
|
48161
|
-
break;
|
|
48162
|
-
case 38:
|
|
48163
|
-
escape2 = "&";
|
|
48164
|
-
break;
|
|
48165
|
-
case 60:
|
|
48166
|
-
escape2 = "<";
|
|
48167
|
-
break;
|
|
48168
|
-
case 62:
|
|
48169
|
-
escape2 = ">";
|
|
48170
|
-
break;
|
|
48171
|
-
default:
|
|
48172
|
-
continue;
|
|
48173
|
-
}
|
|
48174
|
-
buffer[0] += str.substring(lastIndex, index) + escape2;
|
|
48175
|
-
lastIndex = index + 1;
|
|
48176
|
-
}
|
|
48177
|
-
buffer[0] += str.substring(lastIndex, index);
|
|
48178
|
-
};
|
|
48179
|
-
var resolveCallbackSync = (str) => {
|
|
48180
|
-
const callbacks = str.callbacks;
|
|
48181
|
-
if (!callbacks?.length) {
|
|
48182
|
-
return str;
|
|
48183
|
-
}
|
|
48184
|
-
const buffer = [str];
|
|
48185
|
-
const context2 = {};
|
|
48186
|
-
callbacks.forEach((c) => c({ phase: HtmlEscapedCallbackPhase.Stringify, buffer, context: context2 }));
|
|
48187
|
-
return buffer[0];
|
|
48188
|
-
};
|
|
48189
|
-
var resolveCallback = async (str, phase, preserveCallbacks, context2, buffer) => {
|
|
48190
|
-
if (typeof str === "object" && !(str instanceof String)) {
|
|
48191
|
-
if (!(str instanceof Promise)) {
|
|
48192
|
-
str = str.toString();
|
|
48193
|
-
}
|
|
48194
|
-
if (str instanceof Promise) {
|
|
48195
|
-
str = await str;
|
|
48196
|
-
}
|
|
48197
|
-
}
|
|
48198
|
-
const callbacks = str.callbacks;
|
|
48199
|
-
if (!callbacks?.length) {
|
|
48200
|
-
return Promise.resolve(str);
|
|
48201
|
-
}
|
|
48202
|
-
if (buffer) {
|
|
48203
|
-
buffer[0] += str;
|
|
48204
|
-
} else {
|
|
48205
|
-
buffer = [str];
|
|
48206
|
-
}
|
|
48207
|
-
const resStr = Promise.all(callbacks.map((c) => c({ phase, buffer, context: context2 }))).then((res) => Promise.all(res.filter(Boolean).map((str2) => resolveCallback(str2, phase, false, context2, buffer))).then(() => buffer[0]));
|
|
48208
|
-
if (preserveCallbacks) {
|
|
48209
|
-
return raw(await resStr, callbacks);
|
|
48210
|
-
} else {
|
|
48211
|
-
return resStr;
|
|
48212
|
-
}
|
|
48213
|
-
};
|
|
48214
|
-
|
|
48215
|
-
// node_modules/.bun/hono@4.12.5/node_modules/hono/dist/helper/html/index.js
|
|
48216
|
-
var html = (strings, ...values) => {
|
|
48217
|
-
const buffer = [""];
|
|
48218
|
-
for (let i = 0, len = strings.length - 1;i < len; i++) {
|
|
48219
|
-
buffer[0] += strings[i];
|
|
48220
|
-
const children = Array.isArray(values[i]) ? values[i].flat(Infinity) : [values[i]];
|
|
48221
|
-
for (let i2 = 0, len2 = children.length;i2 < len2; i2++) {
|
|
48222
|
-
const child = children[i2];
|
|
48223
|
-
if (typeof child === "string") {
|
|
48224
|
-
escapeToBuffer(child, buffer);
|
|
48225
|
-
} else if (typeof child === "number") {
|
|
48226
|
-
buffer[0] += child;
|
|
48227
|
-
} else if (typeof child === "boolean" || child === null || child === undefined) {
|
|
48228
|
-
continue;
|
|
48229
|
-
} else if (typeof child === "object" && child.isEscaped) {
|
|
48230
|
-
if (child.callbacks) {
|
|
48231
|
-
buffer.unshift("", child);
|
|
48232
|
-
} else {
|
|
48233
|
-
const tmp = child.toString();
|
|
48234
|
-
if (tmp instanceof Promise) {
|
|
48235
|
-
buffer.unshift("", tmp);
|
|
48236
|
-
} else {
|
|
48237
|
-
buffer[0] += tmp;
|
|
48238
|
-
}
|
|
48239
|
-
}
|
|
48240
|
-
} else if (child instanceof Promise) {
|
|
48241
|
-
buffer.unshift("", child);
|
|
48242
|
-
} else {
|
|
48243
|
-
escapeToBuffer(child.toString(), buffer);
|
|
48244
|
-
}
|
|
48245
|
-
}
|
|
48246
|
-
}
|
|
48247
|
-
buffer[0] += strings.at(-1);
|
|
48248
|
-
return buffer.length === 1 ? "callbacks" in buffer ? raw(resolveCallbackSync(raw(buffer[0], buffer.callbacks))) : raw(buffer[0]) : stringBufferToString(buffer, buffer.callbacks);
|
|
48249
|
-
};
|
|
48250
|
-
|
|
48251
|
-
// node_modules/.bun/@hono+swagger-ui@0.5.3+bac6debbfb5ded19/node_modules/@hono/swagger-ui/dist/index.js
|
|
48252
|
-
var RENDER_TYPE = {
|
|
48253
|
-
STRING_ARRAY: "string_array",
|
|
48254
|
-
STRING: "string",
|
|
48255
|
-
JSON_STRING: "json_string",
|
|
48256
|
-
RAW: "raw"
|
|
48257
|
-
};
|
|
48258
|
-
var RENDER_TYPE_MAP = {
|
|
48259
|
-
configUrl: RENDER_TYPE.STRING,
|
|
48260
|
-
deepLinking: RENDER_TYPE.RAW,
|
|
48261
|
-
presets: RENDER_TYPE.STRING_ARRAY,
|
|
48262
|
-
plugins: RENDER_TYPE.STRING_ARRAY,
|
|
48263
|
-
spec: RENDER_TYPE.JSON_STRING,
|
|
48264
|
-
url: RENDER_TYPE.STRING,
|
|
48265
|
-
urls: RENDER_TYPE.JSON_STRING,
|
|
48266
|
-
layout: RENDER_TYPE.STRING,
|
|
48267
|
-
docExpansion: RENDER_TYPE.STRING,
|
|
48268
|
-
maxDisplayedTags: RENDER_TYPE.RAW,
|
|
48269
|
-
operationsSorter: RENDER_TYPE.RAW,
|
|
48270
|
-
requestInterceptor: RENDER_TYPE.RAW,
|
|
48271
|
-
responseInterceptor: RENDER_TYPE.RAW,
|
|
48272
|
-
persistAuthorization: RENDER_TYPE.RAW,
|
|
48273
|
-
defaultModelsExpandDepth: RENDER_TYPE.RAW,
|
|
48274
|
-
defaultModelExpandDepth: RENDER_TYPE.RAW,
|
|
48275
|
-
defaultModelRendering: RENDER_TYPE.STRING,
|
|
48276
|
-
displayRequestDuration: RENDER_TYPE.RAW,
|
|
48277
|
-
filter: RENDER_TYPE.RAW,
|
|
48278
|
-
showExtensions: RENDER_TYPE.RAW,
|
|
48279
|
-
showCommonExtensions: RENDER_TYPE.RAW,
|
|
48280
|
-
queryConfigEnabled: RENDER_TYPE.RAW,
|
|
48281
|
-
displayOperationId: RENDER_TYPE.RAW,
|
|
48282
|
-
tagsSorter: RENDER_TYPE.RAW,
|
|
48283
|
-
onComplete: RENDER_TYPE.RAW,
|
|
48284
|
-
syntaxHighlight: RENDER_TYPE.JSON_STRING,
|
|
48285
|
-
tryItOutEnabled: RENDER_TYPE.RAW,
|
|
48286
|
-
requestSnippetsEnabled: RENDER_TYPE.RAW,
|
|
48287
|
-
requestSnippets: RENDER_TYPE.JSON_STRING,
|
|
48288
|
-
oauth2RedirectUrl: RENDER_TYPE.STRING,
|
|
48289
|
-
showMutabledRequest: RENDER_TYPE.RAW,
|
|
48290
|
-
request: RENDER_TYPE.JSON_STRING,
|
|
48291
|
-
supportedSubmitMethods: RENDER_TYPE.JSON_STRING,
|
|
48292
|
-
validatorUrl: RENDER_TYPE.STRING,
|
|
48293
|
-
withCredentials: RENDER_TYPE.RAW,
|
|
48294
|
-
modelPropertyMacro: RENDER_TYPE.RAW,
|
|
48295
|
-
parameterMacro: RENDER_TYPE.RAW
|
|
48296
|
-
};
|
|
48297
|
-
var renderSwaggerUIOptions = (options) => {
|
|
48298
|
-
return Object.entries(options).map(([k, v]) => {
|
|
48299
|
-
const key = k;
|
|
48300
|
-
if (!RENDER_TYPE_MAP[key] || v === undefined)
|
|
48301
|
-
return "";
|
|
48302
|
-
switch (RENDER_TYPE_MAP[key]) {
|
|
48303
|
-
case RENDER_TYPE.STRING:
|
|
48304
|
-
return `${key}: '${v}'`;
|
|
48305
|
-
case RENDER_TYPE.STRING_ARRAY:
|
|
48306
|
-
if (!Array.isArray(v))
|
|
48307
|
-
return "";
|
|
48308
|
-
return `${key}: [${v.map((ve) => `${ve}`).join(",")}]`;
|
|
48309
|
-
case RENDER_TYPE.JSON_STRING:
|
|
48310
|
-
return `${key}: ${JSON.stringify(v)}`;
|
|
48311
|
-
case RENDER_TYPE.RAW:
|
|
48312
|
-
return `${key}: ${v}`;
|
|
48313
|
-
default:
|
|
48314
|
-
return "";
|
|
48315
|
-
}
|
|
48316
|
-
}).filter((item) => item !== "").join(",");
|
|
48317
|
-
};
|
|
48318
|
-
var remoteAssets = ({ version: version2 }) => {
|
|
48319
|
-
const url2 = `https://cdn.jsdelivr.net/npm/swagger-ui-dist${version2 !== undefined ? `@${version2}` : ""}`;
|
|
48320
|
-
return {
|
|
48321
|
-
css: [`${url2}/swagger-ui.css`],
|
|
48322
|
-
js: [`${url2}/swagger-ui-bundle.js`]
|
|
48323
|
-
};
|
|
48324
|
-
};
|
|
48325
|
-
var SwaggerUI = (options) => {
|
|
48326
|
-
const asset = remoteAssets({ version: options?.version });
|
|
48327
|
-
delete options.version;
|
|
48328
|
-
if (options.manuallySwaggerUIHtml)
|
|
48329
|
-
return options.manuallySwaggerUIHtml(asset);
|
|
48330
|
-
const optionsStrings = renderSwaggerUIOptions(options);
|
|
48331
|
-
return `
|
|
48332
|
-
<div>
|
|
48333
|
-
<div id="swagger-ui"></div>
|
|
48334
|
-
${asset.css.map((url2) => html`<link rel="stylesheet" href="${url2}" />`)}
|
|
48335
|
-
${asset.js.map((url2) => html`<script src="${url2}" crossorigin="anonymous"><\/script>`)}
|
|
48336
|
-
<script>
|
|
48337
|
-
window.onload = () => {
|
|
48338
|
-
window.ui = SwaggerUIBundle({
|
|
48339
|
-
dom_id: '#swagger-ui',${optionsStrings},
|
|
48340
|
-
})
|
|
48341
|
-
}
|
|
48342
|
-
</script>
|
|
48343
|
-
</div>
|
|
48344
|
-
`;
|
|
48345
|
-
};
|
|
48346
|
-
var middleware = (options) => async (c) => {
|
|
48347
|
-
const title = options?.title ?? "SwaggerUI";
|
|
48348
|
-
return c.html(`
|
|
48349
|
-
<!doctype html>
|
|
48350
|
-
<html lang="en">
|
|
48351
|
-
<head>
|
|
48352
|
-
<meta charset="utf-8" />
|
|
48353
|
-
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
48354
|
-
<meta name="description" content="SwaggerUI" />
|
|
48355
|
-
<title>${title}</title>
|
|
48356
|
-
</head>
|
|
48357
|
-
<body>
|
|
48358
|
-
${SwaggerUI(options)}
|
|
48359
|
-
</body>
|
|
48360
|
-
</html>
|
|
48361
|
-
`);
|
|
48362
|
-
};
|
|
48363
|
-
|
|
48364
48364
|
// node_modules/.bun/hono@4.12.5/node_modules/hono/dist/compose.js
|
|
48365
48365
|
var compose = (middleware2, onError, onNotFound) => {
|
|
48366
48366
|
return (context2, next) => {
|
|
@@ -51277,6 +51277,14 @@ var DEFAULT_CONFIG = `{
|
|
|
51277
51277
|
// },
|
|
51278
51278
|
},
|
|
51279
51279
|
|
|
51280
|
+
// \u901A\u7528\u670D\u52A1\u8BBE\u7F6E
|
|
51281
|
+
server: {
|
|
51282
|
+
// \u9ED8\u8BA4\u5173\u95ED\u5C40\u57DF\u7F51\u8BBF\u95EE\u3002\u5F00\u542F\u540E\uFF0C\u5C40\u57DF\u7F51\u5185\u5176\u4ED6\u8BBE\u5907\u53EF\u8BBF\u95EE\u672C\u670D\u52A1\u3002
|
|
51283
|
+
lanAccess: {
|
|
51284
|
+
enabled: false,
|
|
51285
|
+
},
|
|
51286
|
+
},
|
|
51287
|
+
|
|
51280
51288
|
// \u65E5\u5FD7\u914D\u7F6E\uFF08\u53EF\u9009\uFF0C\u4E0D\u914D\u7F6E\u5219\u4E0D\u542F\u7528\u65E5\u5FD7\u8BB0\u5F55\uFF09
|
|
51281
51289
|
// log: {
|
|
51282
51290
|
// enabled: true,
|
|
@@ -51347,8 +51355,8 @@ function resolveLogBaseDir(logConfig) {
|
|
|
51347
51355
|
}
|
|
51348
51356
|
|
|
51349
51357
|
// src/config-store.ts
|
|
51350
|
-
import { resolve as resolve3 } from "path";
|
|
51351
51358
|
import { writeFileSync as writeFileSync2 } from "fs";
|
|
51359
|
+
import { resolve as resolve3 } from "path";
|
|
51352
51360
|
class ConfigStore {
|
|
51353
51361
|
config;
|
|
51354
51362
|
absolutePath;
|
|
@@ -51384,6 +51392,51 @@ class ConfigStore {
|
|
|
51384
51392
|
}
|
|
51385
51393
|
}
|
|
51386
51394
|
|
|
51395
|
+
// src/config-validate.ts
|
|
51396
|
+
var import__2020 = __toESM(require_2020(), 1);
|
|
51397
|
+
var import_ajv_formats = __toESM(require_dist2(), 1);
|
|
51398
|
+
import { readFileSync as readFileSync2 } from "fs";
|
|
51399
|
+
|
|
51400
|
+
// src/runtime-assets.ts
|
|
51401
|
+
import { fileURLToPath } from "url";
|
|
51402
|
+
function resolveBundledAssetPath(relativePath) {
|
|
51403
|
+
return fileURLToPath(new URL(relativePath, import.meta.url));
|
|
51404
|
+
}
|
|
51405
|
+
function getBundledSchemaPath() {
|
|
51406
|
+
return resolveBundledAssetPath("../config.schema.json");
|
|
51407
|
+
}
|
|
51408
|
+
function getBundledWebRoot() {
|
|
51409
|
+
return resolveBundledAssetPath("../dist/web/");
|
|
51410
|
+
}
|
|
51411
|
+
|
|
51412
|
+
// src/config-validate.ts
|
|
51413
|
+
function validateBusinessRules(config2) {
|
|
51414
|
+
for (const [routeType, modelMap] of Object.entries(config2.routes)) {
|
|
51415
|
+
if (!modelMap["*"]) {
|
|
51416
|
+
throw new Error(`\u8DEF\u7531 "${routeType}" \u7F3A\u5C11 "*" \u515C\u5E95\u89C4\u5219`);
|
|
51417
|
+
}
|
|
51418
|
+
for (const target of Object.values(modelMap)) {
|
|
51419
|
+
if (!config2.providers[target.provider]) {
|
|
51420
|
+
throw new Error(`\u8DEF\u7531 "${routeType}" \u5F15\u7528\u4E86\u4E0D\u5B58\u5728\u7684 provider "${target.provider}"`);
|
|
51421
|
+
}
|
|
51422
|
+
}
|
|
51423
|
+
}
|
|
51424
|
+
}
|
|
51425
|
+
function validateConfigOrThrow(config2) {
|
|
51426
|
+
validateBusinessRules(config2);
|
|
51427
|
+
const ajv = new import__2020.default({ allErrors: true, strict: false });
|
|
51428
|
+
import_ajv_formats.default(ajv);
|
|
51429
|
+
const schemaJson = JSON.parse(readFileSync2(getBundledSchemaPath(), "utf-8"));
|
|
51430
|
+
const validateBySchema = ajv.compile(schemaJson);
|
|
51431
|
+
const valid = validateBySchema(config2);
|
|
51432
|
+
if (!valid) {
|
|
51433
|
+
const firstError = validateBySchema.errors?.[0];
|
|
51434
|
+
const path = firstError?.instancePath || "(root)";
|
|
51435
|
+
const message = firstError?.message ?? "unknown schema validation error";
|
|
51436
|
+
throw new Error(`Schema \u6821\u9A8C\u5931\u8D25: ${path} ${message}`);
|
|
51437
|
+
}
|
|
51438
|
+
}
|
|
51439
|
+
|
|
51387
51440
|
// src/crypto.ts
|
|
51388
51441
|
var ECDH_PARAMS = { name: "ECDH", namedCurve: "P-256" };
|
|
51389
51442
|
function base64Encode(buf) {
|
|
@@ -51736,7 +51789,7 @@ async function getLogMetrics(options) {
|
|
|
51736
51789
|
}
|
|
51737
51790
|
|
|
51738
51791
|
// src/log-query.ts
|
|
51739
|
-
import { createReadStream as createReadStream2, existsSync as existsSync3, readFileSync as
|
|
51792
|
+
import { createReadStream as createReadStream2, existsSync as existsSync3, readFileSync as readFileSync3 } from "fs";
|
|
51740
51793
|
import { join as join4, resolve as resolve4 } from "path";
|
|
51741
51794
|
import { createInterface as createInterface2 } from "readline";
|
|
51742
51795
|
|
|
@@ -51768,7 +51821,26 @@ function extractUserIdRawFromRequestBody(requestBody) {
|
|
|
51768
51821
|
userIdRaw: userId
|
|
51769
51822
|
};
|
|
51770
51823
|
}
|
|
51824
|
+
function parseUserSessionFromJsonFormat(userIdRaw) {
|
|
51825
|
+
let parsed;
|
|
51826
|
+
try {
|
|
51827
|
+
parsed = JSON.parse(userIdRaw);
|
|
51828
|
+
} catch {
|
|
51829
|
+
return null;
|
|
51830
|
+
}
|
|
51831
|
+
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed))
|
|
51832
|
+
return null;
|
|
51833
|
+
const obj = parsed;
|
|
51834
|
+
const sessionId = typeof obj.session_id === "string" ? obj.session_id.trim() : "";
|
|
51835
|
+
if (!sessionId)
|
|
51836
|
+
return null;
|
|
51837
|
+
const userKey = (typeof obj.account_uuid === "string" ? obj.account_uuid.trim() : "") || (typeof obj.device_id === "string" ? obj.device_id.trim() : "");
|
|
51838
|
+
return { userKey: userKey || sessionId, sessionId };
|
|
51839
|
+
}
|
|
51771
51840
|
function parseUserSessionFromUserIdRaw(userIdRaw) {
|
|
51841
|
+
if (userIdRaw.trimStart().startsWith("{")) {
|
|
51842
|
+
return parseUserSessionFromJsonFormat(userIdRaw);
|
|
51843
|
+
}
|
|
51772
51844
|
const index = userIdRaw.indexOf(USER_SESSION_DELIMITER);
|
|
51773
51845
|
if (index <= 0)
|
|
51774
51846
|
return null;
|
|
@@ -52077,7 +52149,7 @@ function readStreamContent(baseDir, streamFile) {
|
|
|
52077
52149
|
return { content: null, warning: "stream_file \u4E0D\u662F .sse.raw \u6587\u4EF6\uFF0C\u5DF2\u8DF3\u8FC7\u8BFB\u53D6\u3002" };
|
|
52078
52150
|
}
|
|
52079
52151
|
if (existsSync3(resolvedFromFile)) {
|
|
52080
|
-
return { content:
|
|
52152
|
+
return { content: readFileSync3(resolvedFromFile, "utf-8"), warning: null };
|
|
52081
52153
|
}
|
|
52082
52154
|
const fallbackPath = resolve4(resolvedBase, streamFile);
|
|
52083
52155
|
if (!fallbackPath.startsWith(`${resolvedBase}/`) && fallbackPath !== resolvedBase) {
|
|
@@ -52086,7 +52158,7 @@ function readStreamContent(baseDir, streamFile) {
|
|
|
52086
52158
|
if (!existsSync3(fallbackPath)) {
|
|
52087
52159
|
return { content: null, warning: "stream_file \u4E0D\u5B58\u5728\uFF0C\u53EF\u80FD\u5DF2\u88AB\u6E05\u7406\u3002" };
|
|
52088
52160
|
}
|
|
52089
|
-
return { content:
|
|
52161
|
+
return { content: readFileSync3(fallbackPath, "utf-8"), warning: null };
|
|
52090
52162
|
} catch (err) {
|
|
52091
52163
|
return {
|
|
52092
52164
|
content: null,
|
|
@@ -52975,6 +53047,85 @@ function normalizeUrl(rawUrl) {
|
|
|
52975
53047
|
return rawUrl;
|
|
52976
53048
|
}
|
|
52977
53049
|
|
|
53050
|
+
// src/network-access.ts
|
|
53051
|
+
var REMOTE_ADDRESS_ENV_KEY = "LOCAL_ROUTER_REMOTE_ADDRESS";
|
|
53052
|
+
function parseIpv4(address) {
|
|
53053
|
+
const parts = address.split(".");
|
|
53054
|
+
if (parts.length !== 4)
|
|
53055
|
+
return null;
|
|
53056
|
+
const octets = parts.map((part) => {
|
|
53057
|
+
if (!/^\d{1,3}$/.test(part))
|
|
53058
|
+
return Number.NaN;
|
|
53059
|
+
const value = Number.parseInt(part, 10);
|
|
53060
|
+
return value >= 0 && value <= 255 ? value : Number.NaN;
|
|
53061
|
+
});
|
|
53062
|
+
return octets.every(Number.isFinite) ? octets : null;
|
|
53063
|
+
}
|
|
53064
|
+
function normalizeIpAddress(raw2) {
|
|
53065
|
+
let address = raw2.trim().toLowerCase();
|
|
53066
|
+
if (address.startsWith("[")) {
|
|
53067
|
+
const end = address.indexOf("]");
|
|
53068
|
+
if (end !== -1)
|
|
53069
|
+
address = address.slice(1, end);
|
|
53070
|
+
}
|
|
53071
|
+
const mappedIpv4 = address.match(/^::ffff:(\d{1,3}(?:\.\d{1,3}){3})$/);
|
|
53072
|
+
if (mappedIpv4) {
|
|
53073
|
+
return mappedIpv4[1];
|
|
53074
|
+
}
|
|
53075
|
+
return address;
|
|
53076
|
+
}
|
|
53077
|
+
function isLoopbackAddress(raw2) {
|
|
53078
|
+
if (!raw2)
|
|
53079
|
+
return false;
|
|
53080
|
+
const address = normalizeIpAddress(raw2);
|
|
53081
|
+
const ipv43 = parseIpv4(address);
|
|
53082
|
+
if (ipv43)
|
|
53083
|
+
return ipv43[0] === 127;
|
|
53084
|
+
return address === "::1";
|
|
53085
|
+
}
|
|
53086
|
+
function isLanAddress(raw2) {
|
|
53087
|
+
if (!raw2)
|
|
53088
|
+
return false;
|
|
53089
|
+
const address = normalizeIpAddress(raw2);
|
|
53090
|
+
const ipv43 = parseIpv4(address);
|
|
53091
|
+
if (ipv43) {
|
|
53092
|
+
const [a, b] = ipv43;
|
|
53093
|
+
return a === 10 || a === 172 && b >= 16 && b <= 31 || a === 192 && b === 168 || a === 169 && b === 254;
|
|
53094
|
+
}
|
|
53095
|
+
return address.startsWith("fc") || address.startsWith("fd") || /^fe[89ab]/.test(address);
|
|
53096
|
+
}
|
|
53097
|
+
function decideNetworkAccess(serverConfig, rawRemoteAddress) {
|
|
53098
|
+
const remoteAddress = rawRemoteAddress ? normalizeIpAddress(rawRemoteAddress) : null;
|
|
53099
|
+
if (!remoteAddress || isLoopbackAddress(remoteAddress)) {
|
|
53100
|
+
return { allowed: true, remoteAddress };
|
|
53101
|
+
}
|
|
53102
|
+
const lanEnabled = serverConfig?.lanAccess?.enabled === true;
|
|
53103
|
+
if (!lanEnabled) {
|
|
53104
|
+
return { allowed: false, remoteAddress, reason: "lan-disabled" };
|
|
53105
|
+
}
|
|
53106
|
+
if (!isLanAddress(remoteAddress)) {
|
|
53107
|
+
return { allowed: false, remoteAddress, reason: "non-lan-address" };
|
|
53108
|
+
}
|
|
53109
|
+
return { allowed: true, remoteAddress };
|
|
53110
|
+
}
|
|
53111
|
+
function getRemoteAddressFromContext(c2) {
|
|
53112
|
+
const env = c2.env;
|
|
53113
|
+
const value = env?.[REMOTE_ADDRESS_ENV_KEY];
|
|
53114
|
+
return typeof value === "string" && value.trim() ? value : null;
|
|
53115
|
+
}
|
|
53116
|
+
function createNetworkAccessMiddleware(store) {
|
|
53117
|
+
return async (c2, next) => {
|
|
53118
|
+
const decision = decideNetworkAccess(store.get().server, getRemoteAddressFromContext(c2));
|
|
53119
|
+
if (!decision.allowed) {
|
|
53120
|
+
return c2.json({
|
|
53121
|
+
error: decision.reason === "lan-disabled" ? "\u5C40\u57DF\u7F51\u670D\u52A1\u672A\u5F00\u542F\uFF0C\u5DF2\u62D2\u7EDD\u975E\u672C\u673A\u8BF7\u6C42" : "\u4EC5\u5141\u8BB8\u672C\u673A\u6216\u5C40\u57DF\u7F51\u6765\u6E90\u8BBF\u95EE",
|
|
53122
|
+
remoteAddress: decision.remoteAddress
|
|
53123
|
+
}, 403);
|
|
53124
|
+
}
|
|
53125
|
+
await next();
|
|
53126
|
+
};
|
|
53127
|
+
}
|
|
53128
|
+
|
|
52978
53129
|
// src/openapi.ts
|
|
52979
53130
|
var openAPISpec = {
|
|
52980
53131
|
openapi: "3.0.0",
|
|
@@ -53423,7 +53574,9 @@ var openAPISpec = {
|
|
|
53423
53574
|
type: "object",
|
|
53424
53575
|
additionalProperties: { type: "string" }
|
|
53425
53576
|
},
|
|
53426
|
-
requestBody: {
|
|
53577
|
+
requestBody: {
|
|
53578
|
+
type: ["object", "array", "string", "number", "boolean", "null"]
|
|
53579
|
+
}
|
|
53427
53580
|
}
|
|
53428
53581
|
},
|
|
53429
53582
|
response: {
|
|
@@ -54077,9 +54230,9 @@ var openAPISpec = {
|
|
|
54077
54230
|
};
|
|
54078
54231
|
|
|
54079
54232
|
// src/plugin-loader.ts
|
|
54080
|
-
import {
|
|
54233
|
+
import { mkdtemp, rm, writeFile } from "fs/promises";
|
|
54081
54234
|
import { tmpdir } from "os";
|
|
54082
|
-
import {
|
|
54235
|
+
import { join as join8, resolve as resolve5 } from "path";
|
|
54083
54236
|
function isLocalPath(pkg) {
|
|
54084
54237
|
return pkg.startsWith("./") || pkg.startsWith("../") || pkg.startsWith("/") || /^[A-Za-z]:[\\/]/.test(pkg);
|
|
54085
54238
|
}
|
|
@@ -54154,13 +54307,17 @@ class PluginManager {
|
|
|
54154
54307
|
constructor(configDir) {
|
|
54155
54308
|
this.configDir = configDir;
|
|
54156
54309
|
}
|
|
54157
|
-
async loadPluginsForProvider(providerName, pluginConfigs) {
|
|
54310
|
+
async loadPluginsForProvider(providerName, providerConfig, pluginConfigs) {
|
|
54158
54311
|
const loaded = [];
|
|
54159
54312
|
const failures = [];
|
|
54160
54313
|
for (const config2 of pluginConfigs) {
|
|
54161
54314
|
try {
|
|
54162
54315
|
const definition = await importPlugin(config2.package, this.configDir);
|
|
54163
|
-
const
|
|
54316
|
+
const params = { ...config2.params ?? {} };
|
|
54317
|
+
if (definition.name === "protocol-adapter" && params.targetFormat === undefined) {
|
|
54318
|
+
params.targetFormat = providerConfig.type;
|
|
54319
|
+
}
|
|
54320
|
+
const instance2 = await definition.create(params);
|
|
54164
54321
|
loaded.push({ config: config2, definition, instance: instance2 });
|
|
54165
54322
|
} catch (err) {
|
|
54166
54323
|
const errorMsg = err instanceof Error ? err.message : String(err);
|
|
@@ -54176,7 +54333,7 @@ class PluginManager {
|
|
|
54176
54333
|
const oldPluginsToDispose = [];
|
|
54177
54334
|
for (const [providerName, providerConfig] of Object.entries(providers)) {
|
|
54178
54335
|
if (providerConfig.plugins && providerConfig.plugins.length > 0) {
|
|
54179
|
-
const { loaded, failures } = await this.loadPluginsForProvider(providerName, providerConfig.plugins);
|
|
54336
|
+
const { loaded, failures } = await this.loadPluginsForProvider(providerName, providerConfig, providerConfig.plugins);
|
|
54180
54337
|
allFailures.push(...failures);
|
|
54181
54338
|
if (failures.length > 0) {
|
|
54182
54339
|
console.warn(`[plugin] provider "${providerName}" \u6709\u63D2\u4EF6\u52A0\u8F7D\u5931\u8D25\uFF0C\u4FDD\u7559\u65E7\u63D2\u4EF6\u94FE`);
|
|
@@ -54245,19 +54402,12 @@ class PluginManager {
|
|
|
54245
54402
|
}
|
|
54246
54403
|
}
|
|
54247
54404
|
}
|
|
54248
|
-
async disposePluginMap(pluginMap) {
|
|
54249
|
-
const allPlugins = [];
|
|
54250
|
-
for (const [, loadedPlugins] of pluginMap) {
|
|
54251
|
-
allPlugins.push(...loadedPlugins);
|
|
54252
|
-
}
|
|
54253
|
-
await this.disposePluginList(allPlugins);
|
|
54254
|
-
}
|
|
54255
54405
|
}
|
|
54256
54406
|
|
|
54257
54407
|
// src/proxy.ts
|
|
54258
54408
|
import { appendFile, readFile, unlink } from "fs/promises";
|
|
54259
|
-
import { join as join9 } from "path";
|
|
54260
54409
|
import { tmpdir as tmpdir2 } from "os";
|
|
54410
|
+
import { join as join9 } from "path";
|
|
54261
54411
|
|
|
54262
54412
|
// src/plugin-engine.ts
|
|
54263
54413
|
async function executeRequestPlugins(plugins, ctx, url2, headers, body) {
|
|
@@ -54768,47 +54918,34 @@ function createOpenaiResponsesRoutes(routeType, store, pluginManager) {
|
|
|
54768
54918
|
return routes;
|
|
54769
54919
|
}
|
|
54770
54920
|
|
|
54771
|
-
// src/
|
|
54772
|
-
|
|
54773
|
-
|
|
54774
|
-
|
|
54775
|
-
|
|
54776
|
-
function getBundledSchemaPath() {
|
|
54777
|
-
return resolveBundledAssetPath("../config.schema.json");
|
|
54778
|
-
}
|
|
54779
|
-
function getBundledWebRoot() {
|
|
54780
|
-
return resolveBundledAssetPath("../dist/web/");
|
|
54781
|
-
}
|
|
54782
|
-
|
|
54783
|
-
// src/config-validate.ts
|
|
54784
|
-
var import__2020 = __toESM(require_2020(), 1);
|
|
54785
|
-
var import_ajv_formats = __toESM(require_dist2(), 1);
|
|
54786
|
-
import { readFileSync as readFileSync3 } from "fs";
|
|
54787
|
-
function validateBusinessRules(config2) {
|
|
54788
|
-
for (const [routeType, modelMap] of Object.entries(config2.routes)) {
|
|
54789
|
-
if (!modelMap["*"]) {
|
|
54790
|
-
throw new Error(`\u8DEF\u7531 "${routeType}" \u7F3A\u5C11 "*" \u515C\u5E95\u89C4\u5219`);
|
|
54791
|
-
}
|
|
54792
|
-
for (const target of Object.values(modelMap)) {
|
|
54793
|
-
if (!config2.providers[target.provider]) {
|
|
54794
|
-
throw new Error(`\u8DEF\u7531 "${routeType}" \u5F15\u7528\u4E86\u4E0D\u5B58\u5728\u7684 provider "${target.provider}"`);
|
|
54795
|
-
}
|
|
54796
|
-
}
|
|
54921
|
+
// src/server-address.ts
|
|
54922
|
+
function formatUrlHost(host) {
|
|
54923
|
+
const trimmed = host.trim();
|
|
54924
|
+
if (trimmed.startsWith("[") && trimmed.endsWith("]")) {
|
|
54925
|
+
return trimmed;
|
|
54797
54926
|
}
|
|
54927
|
+
return trimmed.includes(":") ? `[${trimmed}]` : trimmed;
|
|
54798
54928
|
}
|
|
54799
|
-
function
|
|
54800
|
-
|
|
54801
|
-
|
|
54802
|
-
|
|
54803
|
-
|
|
54804
|
-
|
|
54805
|
-
|
|
54806
|
-
if (!valid) {
|
|
54807
|
-
const firstError = validateBySchema.errors?.[0];
|
|
54808
|
-
const path = firstError?.instancePath || "(root)";
|
|
54809
|
-
const message = firstError?.message ?? "unknown schema validation error";
|
|
54810
|
-
throw new Error(`Schema \u6821\u9A8C\u5931\u8D25: ${path} ${message}`);
|
|
54929
|
+
function resolveLocalAccessHost(listenHost) {
|
|
54930
|
+
const host = listenHost.trim().toLowerCase();
|
|
54931
|
+
if (host === "0.0.0.0" || host === "") {
|
|
54932
|
+
return "127.0.0.1";
|
|
54933
|
+
}
|
|
54934
|
+
if (host === "::" || host === "[::]") {
|
|
54935
|
+
return "::1";
|
|
54811
54936
|
}
|
|
54937
|
+
return listenHost.trim();
|
|
54938
|
+
}
|
|
54939
|
+
function createServerAddressInfo(listenHost, port) {
|
|
54940
|
+
const normalizedListenHost = listenHost.trim() || "0.0.0.0";
|
|
54941
|
+
const localHost = resolveLocalAccessHost(normalizedListenHost);
|
|
54942
|
+
return {
|
|
54943
|
+
listenHost: normalizedListenHost,
|
|
54944
|
+
localHost,
|
|
54945
|
+
port,
|
|
54946
|
+
listenUrl: `http://${formatUrlHost(normalizedListenHost)}:${port}`,
|
|
54947
|
+
localUrl: `http://${formatUrlHost(localHost)}:${port}`
|
|
54948
|
+
};
|
|
54812
54949
|
}
|
|
54813
54950
|
|
|
54814
54951
|
// src/index.ts
|
|
@@ -54850,13 +54987,18 @@ var ROUTE_REGISTRY = {
|
|
|
54850
54987
|
create: createAnthropicMessagesRoutes
|
|
54851
54988
|
}
|
|
54852
54989
|
};
|
|
54853
|
-
function printIntegrationGuide(config2) {
|
|
54854
|
-
const host = process.env.HOST ?? "
|
|
54855
|
-
const
|
|
54856
|
-
const
|
|
54990
|
+
function printIntegrationGuide(config2, listen = {}) {
|
|
54991
|
+
const host = listen.host ?? process.env.HOST ?? "0.0.0.0";
|
|
54992
|
+
const parsedPort = listen.port ?? Number.parseInt(process.env.PORT ?? "4099", 10);
|
|
54993
|
+
const address = createServerAddressInfo(host, Number.isFinite(parsedPort) ? parsedPort : 4099);
|
|
54994
|
+
const baseUrl = address.localUrl;
|
|
54857
54995
|
console.log(`
|
|
54858
54996
|
================ local-router \u63A5\u5165\u6307\u5357 ================`);
|
|
54859
|
-
console.log(`\
|
|
54997
|
+
console.log(`\u670D\u52A1\u76D1\u542C\u5730\u5740: ${address.listenUrl}`);
|
|
54998
|
+
console.log(`\u672C\u673A\u8BBF\u95EE\u5730\u5740: ${address.localUrl}`);
|
|
54999
|
+
if (address.listenHost === "0.0.0.0" || address.listenHost === "::" || address.listenHost === "[::]") {
|
|
55000
|
+
console.log("\u5C40\u57DF\u7F51\u8BBF\u95EE: \u5F00\u542F\u5C40\u57DF\u7F51\u670D\u52A1\u540E\uFF0C\u4F7F\u7528\u672C\u673A\u5C40\u57DF\u7F51 IP \u66FF\u6362\u4E0A\u9762\u7684\u672C\u673A\u5730\u5740\u3002");
|
|
55001
|
+
}
|
|
54860
55002
|
console.log("\u5065\u5EB7\u68C0\u67E5: GET /");
|
|
54861
55003
|
console.log(`API \u6587\u6863: ${baseUrl}/api/docs`);
|
|
54862
55004
|
console.log(`\u7BA1\u7406\u9762\u677F: ${baseUrl}/admin`);
|
|
@@ -55495,8 +55637,9 @@ async function createApp(store, options) {
|
|
|
55495
55637
|
options?.registerCleanup?.(() => {
|
|
55496
55638
|
pluginManager.disposeAll().catch(() => {});
|
|
55497
55639
|
});
|
|
55498
|
-
printIntegrationGuide(config2);
|
|
55640
|
+
printIntegrationGuide(config2, options?.listen);
|
|
55499
55641
|
const app = new Hono2;
|
|
55642
|
+
app.use("*", createNetworkAccessMiddleware(store));
|
|
55500
55643
|
app.get("/", (c2) => c2.text("local-router is running"));
|
|
55501
55644
|
for (const [routeType, entry] of Object.entries(ROUTE_REGISTRY)) {
|
|
55502
55645
|
const subApp = entry.create(routeType, store, pluginManager);
|
|
@@ -55535,12 +55678,26 @@ async function createApp(store, options) {
|
|
|
55535
55678
|
async function createDefaultAppFromProcessArgs() {
|
|
55536
55679
|
const configPath = parseConfigPath();
|
|
55537
55680
|
const store = new ConfigStore(configPath);
|
|
55538
|
-
return createApp(store
|
|
55681
|
+
return createApp(store, {
|
|
55682
|
+
listen: {
|
|
55683
|
+
host: process.env.HOST ?? "0.0.0.0",
|
|
55684
|
+
port: Number.parseInt(process.env.PORT ?? "4099", 10)
|
|
55685
|
+
}
|
|
55686
|
+
});
|
|
55539
55687
|
}
|
|
55540
55688
|
|
|
55541
55689
|
// src/entry.ts
|
|
55542
55690
|
var app = await createDefaultAppFromProcessArgs();
|
|
55543
|
-
var entry_default =
|
|
55691
|
+
var entry_default = {
|
|
55692
|
+
hostname: process.env.HOST ?? "0.0.0.0",
|
|
55693
|
+
port: Number.parseInt(process.env.PORT ?? "4099", 10),
|
|
55694
|
+
fetch(request, server) {
|
|
55695
|
+
const remoteAddress = server.requestIP(request)?.address ?? null;
|
|
55696
|
+
return app.fetch(request, {
|
|
55697
|
+
[REMOTE_ADDRESS_ENV_KEY]: remoteAddress
|
|
55698
|
+
});
|
|
55699
|
+
}
|
|
55700
|
+
};
|
|
55544
55701
|
export {
|
|
55545
55702
|
entry_default as default
|
|
55546
55703
|
};
|