@open-editor/server
Advanced tools
+2
-1
@@ -107,2 +107,3 @@ import connect from 'connect'; | ||
| export { OpenEditorMiddlewareOptions, Options, openEditorMiddleware, setupServer }; | ||
| export { openEditorMiddleware, setupServer }; | ||
| export type { OpenEditorMiddlewareOptions, Options }; |
+1
-1
@@ -1,1 +0,1 @@ | ||
| "use strict";var http=require("node:http"),https=require("node:https"),node_fs=require("node:fs"),connect=require("connect"),corsMiddleware=require("cors"),shared=require("@open-editor/shared"),node_path=require("node:path"),node_url=require("node:url"),openEditor=require("launch-editor"),net=require("node:net");const DEFAULE_OPEN_DDITOR=(file,errorCallback)=>{openEditor(file,(_,errorMessage)=>errorCallback(errorMessage))};function openEditorMiddleware(options={}){const{rootDir=process.cwd(),onOpenEditor=DEFAULE_OPEN_DDITOR}=options;return(req,res)=>{var _a;try{const{query}=node_url.parse((_a=req.url)!=null?_a:"/",!0),{f:file="unknown",l:line="1",c:column="1"}=query;if(!file){sendErrorResponse(res,400,"\u7F3A\u5C11\u6587\u4EF6\u8DEF\u5F84\u53C2\u6570");return}const filename=node_path.resolve(rootDir,decodeURIComponent(file));if(!validateFile(filename,res))return;req.headers.referer&&onOpenEditor(`${filename}:${line}:${column}`,errorMessage=>{throw new Error(errorMessage||"\u53EF\u80FD\u539F\u56E0\u6709\u7F16\u8F91\u5668\u672A\u542F\u52A8/\u7F16\u8F91\u5668\u672A\u54CD\u5E94")}),sendFileContent(res,filename)}catch(error){const errorMessage=error instanceof Error?error.message:"\u672A\u77E5\u9519\u8BEF";sendErrorResponse(res,500,`\u670D\u52A1\u5668\u5185\u90E8\u9519\u8BEF: ${errorMessage}`)}}}function validateFile(filename,res){return node_fs.existsSync(filename)?node_fs.statSync(filename).isFile()?!0:(sendErrorResponse(res,400,`'${filename}' \u4E0D\u662F\u6709\u6548\u6587\u4EF6`),!1):(sendErrorResponse(res,404,`\u6587\u4EF6 '${filename}' \u4E0D\u5B58\u5728`),!1)}function sendFileContent(res,filename){res.setHeader("Content-Type","application/javascript;charset=UTF-8"),res.end(node_fs.readFileSync(filename,"utf-8"))}function sendErrorResponse(res,code,message){res.statusCode=code,res.setHeader("Content-Type","text/plain;charset=UTF-8"),res.end(`[@open-editor/server] ${message}`)}function createApp(options){const{rootDir,onOpenEditor}=options,app=connect();return app.use(corsMiddleware({methods:"GET"})),app.use(shared.ServerApis.OPEN_EDITOR,openEditorMiddleware({rootDir,onOpenEditor})),app}var __async=(__this,__arguments,generator)=>new Promise((resolve,reject)=>{var fulfilled=value=>{try{step(generator.next(value))}catch(e){reject(e)}},rejected=value=>{try{step(generator.throw(value))}catch(e){reject(e)}},step=x=>x.done?resolve(x.value):Promise.resolve(x.value).then(fulfilled,rejected);step((generator=generator.apply(__this,__arguments)).next())});const MIN_PORT_NUMBER=3e3,MAX_PORT_NUMBER=9e3;function getAvailablePort(){return __async(this,arguments,function*({concurrency=5,retries=10}={}){for(let i=0;i<retries;i++){const promises=Array.from({length:concurrency},generatePort).map(port=>checkPortNumber(port).then(available=>available?port:null)),result=yield Promise.race([...promises,new Promise(resolve=>{setTimeout(()=>resolve(null),100)})]);if(result)return result}throw new Error(`\u7AEF\u53E3\u63A2\u6D4B\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5\u7CFB\u7EDF\u8D44\u6E90\u3002\u5C1D\u8BD5\u6B21\u6570\uFF1A${retries}`)})}function checkPortNumber(port){return new Promise(resolve=>{const server=net.createServer();server.unref(),server.on("error",()=>{resolve(!1)}),server.listen(port,()=>{server.close(()=>{resolve(!0)})})})}function generatePort(){return Math.floor(Math.random()*(MAX_PORT_NUMBER-MIN_PORT_NUMBER)+MIN_PORT_NUMBER)}function setupServer(options={}){const{rootDir,https:httpsConfig}=options,app=createApp({rootDir}),server=createHttpServer(app,httpsConfig);return startServer(server)}function createHttpServer(app,httpsConfig){if(!httpsConfig)return http.createServer(app);const sslOptions={key:node_fs.readFileSync(httpsConfig.key),cert:node_fs.readFileSync(httpsConfig.cert)};return https.createServer(sslOptions,app)}function startServer(server){return new Promise((resolve,reject)=>{getAvailablePort().then(port=>{server.listen(port).once("listening",()=>resolve(port)).once("error",reject)}).catch(reject)})}exports.openEditorMiddleware=openEditorMiddleware,exports.setupServer=setupServer; | ||
| "use strict";var e=require("node:http"),r=require("node:https"),t=require("node:fs"),n=require("connect"),o=require("cors"),i=require("@open-editor/shared"),s=require("node:path"),a=require("node:url"),c=require("launch-editor"),u=require("node:net");const DEFAULE_OPEN_DDITOR=(e,r)=>{c(e,(e,t)=>r(t))};function openEditorMiddleware(e={}){let{rootDir:r=process.cwd(),onOpenEditor:t=DEFAULE_OPEN_DDITOR}=e;return(e,n)=>{try{var o;let{query:i}=a.parse(null!=(o=e.url)?o:"/",!0),{f:c="unknown",l:u="1",c:l="1"}=i;if(!c)return void sendErrorResponse(n,400,"缺少文件路径参数");let d=s.resolve(r,decodeURIComponent(c));if(!validateFile(d,n))return;e.headers.referer&&t(`${d}:${u}:${l}`,e=>{throw Error(e||"可能原因有编辑器未启动/编辑器未响应")}),sendFileContent(n,d)}catch(r){let e=r instanceof Error?r.message:"未知错误";sendErrorResponse(n,500,`服务器内部错误: ${e}`)}}}function validateFile(e,r){return t.existsSync(e)?!!t.statSync(e).isFile()||(sendErrorResponse(r,400,`'${e}' 不是有效文件`),!1):(sendErrorResponse(r,404,`文件 '${e}' 不存在`),!1)}function sendFileContent(e,r){e.setHeader("Content-Type","application/javascript;charset=UTF-8"),e.end(t.readFileSync(r,"utf-8"))}function sendErrorResponse(e,r,t){e.statusCode=r,e.setHeader("Content-Type","text/plain;charset=UTF-8"),e.end(`[@open-editor/server] ${t}`)}function createApp(e){let{rootDir:r,onOpenEditor:t}=e,s=n();return s.use(o({methods:"GET"})),s.use(i.ServerApis.OPEN_EDITOR,openEditorMiddleware({rootDir:r,onOpenEditor:t})),s}function asyncGeneratorStep(e,r,t,n,o,i,s){try{var a=e[i](s),c=a.value}catch(e){t(e);return}a.done?r(c):Promise.resolve(c).then(n,o)}function _async_to_generator(e){return function(){var r=this,t=arguments;return new Promise(function(n,o){var i=e.apply(r,t);function _next(e){asyncGeneratorStep(i,n,o,_next,_throw,"next",e)}function _throw(e){asyncGeneratorStep(i,n,o,_next,_throw,"throw",e)}_next(void 0)})}}function getAvailablePort(){return _async_to_generator(function*({concurrency:e=5,retries:r=10}={}){for(let t=0;t<r;t++){let r=Array.from({length:e},generatePort).map(e=>checkPortNumber(e).then(r=>r?e:null)),t=yield Promise.race([...r,new Promise(e=>{setTimeout(()=>e(null),100)})]);if(t)return t}throw Error(`端口探测失败,请检查系统资源。尝试次数:${r}`)}).apply(this,arguments)}function checkPortNumber(e){return new Promise(r=>{let t=u.createServer();t.unref(),t.on("error",()=>{r(!1)}),t.listen(e,()=>{t.close(()=>{r(!0)})})})}function generatePort(){return Math.floor(6e3*Math.random()+3e3)}function setupServer(e={}){let{rootDir:r,https:t}=e;return startServer(createHttpServer(createApp({rootDir:r}),t))}function createHttpServer(n,o){if(!o)return e.createServer(n);let i={key:t.readFileSync(o.key),cert:t.readFileSync(o.cert)};return r.createServer(i,n)}function startServer(e){return new Promise((r,t)=>{getAvailablePort().then(n=>{e.listen(n).once("listening",()=>r(n)).once("error",t)}).catch(t)})}exports.openEditorMiddleware=openEditorMiddleware,exports.setupServer=setupServer; |
+1
-1
@@ -1,1 +0,1 @@ | ||
| import http from"node:http";import https from"node:https";import{existsSync,statSync,readFileSync}from"node:fs";import connect from"connect";import corsMiddleware from"cors";import{ServerApis}from"@open-editor/shared";import{resolve}from"node:path";import{parse}from"node:url";import openEditor from"launch-editor";import net from"node:net";const DEFAULE_OPEN_DDITOR=(file,errorCallback)=>{openEditor(file,(_,errorMessage)=>errorCallback(errorMessage))};function openEditorMiddleware(options={}){const{rootDir=process.cwd(),onOpenEditor=DEFAULE_OPEN_DDITOR}=options;return(req,res)=>{var _a;try{const{query}=parse((_a=req.url)!=null?_a:"/",!0),{f:file="unknown",l:line="1",c:column="1"}=query;if(!file){sendErrorResponse(res,400,"\u7F3A\u5C11\u6587\u4EF6\u8DEF\u5F84\u53C2\u6570");return}const filename=resolve(rootDir,decodeURIComponent(file));if(!validateFile(filename,res))return;req.headers.referer&&onOpenEditor(`${filename}:${line}:${column}`,errorMessage=>{throw new Error(errorMessage||"\u53EF\u80FD\u539F\u56E0\u6709\u7F16\u8F91\u5668\u672A\u542F\u52A8/\u7F16\u8F91\u5668\u672A\u54CD\u5E94")}),sendFileContent(res,filename)}catch(error){const errorMessage=error instanceof Error?error.message:"\u672A\u77E5\u9519\u8BEF";sendErrorResponse(res,500,`\u670D\u52A1\u5668\u5185\u90E8\u9519\u8BEF: ${errorMessage}`)}}}function validateFile(filename,res){return existsSync(filename)?statSync(filename).isFile()?!0:(sendErrorResponse(res,400,`'${filename}' \u4E0D\u662F\u6709\u6548\u6587\u4EF6`),!1):(sendErrorResponse(res,404,`\u6587\u4EF6 '${filename}' \u4E0D\u5B58\u5728`),!1)}function sendFileContent(res,filename){res.setHeader("Content-Type","application/javascript;charset=UTF-8"),res.end(readFileSync(filename,"utf-8"))}function sendErrorResponse(res,code,message){res.statusCode=code,res.setHeader("Content-Type","text/plain;charset=UTF-8"),res.end(`[@open-editor/server] ${message}`)}function createApp(options){const{rootDir,onOpenEditor}=options,app=connect();return app.use(corsMiddleware({methods:"GET"})),app.use(ServerApis.OPEN_EDITOR,openEditorMiddleware({rootDir,onOpenEditor})),app}var __async=(__this,__arguments,generator)=>new Promise((resolve2,reject)=>{var fulfilled=value=>{try{step(generator.next(value))}catch(e){reject(e)}},rejected=value=>{try{step(generator.throw(value))}catch(e){reject(e)}},step=x=>x.done?resolve2(x.value):Promise.resolve(x.value).then(fulfilled,rejected);step((generator=generator.apply(__this,__arguments)).next())});const MIN_PORT_NUMBER=3e3,MAX_PORT_NUMBER=9e3;function getAvailablePort(){return __async(this,arguments,function*({concurrency=5,retries=10}={}){for(let i=0;i<retries;i++){const promises=Array.from({length:concurrency},generatePort).map(port=>checkPortNumber(port).then(available=>available?port:null)),result=yield Promise.race([...promises,new Promise(resolve2=>{setTimeout(()=>resolve2(null),100)})]);if(result)return result}throw new Error(`\u7AEF\u53E3\u63A2\u6D4B\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5\u7CFB\u7EDF\u8D44\u6E90\u3002\u5C1D\u8BD5\u6B21\u6570\uFF1A${retries}`)})}function checkPortNumber(port){return new Promise(resolve2=>{const server=net.createServer();server.unref(),server.on("error",()=>{resolve2(!1)}),server.listen(port,()=>{server.close(()=>{resolve2(!0)})})})}function generatePort(){return Math.floor(Math.random()*(MAX_PORT_NUMBER-MIN_PORT_NUMBER)+MIN_PORT_NUMBER)}function setupServer(options={}){const{rootDir,https:httpsConfig}=options,app=createApp({rootDir}),server=createHttpServer(app,httpsConfig);return startServer(server)}function createHttpServer(app,httpsConfig){if(!httpsConfig)return http.createServer(app);const sslOptions={key:readFileSync(httpsConfig.key),cert:readFileSync(httpsConfig.cert)};return https.createServer(sslOptions,app)}function startServer(server){return new Promise((resolve2,reject)=>{getAvailablePort().then(port=>{server.listen(port).once("listening",()=>resolve2(port)).once("error",reject)}).catch(reject)})}export{openEditorMiddleware,setupServer}; | ||
| import e from"node:http";import r from"node:https";import{existsSync as t,statSync as n,readFileSync as o}from"node:fs";import i from"connect";import a from"cors";import{ServerApis as s}from"@open-editor/shared";import{resolve as c}from"node:path";import{parse as u}from"node:url";import p from"launch-editor";import l from"node:net";let DEFAULE_OPEN_DDITOR=(e,r)=>{p(e,(e,t)=>r(t))};function openEditorMiddleware(e={}){let{rootDir:r=process.cwd(),onOpenEditor:t=DEFAULE_OPEN_DDITOR}=e;return(e,n)=>{try{var o;let{query:i}=u(null!=(o=e.url)?o:"/",!0),{f:a="unknown",l:s="1",c:p="1"}=i;if(!a)return void sendErrorResponse(n,400,"缺少文件路径参数");let l=c(r,decodeURIComponent(a));if(!validateFile(l,n))return;e.headers.referer&&t(`${l}:${s}:${p}`,e=>{throw Error(e||"可能原因有编辑器未启动/编辑器未响应")}),sendFileContent(n,l)}catch(r){let e=r instanceof Error?r.message:"未知错误";sendErrorResponse(n,500,`服务器内部错误: ${e}`)}}}function validateFile(e,r){return t(e)?!!n(e).isFile()||(sendErrorResponse(r,400,`'${e}' 不是有效文件`),!1):(sendErrorResponse(r,404,`文件 '${e}' 不存在`),!1)}function sendFileContent(e,r){e.setHeader("Content-Type","application/javascript;charset=UTF-8"),e.end(o(r,"utf-8"))}function sendErrorResponse(e,r,t){e.statusCode=r,e.setHeader("Content-Type","text/plain;charset=UTF-8"),e.end(`[@open-editor/server] ${t}`)}function createApp(e){let{rootDir:r,onOpenEditor:t}=e,n=i();return n.use(a({methods:"GET"})),n.use(s.OPEN_EDITOR,openEditorMiddleware({rootDir:r,onOpenEditor:t})),n}function asyncGeneratorStep(e,r,t,n,o,i,a){try{var s=e[i](a),c=s.value}catch(e){t(e);return}s.done?r(c):Promise.resolve(c).then(n,o)}function _async_to_generator(e){return function(){var r=this,t=arguments;return new Promise(function(n,o){var i=e.apply(r,t);function _next(e){asyncGeneratorStep(i,n,o,_next,_throw,"next",e)}function _throw(e){asyncGeneratorStep(i,n,o,_next,_throw,"throw",e)}_next(void 0)})}}function getAvailablePort(){return _async_to_generator(function*({concurrency:e=5,retries:r=10}={}){for(let t=0;t<r;t++){let r=Array.from({length:e},generatePort).map(e=>checkPortNumber(e).then(r=>r?e:null)),t=yield Promise.race([...r,new Promise(e=>{setTimeout(()=>e(null),100)})]);if(t)return t}throw Error(`端口探测失败,请检查系统资源。尝试次数:${r}`)}).apply(this,arguments)}function checkPortNumber(e){return new Promise(r=>{let t=l.createServer();t.unref(),t.on("error",()=>{r(!1)}),t.listen(e,()=>{t.close(()=>{r(!0)})})})}function generatePort(){return Math.floor(6e3*Math.random()+3e3)}function setupServer(e={}){let{rootDir:r,https:t}=e;return startServer(createHttpServer(createApp({rootDir:r}),t))}function createHttpServer(t,n){if(!n)return e.createServer(t);let i={key:o(n.key),cert:o(n.cert)};return r.createServer(i,t)}function startServer(e){return new Promise((r,t)=>{getAvailablePort().then(n=>{e.listen(n).once("listening",()=>r(n)).once("error",t)}).catch(t)})}export{openEditorMiddleware,setupServer}; |
+4
-3
| { | ||
| "name": "@open-editor/server", | ||
| "version": "0.9.4", | ||
| "version": "1.0.0-beta.0", | ||
| "description": "internal utils shared across @open-editor packages", | ||
@@ -13,3 +13,4 @@ "main": "./dist/index.js", | ||
| "types": "./dist/index.d.ts" | ||
| } | ||
| }, | ||
| "./*": "./dist/*" | ||
| }, | ||
@@ -34,3 +35,3 @@ "files": [ | ||
| "launch-editor": "^2.6.0", | ||
| "@open-editor/shared": "0.9.4" | ||
| "@open-editor/shared": "1.0.0-beta.0" | ||
| }, | ||
@@ -37,0 +38,0 @@ "devDependencies": { |
AI-detected potential code anomaly
Supply chain riskAI has identified unusual behaviors that may pose a security risk.
Found 1 instance in 1 package
AI-detected potential code anomaly
Supply chain riskAI has identified unusual behaviors that may pose a security risk.
Found 1 instance in 1 package
11050
-14.78%129
-5.15%+ Added
- Removed