phecda-server 7.0.0-alpha.12 → 7.0.0-alpha.14
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/assets/schema.json +11 -2
- package/bin/cli.mjs +65 -9
- package/dist/rpc/electron/index.d.mts +13 -0
- package/dist/rpc/electron/index.d.ts +13 -0
- package/dist/rpc/electron/index.js +72 -0
- package/dist/rpc/electron/index.mjs +72 -0
- package/dist/rpc/ws/index.d.mts +14 -0
- package/dist/rpc/ws/index.d.ts +14 -0
- package/dist/rpc/ws/index.js +73 -0
- package/dist/rpc/ws/index.mjs +73 -0
- package/package.json +13 -2
- package/register/index.mjs +0 -1
- package/register/loader.mjs +15 -44
- package/register/utils.mjs +7 -7
- package/assets/ps.json +0 -24
- package/assets/tsconfig.json +0 -21
package/assets/schema.json
CHANGED
|
@@ -46,8 +46,17 @@
|
|
|
46
46
|
"description": "Virtual module, just like in Vite."
|
|
47
47
|
},
|
|
48
48
|
"unimport": {
|
|
49
|
-
"
|
|
50
|
-
|
|
49
|
+
"oneOf": [
|
|
50
|
+
{
|
|
51
|
+
"type": "object",
|
|
52
|
+
"description": "Includes the arguments passed to unimport"
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
"type": "boolean",
|
|
56
|
+
"enum": [false],
|
|
57
|
+
"description": "Disable unimport"
|
|
58
|
+
}
|
|
59
|
+
]
|
|
51
60
|
}
|
|
52
61
|
},
|
|
53
62
|
|
package/bin/cli.mjs
CHANGED
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
#! /usr/bin/env node
|
|
2
2
|
import { fork } from 'child_process'
|
|
3
3
|
import { createRequire } from 'module'
|
|
4
|
-
import { fileURLToPath } from 'url'
|
|
5
|
-
|
|
6
|
-
import { dirname, resolve } from 'path'
|
|
7
4
|
import pc from 'picocolors'
|
|
8
5
|
import cac from 'cac'
|
|
9
6
|
import fse from 'fs-extra'
|
|
@@ -20,8 +17,6 @@ const cli = cac('phecda').option('-c,--config <config>', 'config file', {
|
|
|
20
17
|
default: 'ps.json',
|
|
21
18
|
})
|
|
22
19
|
|
|
23
|
-
const __dirname = dirname(fileURLToPath(import.meta.url))
|
|
24
|
-
|
|
25
20
|
const require = createRequire(import.meta.url)
|
|
26
21
|
let child
|
|
27
22
|
|
|
@@ -36,7 +31,7 @@ if (nodeVersion < 18.19) {
|
|
|
36
31
|
}
|
|
37
32
|
|
|
38
33
|
function startChild(file, args) {
|
|
39
|
-
child = fork(file, {
|
|
34
|
+
child = globalThis.PS_CREATE_CHILD?.() || fork(file, {
|
|
40
35
|
env: { ...process.env },
|
|
41
36
|
stdio: 'inherit',
|
|
42
37
|
execArgv: [
|
|
@@ -87,22 +82,83 @@ cli
|
|
|
87
82
|
if (root)
|
|
88
83
|
process.chdir(root)
|
|
89
84
|
|
|
85
|
+
let hasUnimport
|
|
86
|
+
|
|
87
|
+
try {
|
|
88
|
+
await import('unimport')
|
|
89
|
+
hasUnimport = true
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
catch (e) {
|
|
93
|
+
hasUnimport = false
|
|
94
|
+
}
|
|
95
|
+
|
|
90
96
|
const tsconfigPath = options.tsconfig
|
|
91
97
|
const psconfigPath = process.env.PS_CONFIG_FILE || options.config
|
|
92
98
|
|
|
93
99
|
if (!fse.existsSync(tsconfigPath)) {
|
|
94
100
|
log(`create ${tsconfigPath}`)
|
|
95
101
|
|
|
96
|
-
await fse.
|
|
97
|
-
resolve(__dirname, '../assets/tsconfig.json'),
|
|
102
|
+
await fse.outputJSON(
|
|
98
103
|
tsconfigPath,
|
|
104
|
+
{
|
|
105
|
+
compilerOptions: {
|
|
106
|
+
target: 'esnext',
|
|
107
|
+
useDefineForClassFields: false,
|
|
108
|
+
experimentalDecorators: true,
|
|
109
|
+
emitDecoratorMetadata: true,
|
|
110
|
+
module: 'esnext',
|
|
111
|
+
lib: ['esnext', 'DOM'],
|
|
112
|
+
paths: {
|
|
113
|
+
|
|
114
|
+
},
|
|
115
|
+
strictPropertyInitialization: false,
|
|
116
|
+
moduleResolution: 'bundler',
|
|
117
|
+
strict: true,
|
|
118
|
+
resolveJsonModule: true,
|
|
119
|
+
esModuleInterop: true,
|
|
120
|
+
noEmit: true,
|
|
121
|
+
noUnusedLocals: true,
|
|
122
|
+
noUnusedParameters: true,
|
|
123
|
+
noImplicitReturns: true,
|
|
124
|
+
skipLibCheck: true,
|
|
125
|
+
},
|
|
126
|
+
include: ['.', hasUnimport ? (process.env.PS_DTS_PATH || 'ps.d.ts') : undefined],
|
|
127
|
+
},
|
|
128
|
+
|
|
99
129
|
)
|
|
100
130
|
}
|
|
101
131
|
|
|
102
132
|
if (!fse.existsSync(psconfigPath)) {
|
|
103
133
|
log(`create ${psconfigPath}`)
|
|
104
134
|
|
|
105
|
-
await fse.
|
|
135
|
+
await fse.outputJSON(psconfigPath, {
|
|
136
|
+
$schema: './node_modules/phecda-server/assets/schema.json',
|
|
137
|
+
resolve: [
|
|
138
|
+
{
|
|
139
|
+
source: 'controller',
|
|
140
|
+
importer: 'http',
|
|
141
|
+
path: '.ps/http.js',
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
source: 'rpc',
|
|
145
|
+
importer: 'client',
|
|
146
|
+
path: '.ps/rpc.js',
|
|
147
|
+
},
|
|
148
|
+
],
|
|
149
|
+
unimport: hasUnimport && {
|
|
150
|
+
dirs: [
|
|
151
|
+
'.',
|
|
152
|
+
],
|
|
153
|
+
dirsScanOptions: {
|
|
154
|
+
filePatterns: [
|
|
155
|
+
'*.{service,controller,module,rpc,solo,guard,extension,pipe,filter,addon}.ts',
|
|
156
|
+
],
|
|
157
|
+
},
|
|
158
|
+
},
|
|
159
|
+
virtualFile: {},
|
|
160
|
+
moduleFile: [],
|
|
161
|
+
})
|
|
106
162
|
}
|
|
107
163
|
|
|
108
164
|
log('init finish')
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import Electron from 'electron';
|
|
2
|
+
import { F as Factory } from '../../core-jUg1HvYT.mjs';
|
|
3
|
+
import { R as RpcCtx, a as RpcServerOptions } from '../../types-6qaaUIKZ.mjs';
|
|
4
|
+
import 'phecda-core';
|
|
5
|
+
import '../../meta-xvg6V7pH.mjs';
|
|
6
|
+
|
|
7
|
+
interface ElectronCtx extends RpcCtx {
|
|
8
|
+
type: 'electron';
|
|
9
|
+
event: Electron.IpcMainEvent | Electron.IpcMainInvokeEvent;
|
|
10
|
+
}
|
|
11
|
+
declare function bind(IPC: Electron.IpcMain, { moduleMap, meta }: Awaited<ReturnType<typeof Factory>>, opts?: RpcServerOptions): void;
|
|
12
|
+
|
|
13
|
+
export { type ElectronCtx, bind };
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import Electron from 'electron';
|
|
2
|
+
import { F as Factory } from '../../core-CDzIy2g0.js';
|
|
3
|
+
import { R as RpcCtx, a as RpcServerOptions } from '../../types-BtXOT5rI.js';
|
|
4
|
+
import 'phecda-core';
|
|
5
|
+
import '../../meta-xvg6V7pH.js';
|
|
6
|
+
|
|
7
|
+
interface ElectronCtx extends RpcCtx {
|
|
8
|
+
type: 'electron';
|
|
9
|
+
event: Electron.IpcMainEvent | Electron.IpcMainInvokeEvent;
|
|
10
|
+
}
|
|
11
|
+
declare function bind(IPC: Electron.IpcMain, { moduleMap, meta }: Awaited<ReturnType<typeof Factory>>, opts?: RpcServerOptions): void;
|
|
12
|
+
|
|
13
|
+
export { type ElectronCtx, bind };
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
var _chunkIJFIY6QNjs = require('../../chunk-IJFIY6QN.js');
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
var _chunk4LLLQOMFjs = require('../../chunk-4LLLQOMF.js');
|
|
9
|
+
|
|
10
|
+
// src/rpc/electron/bind.ts
|
|
11
|
+
var _debug = require('debug'); var _debug2 = _interopRequireDefault(_debug);
|
|
12
|
+
var debug = _debug2.default.call(void 0, "phecda-server/electron");
|
|
13
|
+
function bind(IPC, { moduleMap, meta }, opts = {}) {
|
|
14
|
+
const { globalGuards, globalFilter, globalPipe, globalAddons = [] } = opts;
|
|
15
|
+
const metaMap = _chunkIJFIY6QNjs.createControllerMetaMap.call(void 0, meta, (meta2) => {
|
|
16
|
+
const { controller, rpc, func, tag } = meta2.data;
|
|
17
|
+
if (controller === "rpc" && _optionalChain([rpc, 'optionalAccess', _ => _.queue]) !== void 0) {
|
|
18
|
+
debug(`register method "${func}" in module "${tag}"`);
|
|
19
|
+
return true;
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
_chunkIJFIY6QNjs.detectAopDep.call(void 0, meta, {
|
|
23
|
+
guards: globalGuards,
|
|
24
|
+
addons: globalAddons
|
|
25
|
+
}, "rpc");
|
|
26
|
+
IPC.handle("phecda-server:invoke", callback);
|
|
27
|
+
IPC.on("phecda-server:send", callback);
|
|
28
|
+
async function callback(event, data) {
|
|
29
|
+
const { func, id, tag, _ps, args } = data || {};
|
|
30
|
+
debug(`invoke method "${func}" in module "${tag}"`);
|
|
31
|
+
if (_ps !== 1) return;
|
|
32
|
+
const meta2 = metaMap.get(tag)[func];
|
|
33
|
+
const { data: { rpc: { isEvent } = {} } } = meta2;
|
|
34
|
+
const aop = _chunkIJFIY6QNjs.Context.getAop(meta2, {
|
|
35
|
+
globalFilter,
|
|
36
|
+
globalGuards,
|
|
37
|
+
globalPipe
|
|
38
|
+
});
|
|
39
|
+
const context = new (0, _chunkIJFIY6QNjs.Context)({
|
|
40
|
+
type: "electron",
|
|
41
|
+
category: "rpc",
|
|
42
|
+
moduleMap,
|
|
43
|
+
meta: meta2,
|
|
44
|
+
tag,
|
|
45
|
+
func,
|
|
46
|
+
args,
|
|
47
|
+
id,
|
|
48
|
+
isEvent,
|
|
49
|
+
queue: tag,
|
|
50
|
+
event
|
|
51
|
+
});
|
|
52
|
+
return await context.run(aop, (returnData) => {
|
|
53
|
+
if (!isEvent) return {
|
|
54
|
+
data: returnData,
|
|
55
|
+
id
|
|
56
|
+
};
|
|
57
|
+
}, (err) => {
|
|
58
|
+
if (!isEvent) {
|
|
59
|
+
return {
|
|
60
|
+
data: err,
|
|
61
|
+
error: true,
|
|
62
|
+
id
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
_chunk4LLLQOMFjs.__name.call(void 0, callback, "callback");
|
|
68
|
+
}
|
|
69
|
+
_chunk4LLLQOMFjs.__name.call(void 0, bind, "bind");
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
exports.bind = bind;
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Context,
|
|
3
|
+
createControllerMetaMap,
|
|
4
|
+
detectAopDep
|
|
5
|
+
} from "../../chunk-VX4BZEL7.mjs";
|
|
6
|
+
import {
|
|
7
|
+
__name
|
|
8
|
+
} from "../../chunk-NQ55PA2X.mjs";
|
|
9
|
+
|
|
10
|
+
// src/rpc/electron/bind.ts
|
|
11
|
+
import Debug from "debug";
|
|
12
|
+
var debug = Debug("phecda-server/electron");
|
|
13
|
+
function bind(IPC, { moduleMap, meta }, opts = {}) {
|
|
14
|
+
const { globalGuards, globalFilter, globalPipe, globalAddons = [] } = opts;
|
|
15
|
+
const metaMap = createControllerMetaMap(meta, (meta2) => {
|
|
16
|
+
const { controller, rpc, func, tag } = meta2.data;
|
|
17
|
+
if (controller === "rpc" && rpc?.queue !== void 0) {
|
|
18
|
+
debug(`register method "${func}" in module "${tag}"`);
|
|
19
|
+
return true;
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
detectAopDep(meta, {
|
|
23
|
+
guards: globalGuards,
|
|
24
|
+
addons: globalAddons
|
|
25
|
+
}, "rpc");
|
|
26
|
+
IPC.handle("phecda-server:invoke", callback);
|
|
27
|
+
IPC.on("phecda-server:send", callback);
|
|
28
|
+
async function callback(event, data) {
|
|
29
|
+
const { func, id, tag, _ps, args } = data || {};
|
|
30
|
+
debug(`invoke method "${func}" in module "${tag}"`);
|
|
31
|
+
if (_ps !== 1) return;
|
|
32
|
+
const meta2 = metaMap.get(tag)[func];
|
|
33
|
+
const { data: { rpc: { isEvent } = {} } } = meta2;
|
|
34
|
+
const aop = Context.getAop(meta2, {
|
|
35
|
+
globalFilter,
|
|
36
|
+
globalGuards,
|
|
37
|
+
globalPipe
|
|
38
|
+
});
|
|
39
|
+
const context = new Context({
|
|
40
|
+
type: "electron",
|
|
41
|
+
category: "rpc",
|
|
42
|
+
moduleMap,
|
|
43
|
+
meta: meta2,
|
|
44
|
+
tag,
|
|
45
|
+
func,
|
|
46
|
+
args,
|
|
47
|
+
id,
|
|
48
|
+
isEvent,
|
|
49
|
+
queue: tag,
|
|
50
|
+
event
|
|
51
|
+
});
|
|
52
|
+
return await context.run(aop, (returnData) => {
|
|
53
|
+
if (!isEvent) return {
|
|
54
|
+
data: returnData,
|
|
55
|
+
id
|
|
56
|
+
};
|
|
57
|
+
}, (err) => {
|
|
58
|
+
if (!isEvent) {
|
|
59
|
+
return {
|
|
60
|
+
data: err,
|
|
61
|
+
error: true,
|
|
62
|
+
id
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
__name(callback, "callback");
|
|
68
|
+
}
|
|
69
|
+
__name(bind, "bind");
|
|
70
|
+
export {
|
|
71
|
+
bind
|
|
72
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import WS from 'ws';
|
|
2
|
+
import { F as Factory } from '../../core-jUg1HvYT.mjs';
|
|
3
|
+
import { R as RpcCtx, a as RpcServerOptions } from '../../types-6qaaUIKZ.mjs';
|
|
4
|
+
import 'phecda-core';
|
|
5
|
+
import '../../meta-xvg6V7pH.mjs';
|
|
6
|
+
|
|
7
|
+
interface WsCtx extends RpcCtx {
|
|
8
|
+
type: 'ws';
|
|
9
|
+
ws: WS;
|
|
10
|
+
wss: WS.Server;
|
|
11
|
+
}
|
|
12
|
+
declare function bind(wss: WS.Server, data: Awaited<ReturnType<typeof Factory>>, opts?: RpcServerOptions): void;
|
|
13
|
+
|
|
14
|
+
export { type WsCtx, bind };
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import WS from 'ws';
|
|
2
|
+
import { F as Factory } from '../../core-CDzIy2g0.js';
|
|
3
|
+
import { R as RpcCtx, a as RpcServerOptions } from '../../types-BtXOT5rI.js';
|
|
4
|
+
import 'phecda-core';
|
|
5
|
+
import '../../meta-xvg6V7pH.js';
|
|
6
|
+
|
|
7
|
+
interface WsCtx extends RpcCtx {
|
|
8
|
+
type: 'ws';
|
|
9
|
+
ws: WS;
|
|
10
|
+
wss: WS.Server;
|
|
11
|
+
}
|
|
12
|
+
declare function bind(wss: WS.Server, data: Awaited<ReturnType<typeof Factory>>, opts?: RpcServerOptions): void;
|
|
13
|
+
|
|
14
|
+
export { type WsCtx, bind };
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
var _chunkIJFIY6QNjs = require('../../chunk-IJFIY6QN.js');
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
var _chunk4LLLQOMFjs = require('../../chunk-4LLLQOMF.js');
|
|
9
|
+
|
|
10
|
+
// src/rpc/ws/bind.ts
|
|
11
|
+
var _debug = require('debug'); var _debug2 = _interopRequireDefault(_debug);
|
|
12
|
+
var debug = _debug2.default.call(void 0, "phecda-server/ws");
|
|
13
|
+
function bind(wss, data, opts = {}) {
|
|
14
|
+
const { globalGuards, globalAddons, globalFilter, globalPipe } = opts;
|
|
15
|
+
const { moduleMap, meta } = data;
|
|
16
|
+
const metaMap = _chunkIJFIY6QNjs.createControllerMetaMap.call(void 0, meta, (meta2) => {
|
|
17
|
+
const { controller, rpc, func, tag } = meta2.data;
|
|
18
|
+
if (controller === "rpc" && _optionalChain([rpc, 'optionalAccess', _ => _.queue]) !== void 0) {
|
|
19
|
+
debug(`register method "${func}" in module "${tag}"`);
|
|
20
|
+
return true;
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
_chunkIJFIY6QNjs.detectAopDep.call(void 0, meta, {
|
|
24
|
+
guards: globalGuards,
|
|
25
|
+
addons: globalAddons
|
|
26
|
+
}, "rpc");
|
|
27
|
+
wss.on("connection", (ws) => {
|
|
28
|
+
ws.on("message", async (raw) => {
|
|
29
|
+
try {
|
|
30
|
+
const data2 = JSON.parse(raw.toString());
|
|
31
|
+
const { func, id, tag, _ps, args, queue } = data2;
|
|
32
|
+
if (_ps !== 1) return;
|
|
33
|
+
const meta2 = metaMap.get(tag)[func];
|
|
34
|
+
const { data: { rpc: { isEvent } = {} } } = meta2;
|
|
35
|
+
const aop = _chunkIJFIY6QNjs.Context.getAop(meta2, {
|
|
36
|
+
globalFilter,
|
|
37
|
+
globalGuards,
|
|
38
|
+
globalPipe
|
|
39
|
+
});
|
|
40
|
+
const context = new (0, _chunkIJFIY6QNjs.Context)({
|
|
41
|
+
type: "ws",
|
|
42
|
+
category: "rpc",
|
|
43
|
+
meta: meta2,
|
|
44
|
+
moduleMap,
|
|
45
|
+
tag,
|
|
46
|
+
func,
|
|
47
|
+
args,
|
|
48
|
+
id,
|
|
49
|
+
queue,
|
|
50
|
+
wss,
|
|
51
|
+
ws
|
|
52
|
+
});
|
|
53
|
+
return await context.run(aop, (returnData) => {
|
|
54
|
+
if (!isEvent) ws.send(JSON.stringify({
|
|
55
|
+
id,
|
|
56
|
+
data: returnData
|
|
57
|
+
}));
|
|
58
|
+
}, (err) => {
|
|
59
|
+
if (!isEvent) ws.send(JSON.stringify({
|
|
60
|
+
id,
|
|
61
|
+
data: err,
|
|
62
|
+
error: true
|
|
63
|
+
}));
|
|
64
|
+
});
|
|
65
|
+
} catch (e) {
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
_chunk4LLLQOMFjs.__name.call(void 0, bind, "bind");
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
exports.bind = bind;
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Context,
|
|
3
|
+
createControllerMetaMap,
|
|
4
|
+
detectAopDep
|
|
5
|
+
} from "../../chunk-VX4BZEL7.mjs";
|
|
6
|
+
import {
|
|
7
|
+
__name
|
|
8
|
+
} from "../../chunk-NQ55PA2X.mjs";
|
|
9
|
+
|
|
10
|
+
// src/rpc/ws/bind.ts
|
|
11
|
+
import Debug from "debug";
|
|
12
|
+
var debug = Debug("phecda-server/ws");
|
|
13
|
+
function bind(wss, data, opts = {}) {
|
|
14
|
+
const { globalGuards, globalAddons, globalFilter, globalPipe } = opts;
|
|
15
|
+
const { moduleMap, meta } = data;
|
|
16
|
+
const metaMap = createControllerMetaMap(meta, (meta2) => {
|
|
17
|
+
const { controller, rpc, func, tag } = meta2.data;
|
|
18
|
+
if (controller === "rpc" && rpc?.queue !== void 0) {
|
|
19
|
+
debug(`register method "${func}" in module "${tag}"`);
|
|
20
|
+
return true;
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
detectAopDep(meta, {
|
|
24
|
+
guards: globalGuards,
|
|
25
|
+
addons: globalAddons
|
|
26
|
+
}, "rpc");
|
|
27
|
+
wss.on("connection", (ws) => {
|
|
28
|
+
ws.on("message", async (raw) => {
|
|
29
|
+
try {
|
|
30
|
+
const data2 = JSON.parse(raw.toString());
|
|
31
|
+
const { func, id, tag, _ps, args, queue } = data2;
|
|
32
|
+
if (_ps !== 1) return;
|
|
33
|
+
const meta2 = metaMap.get(tag)[func];
|
|
34
|
+
const { data: { rpc: { isEvent } = {} } } = meta2;
|
|
35
|
+
const aop = Context.getAop(meta2, {
|
|
36
|
+
globalFilter,
|
|
37
|
+
globalGuards,
|
|
38
|
+
globalPipe
|
|
39
|
+
});
|
|
40
|
+
const context = new Context({
|
|
41
|
+
type: "ws",
|
|
42
|
+
category: "rpc",
|
|
43
|
+
meta: meta2,
|
|
44
|
+
moduleMap,
|
|
45
|
+
tag,
|
|
46
|
+
func,
|
|
47
|
+
args,
|
|
48
|
+
id,
|
|
49
|
+
queue,
|
|
50
|
+
wss,
|
|
51
|
+
ws
|
|
52
|
+
});
|
|
53
|
+
return await context.run(aop, (returnData) => {
|
|
54
|
+
if (!isEvent) ws.send(JSON.stringify({
|
|
55
|
+
id,
|
|
56
|
+
data: returnData
|
|
57
|
+
}));
|
|
58
|
+
}, (err) => {
|
|
59
|
+
if (!isEvent) ws.send(JSON.stringify({
|
|
60
|
+
id,
|
|
61
|
+
data: err,
|
|
62
|
+
error: true
|
|
63
|
+
}));
|
|
64
|
+
});
|
|
65
|
+
} catch (e) {
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
__name(bind, "bind");
|
|
71
|
+
export {
|
|
72
|
+
bind
|
|
73
|
+
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "phecda-server",
|
|
3
|
-
"version": "7.0.0-alpha.
|
|
3
|
+
"version": "7.0.0-alpha.14",
|
|
4
4
|
"description": "server framework that provide IOC/type-reuse/http&rpc-adaptor",
|
|
5
5
|
"author": "fgsreally",
|
|
6
6
|
"license": "MIT",
|
|
@@ -74,6 +74,14 @@
|
|
|
74
74
|
"require": "./dist/rpc/nats/index.js",
|
|
75
75
|
"import": "./dist/rpc/nats/index.mjs"
|
|
76
76
|
},
|
|
77
|
+
"./electron": {
|
|
78
|
+
"require": "./dist/rpc/electron/index.js",
|
|
79
|
+
"import": "./dist/rpc/electron/index.mjs"
|
|
80
|
+
},
|
|
81
|
+
"./ws": {
|
|
82
|
+
"require": "./dist/rpc/ws/index.js",
|
|
83
|
+
"import": "./dist/rpc/ws/index.mjs"
|
|
84
|
+
},
|
|
77
85
|
"./register": "./register/index.mjs",
|
|
78
86
|
"./*": "./*"
|
|
79
87
|
},
|
|
@@ -160,8 +168,10 @@
|
|
|
160
168
|
"@types/koa": "^2.13.12",
|
|
161
169
|
"@types/koa__router": "^12.0.4",
|
|
162
170
|
"@types/supertest": "^2.0.12",
|
|
171
|
+
"@types/ws": "^8.5.13",
|
|
163
172
|
"amqplib": "^0.10.3",
|
|
164
173
|
"bullmq": "^5.7.1",
|
|
174
|
+
"electron": "^33.2.1",
|
|
165
175
|
"elysia": "^1.0.17",
|
|
166
176
|
"express": "^4.18.2",
|
|
167
177
|
"fastify": "^4.25.1",
|
|
@@ -178,7 +188,8 @@
|
|
|
178
188
|
"supertest": "^6.3.3",
|
|
179
189
|
"tsup": "^8.1.0",
|
|
180
190
|
"typescript": "^5.7.2",
|
|
181
|
-
"unimport": "^3.7.1"
|
|
191
|
+
"unimport": "^3.7.1",
|
|
192
|
+
"ws": "^8.18.0"
|
|
182
193
|
},
|
|
183
194
|
"scripts": {
|
|
184
195
|
"dev": "tsup --watch",
|
package/register/index.mjs
CHANGED
package/register/loader.mjs
CHANGED
|
@@ -7,7 +7,6 @@ import {
|
|
|
7
7
|
relative,
|
|
8
8
|
resolve as resolvePath,
|
|
9
9
|
} from 'path'
|
|
10
|
-
import { existsSync } from 'fs'
|
|
11
10
|
import { createRequire } from 'module'
|
|
12
11
|
import ts from 'typescript'
|
|
13
12
|
import chokidar from 'chokidar'
|
|
@@ -32,7 +31,6 @@ let unimportRet
|
|
|
32
31
|
const dtsPath = process.env.PS_DTS_PATH || 'ps.d.ts'
|
|
33
32
|
|
|
34
33
|
// graph
|
|
35
|
-
let entryUrl
|
|
36
34
|
const watchFiles = new Set()
|
|
37
35
|
const filesRecord = new Map()
|
|
38
36
|
const moduleGraph = {}
|
|
@@ -53,6 +51,7 @@ if (!tsRet.error) {
|
|
|
53
51
|
if (!error)
|
|
54
52
|
tsconfig = options
|
|
55
53
|
}
|
|
54
|
+
|
|
56
55
|
const moduleResolutionCache = ts.createModuleResolutionCache(
|
|
57
56
|
ts.sys.getCurrentDirectory(),
|
|
58
57
|
x => x,
|
|
@@ -137,9 +136,12 @@ function addUrlToGraph(url, parent) {
|
|
|
137
136
|
function getFileMid(file) {
|
|
138
137
|
const filename = basename(file)
|
|
139
138
|
const ret = filename.split('.')
|
|
140
|
-
if (ret.
|
|
141
|
-
return
|
|
142
|
-
|
|
139
|
+
if (!['js', 'mjs', 'cjs', 'ts', 'tsx', 'mts', 'cts'].includes(ret.pop()))
|
|
140
|
+
return ''
|
|
141
|
+
if (!ret[0])// .dockerfile
|
|
142
|
+
return ''
|
|
143
|
+
|
|
144
|
+
return ret[1]
|
|
143
145
|
}
|
|
144
146
|
|
|
145
147
|
export const resolve = async (specifier, context, nextResolve) => {
|
|
@@ -151,49 +153,17 @@ export const resolve = async (specifier, context, nextResolve) => {
|
|
|
151
153
|
shortCircuit: true,
|
|
152
154
|
}
|
|
153
155
|
}
|
|
154
|
-
//
|
|
155
|
-
|
|
156
|
-
if (/^file:\/\/\//.test(specifier) && existsSync(fileURLToPath(specifier))) {
|
|
157
|
-
entryUrl = specifier
|
|
156
|
+
// if (isAbsolute(specifier))
|
|
157
|
+
// specifier = pathToFileURL(specifier).href
|
|
158
158
|
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
: undefined,
|
|
163
|
-
url: specifier,
|
|
164
|
-
shortCircuit: true,
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
else {
|
|
168
|
-
// won't resolve virtual file as entry in vite
|
|
169
|
-
return nextResolve(specifier)
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
// url import
|
|
173
|
-
// it seems useless
|
|
174
|
-
// if (/^file:\/\/\//.test(specifier) && extname(specifier) === '.ts') {
|
|
175
|
-
// const url = addUrlToGraph(specifier, context.parentURL.split('?')[0])
|
|
176
|
-
// return {
|
|
177
|
-
// format: 'ts',
|
|
178
|
-
// url,
|
|
179
|
-
// shortCircuit: true,
|
|
180
|
-
// }
|
|
181
|
-
// }
|
|
182
|
-
|
|
183
|
-
// hmr import
|
|
184
|
-
if (
|
|
185
|
-
context.parentURL.includes('/node_modules/phecda-server')
|
|
186
|
-
&& isAbsolute(specifier)
|
|
187
|
-
) {
|
|
188
|
-
specifier = relative(fileURLToPath(entryUrl), specifier)
|
|
189
|
-
.replace(/\.ts$/, '')
|
|
190
|
-
.slice(1)
|
|
191
|
-
context.parentURL = entryUrl
|
|
192
|
-
}
|
|
159
|
+
// entrypoint
|
|
160
|
+
if (!context.parentURL)
|
|
161
|
+
return nextResolve(specifier)
|
|
193
162
|
|
|
194
163
|
// import/require from external library
|
|
195
|
-
if (context.parentURL.includes('/node_modules/'))
|
|
164
|
+
if (context.parentURL.includes('/node_modules/') && !context.parentURL.includes('phecda-server/register/index.mjs'))
|
|
196
165
|
return nextResolve(specifier)
|
|
166
|
+
|
|
197
167
|
const { resolvedModule } = ts.resolveModuleName(
|
|
198
168
|
specifier,
|
|
199
169
|
fileURLToPath(context.parentURL),
|
|
@@ -261,6 +231,7 @@ export const load = async (url, context, nextLoad) => {
|
|
|
261
231
|
}
|
|
262
232
|
|
|
263
233
|
url = url.split('?')[0]
|
|
234
|
+
|
|
264
235
|
if (
|
|
265
236
|
!url.includes('/node_modules/')
|
|
266
237
|
&& url.startsWith('file://')
|
package/register/utils.mjs
CHANGED
|
@@ -24,28 +24,28 @@ export async function compile(sourcecode, filename) {
|
|
|
24
24
|
|
|
25
25
|
jsc: {
|
|
26
26
|
parser: {
|
|
27
|
-
syntax:
|
|
27
|
+
syntax: 'typescript',
|
|
28
28
|
importAttributes: true,
|
|
29
29
|
decorators: true,
|
|
30
30
|
tsx: false,
|
|
31
31
|
dynamicImport: true,
|
|
32
|
-
strictPropertyInitialization: false
|
|
32
|
+
strictPropertyInitialization: false,
|
|
33
33
|
},
|
|
34
34
|
experimental: {
|
|
35
|
-
keepImportAssertions: true
|
|
35
|
+
keepImportAssertions: true,
|
|
36
36
|
},
|
|
37
37
|
transform: {
|
|
38
38
|
legacyDecorator: true,
|
|
39
|
-
decoratorMetadata: true
|
|
40
|
-
}
|
|
39
|
+
decoratorMetadata: true,
|
|
40
|
+
},
|
|
41
41
|
// parser: {
|
|
42
42
|
// importAttributes: true
|
|
43
43
|
// },
|
|
44
44
|
// experimental: {
|
|
45
45
|
// keepImportAssertions: true
|
|
46
46
|
// }
|
|
47
|
-
}
|
|
48
|
-
}
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
49
|
})
|
|
50
50
|
|
|
51
51
|
return injectInlineSourceMap({ code, map })
|
package/assets/ps.json
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "https://unpkg.com/phecda-server/assets/schema.json",
|
|
3
|
-
"resolve": [
|
|
4
|
-
{
|
|
5
|
-
"source": "controller",
|
|
6
|
-
"importer": "http",
|
|
7
|
-
"path": ".ps/http.js"
|
|
8
|
-
},
|
|
9
|
-
{
|
|
10
|
-
"source": "rpc",
|
|
11
|
-
"importer": "client",
|
|
12
|
-
"path": ".ps/rpc.js"
|
|
13
|
-
}
|
|
14
|
-
],
|
|
15
|
-
"unimport": {
|
|
16
|
-
"dirs": ["."],
|
|
17
|
-
"dirsScanOptions": {
|
|
18
|
-
"filePatterns": ["*.{service,controller,module,rpc,solo,guard,extension,pipe,filter,addon}.ts"]
|
|
19
|
-
}
|
|
20
|
-
},
|
|
21
|
-
"virtualFile": {},
|
|
22
|
-
"moduleFile": []
|
|
23
|
-
|
|
24
|
-
}
|
package/assets/tsconfig.json
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"compilerOptions": {
|
|
3
|
-
"target": "esnext",
|
|
4
|
-
"useDefineForClassFields": false,
|
|
5
|
-
"experimentalDecorators": true,
|
|
6
|
-
"emitDecoratorMetadata": true,
|
|
7
|
-
"module": "esnext",
|
|
8
|
-
"lib": ["esnext", "DOM"],
|
|
9
|
-
"strictPropertyInitialization": false,
|
|
10
|
-
"moduleResolution": "Node",
|
|
11
|
-
"strict": true,
|
|
12
|
-
"resolveJsonModule": true,
|
|
13
|
-
"esModuleInterop": true,
|
|
14
|
-
"noEmit": true,
|
|
15
|
-
"noUnusedLocals": true,
|
|
16
|
-
"noUnusedParameters": true,
|
|
17
|
-
"noImplicitReturns": true,
|
|
18
|
-
"skipLibCheck": true
|
|
19
|
-
},
|
|
20
|
-
"include": [".","./ps.d.ts"]
|
|
21
|
-
}
|