@innet/server 2.0.0-alpha.6 → 2.0.0-alpha.8
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 +93 -22
- package/hooks/index.d.ts +2 -0
- package/hooks/index.es6.js +2 -0
- package/hooks/index.js +2 -0
- package/hooks/useClientIp/index.d.ts +1 -0
- package/hooks/useClientIp/index.es6.js +1 -0
- package/hooks/useClientIp/index.js +9 -0
- package/hooks/useClientIp/useClientIp.d.ts +1 -0
- package/hooks/useClientIp/useClientIp.es6.js +15 -0
- package/hooks/useClientIp/useClientIp.js +19 -0
- package/hooks/useRequestPlugin/index.d.ts +1 -0
- package/hooks/useRequestPlugin/index.es6.js +1 -0
- package/hooks/useRequestPlugin/index.js +9 -0
- package/hooks/useRequestPlugin/useRequestPlugin.d.ts +2 -0
- package/hooks/useRequestPlugin/useRequestPlugin.es6.js +13 -0
- package/hooks/useRequestPlugin/useRequestPlugin.js +17 -0
- package/index.es6.js +2 -0
- package/index.js +4 -0
- package/package.json +2 -1
- package/plugins/main/api/api.es6.js +4 -4
- package/plugins/main/api/api.js +4 -4
- package/plugins/utils/swagger/swagger.es6.js +3 -7
- package/plugins/utils/swagger/swagger.js +3 -7
package/README.md
CHANGED
|
@@ -3317,7 +3317,7 @@ Hook functions give you all features to control parent element functionality.
|
|
|
3317
3317
|
|
|
3318
3318
|
[← back](#index)
|
|
3319
3319
|
|
|
3320
|
-
|
|
3320
|
+
Real-time
|
|
3321
3321
|
[useRequest](#userequest)
|
|
3322
3322
|
[useResponse](#useresponse)
|
|
3323
3323
|
[useHeaders](#useheaders)
|
|
@@ -3326,30 +3326,16 @@ Hook functions give you all features to control parent element functionality.
|
|
|
3326
3326
|
[useParams](#useparams)
|
|
3327
3327
|
[useSearch](#usesearch)
|
|
3328
3328
|
[useBody](#usebody)
|
|
3329
|
-
[
|
|
3330
|
-
|
|
3331
|
-
---
|
|
3332
|
-
|
|
3333
|
-
### useServer
|
|
3334
|
-
|
|
3335
|
-
[← back](#hooks)
|
|
3336
|
-
|
|
3337
|
-
This hook MUST be used in a component placed in `<server>`.
|
|
3338
|
-
This hook returns current http(s) server instance.
|
|
3339
|
-
|
|
3340
|
-
*src/Component.tsx*
|
|
3329
|
+
[useClientIp](#useclientip)
|
|
3341
3330
|
|
|
3342
|
-
|
|
3343
|
-
|
|
3344
|
-
|
|
3345
|
-
export function Component () {
|
|
3346
|
-
const server = useServer()
|
|
3331
|
+
Server start
|
|
3332
|
+
[useRequestPlugin](#userequestplugin)
|
|
3347
3333
|
|
|
3348
|
-
|
|
3334
|
+
Both
|
|
3335
|
+
[useServer](#useserver)
|
|
3336
|
+
[useComponentName](#usecomponentname)
|
|
3349
3337
|
|
|
3350
|
-
|
|
3351
|
-
}
|
|
3352
|
-
```
|
|
3338
|
+
---
|
|
3353
3339
|
|
|
3354
3340
|
### useRequest
|
|
3355
3341
|
|
|
@@ -3504,6 +3490,91 @@ export function Component () {
|
|
|
3504
3490
|
}
|
|
3505
3491
|
```
|
|
3506
3492
|
|
|
3493
|
+
### useClientIp
|
|
3494
|
+
|
|
3495
|
+
[← back](#hooks)
|
|
3496
|
+
|
|
3497
|
+
This hook returns request user IP.
|
|
3498
|
+
This hook MUST be used in a component placed in [\<request>](#request) or [\<fallback>](#fallback).
|
|
3499
|
+
|
|
3500
|
+
*src/Component.tsx*
|
|
3501
|
+
```typescript jsx
|
|
3502
|
+
import { useClientIp } from '@innet/sever'
|
|
3503
|
+
|
|
3504
|
+
export function Component () {
|
|
3505
|
+
const ip = useClientIp()
|
|
3506
|
+
|
|
3507
|
+
return <success>{{ ip }}</success>
|
|
3508
|
+
}
|
|
3509
|
+
```
|
|
3510
|
+
|
|
3511
|
+
### useRequestPlugin
|
|
3512
|
+
|
|
3513
|
+
[← back](#hooks)
|
|
3514
|
+
|
|
3515
|
+
This hook adds a request plugin function.
|
|
3516
|
+
The function runs before check endpoints.
|
|
3517
|
+
If the function returns `true` the request handling stops, and you get full control over the request.
|
|
3518
|
+
|
|
3519
|
+
This hook MUST be used in a component placed in [\<api>](#api).
|
|
3520
|
+
|
|
3521
|
+
*src/SecretEndpoint.tsx*
|
|
3522
|
+
```typescript jsx
|
|
3523
|
+
import { useRequestPlugin } from '@innet/sever'
|
|
3524
|
+
|
|
3525
|
+
export function SecretEndpoint () {
|
|
3526
|
+
useRequestPlugin((req, res) => {
|
|
3527
|
+
if (req.url.startsWith('/secret-endpoint')) {
|
|
3528
|
+
res.statusCode = 200
|
|
3529
|
+
res.write('A secret message')
|
|
3530
|
+
res.end()
|
|
3531
|
+
return true
|
|
3532
|
+
}
|
|
3533
|
+
})
|
|
3534
|
+
}
|
|
3535
|
+
```
|
|
3536
|
+
|
|
3537
|
+
Then use the plugin in [\<api>](#api).
|
|
3538
|
+
|
|
3539
|
+
*src/app.tsx*
|
|
3540
|
+
```typescript jsx
|
|
3541
|
+
import { SecretEndpoint } from './SecretEndpoint'
|
|
3542
|
+
|
|
3543
|
+
export default (
|
|
3544
|
+
<server>
|
|
3545
|
+
<api>
|
|
3546
|
+
<fallback>
|
|
3547
|
+
<error />
|
|
3548
|
+
</fallback>
|
|
3549
|
+
<SecretEndpoint />
|
|
3550
|
+
</api>
|
|
3551
|
+
</server>
|
|
3552
|
+
)
|
|
3553
|
+
```
|
|
3554
|
+
|
|
3555
|
+
Any endpoint returns an error except for `/secret-endpoint`.
|
|
3556
|
+
Elements order does not matter.
|
|
3557
|
+
|
|
3558
|
+
### useServer
|
|
3559
|
+
|
|
3560
|
+
[← back](#hooks)
|
|
3561
|
+
|
|
3562
|
+
This hook MUST be used in a component placed in [\<server>](#server).
|
|
3563
|
+
This hook returns current http(s) server instance.
|
|
3564
|
+
|
|
3565
|
+
*src/Component.tsx*
|
|
3566
|
+
```typescript jsx
|
|
3567
|
+
import { useServer } from '@innet/sever'
|
|
3568
|
+
|
|
3569
|
+
export function Component () {
|
|
3570
|
+
const server = useServer()
|
|
3571
|
+
|
|
3572
|
+
console.log(server)
|
|
3573
|
+
|
|
3574
|
+
return <success />
|
|
3575
|
+
}
|
|
3576
|
+
```
|
|
3577
|
+
|
|
3507
3578
|
### useComponentName
|
|
3508
3579
|
|
|
3509
3580
|
[← back](#hooks)
|
package/hooks/index.d.ts
CHANGED
package/hooks/index.es6.js
CHANGED
package/hooks/index.js
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './useClientIp';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { useClientIp } from './useClientIp.es6.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function useClientIp(): string | null;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { getClientIp } from 'request-ip';
|
|
2
|
+
import '../useRequest/index.es6.js';
|
|
3
|
+
import '../useThrow/index.es6.js';
|
|
4
|
+
import { useRequest } from '../useRequest/useRequest.es6.js';
|
|
5
|
+
import { useThrow } from '../useThrow/useThrow.es6.js';
|
|
6
|
+
|
|
7
|
+
function useClientIp() {
|
|
8
|
+
const req = useRequest();
|
|
9
|
+
if (!req) {
|
|
10
|
+
useThrow('<{type}> MUST be in <request> or <fallback>');
|
|
11
|
+
}
|
|
12
|
+
return getClientIp(req);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export { useClientIp };
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var requestIp = require('request-ip');
|
|
6
|
+
require('../useRequest/index.js');
|
|
7
|
+
require('../useThrow/index.js');
|
|
8
|
+
var useRequest = require('../useRequest/useRequest.js');
|
|
9
|
+
var useThrow = require('../useThrow/useThrow.js');
|
|
10
|
+
|
|
11
|
+
function useClientIp() {
|
|
12
|
+
const req = useRequest.useRequest();
|
|
13
|
+
if (!req) {
|
|
14
|
+
useThrow.useThrow('<{type}> MUST be in <request> or <fallback>');
|
|
15
|
+
}
|
|
16
|
+
return requestIp.getClientIp(req);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
exports.useClientIp = useClientIp;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './useRequestPlugin';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { useRequestPlugin } from './useRequestPlugin.es6.js';
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { onDestroy } from 'watch-state';
|
|
2
|
+
import '../useApi/index.es6.js';
|
|
3
|
+
import { useApi } from '../useApi/useApi.es6.js';
|
|
4
|
+
|
|
5
|
+
function useRequestPlugin(listener) {
|
|
6
|
+
const { requestPlugins } = useApi();
|
|
7
|
+
requestPlugins.add(listener);
|
|
8
|
+
onDestroy(() => {
|
|
9
|
+
requestPlugins.delete(listener);
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export { useRequestPlugin };
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var watchState = require('watch-state');
|
|
6
|
+
require('../useApi/index.js');
|
|
7
|
+
var useApi = require('../useApi/useApi.js');
|
|
8
|
+
|
|
9
|
+
function useRequestPlugin(listener) {
|
|
10
|
+
const { requestPlugins } = useApi.useApi();
|
|
11
|
+
requestPlugins.add(listener);
|
|
12
|
+
watchState.onDestroy(() => {
|
|
13
|
+
requestPlugins.delete(listener);
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
exports.useRequestPlugin = useRequestPlugin;
|
package/index.es6.js
CHANGED
|
@@ -107,3 +107,5 @@ export { ruleContext, useRule, useSetRule } from './hooks/useRule/useRule.es6.js
|
|
|
107
107
|
export { objectRuleContext, useObjectRule } from './hooks/useObjectRule/useObjectRule.es6.js';
|
|
108
108
|
export { bodyFileContext, useBodyFile } from './hooks/useBodyFile/useBodyFile.es6.js';
|
|
109
109
|
export { usePath } from './hooks/usePath/usePath.es6.js';
|
|
110
|
+
export { useRequestPlugin } from './hooks/useRequestPlugin/useRequestPlugin.es6.js';
|
|
111
|
+
export { useClientIp } from './hooks/useClientIp/useClientIp.es6.js';
|
package/index.js
CHANGED
|
@@ -111,6 +111,8 @@ var useRule = require('./hooks/useRule/useRule.js');
|
|
|
111
111
|
var useObjectRule = require('./hooks/useObjectRule/useObjectRule.js');
|
|
112
112
|
var useBodyFile = require('./hooks/useBodyFile/useBodyFile.js');
|
|
113
113
|
var usePath = require('./hooks/usePath/usePath.js');
|
|
114
|
+
var useRequestPlugin = require('./hooks/useRequestPlugin/useRequestPlugin.js');
|
|
115
|
+
var useClientIp = require('./hooks/useClientIp/useClientIp.js');
|
|
114
116
|
|
|
115
117
|
|
|
116
118
|
|
|
@@ -246,3 +248,5 @@ exports.useObjectRule = useObjectRule.useObjectRule;
|
|
|
246
248
|
exports.bodyFileContext = useBodyFile.bodyFileContext;
|
|
247
249
|
exports.useBodyFile = useBodyFile.useBodyFile;
|
|
248
250
|
exports.usePath = usePath.usePath;
|
|
251
|
+
exports.useRequestPlugin = useRequestPlugin.useRequestPlugin;
|
|
252
|
+
exports.useClientIp = useClientIp.useClientIp;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@innet/server",
|
|
3
|
-
"version": "2.0.0-alpha.
|
|
3
|
+
"version": "2.0.0-alpha.8",
|
|
4
4
|
"description": "Create server-side application with innet",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"module": "index.es6.js",
|
|
@@ -49,6 +49,7 @@
|
|
|
49
49
|
"multiparty": "^4.2.3",
|
|
50
50
|
"openapi-types": "^12.1.3",
|
|
51
51
|
"qs": "^6.11.2",
|
|
52
|
+
"request-ip": "^3.3.0",
|
|
52
53
|
"string_decoder": "^1.3.0",
|
|
53
54
|
"tslib": "^2.6.1",
|
|
54
55
|
"uuid": "^9.0.0",
|
|
@@ -46,6 +46,10 @@ const api = () => {
|
|
|
46
46
|
if (!url.startsWith(prefix)) {
|
|
47
47
|
return;
|
|
48
48
|
}
|
|
49
|
+
for (const requestPlugin of requestPlugins) {
|
|
50
|
+
if (requestPlugin(req, res))
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
49
53
|
const method = ((_c = (_b = req.method) === null || _b === void 0 ? void 0 : _b.toLowerCase()) !== null && _c !== void 0 ? _c : 'get');
|
|
50
54
|
const rawSplitPath = url.slice(prefix.length).split('/').slice(1);
|
|
51
55
|
const splitPath = rawSplitPath.at(-1) ? rawSplitPath : rawSplitPath.slice(0, -1);
|
|
@@ -154,10 +158,6 @@ const api = () => {
|
|
|
154
158
|
}
|
|
155
159
|
}
|
|
156
160
|
}
|
|
157
|
-
for (const requestPlugin of requestPlugins) {
|
|
158
|
-
if (requestPlugin(req, res))
|
|
159
|
-
return;
|
|
160
|
-
}
|
|
161
161
|
if (context.fallback) {
|
|
162
162
|
const newHandler = Object.create(context.fallback.handler);
|
|
163
163
|
responseContext.set(newHandler, res);
|
package/plugins/main/api/api.js
CHANGED
|
@@ -54,6 +54,10 @@ const api = () => {
|
|
|
54
54
|
if (!url.startsWith(prefix)) {
|
|
55
55
|
return;
|
|
56
56
|
}
|
|
57
|
+
for (const requestPlugin of requestPlugins) {
|
|
58
|
+
if (requestPlugin(req, res))
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
57
61
|
const method = ((_c = (_b = req.method) === null || _b === void 0 ? void 0 : _b.toLowerCase()) !== null && _c !== void 0 ? _c : 'get');
|
|
58
62
|
const rawSplitPath = url.slice(prefix.length).split('/').slice(1);
|
|
59
63
|
const splitPath = rawSplitPath.at(-1) ? rawSplitPath : rawSplitPath.slice(0, -1);
|
|
@@ -162,10 +166,6 @@ const api = () => {
|
|
|
162
166
|
}
|
|
163
167
|
}
|
|
164
168
|
}
|
|
165
|
-
for (const requestPlugin of requestPlugins) {
|
|
166
|
-
if (requestPlugin(req, res))
|
|
167
|
-
return;
|
|
168
|
-
}
|
|
169
169
|
if (context.fallback) {
|
|
170
170
|
const newHandler = Object.create(context.fallback.handler);
|
|
171
171
|
useResponse.responseContext.set(newHandler, res);
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { useProps } from '@innet/jsx';
|
|
2
|
-
import { onDestroy } from 'watch-state';
|
|
3
2
|
import '../../../hooks/index.es6.js';
|
|
4
3
|
import html from './swagger.html.es6.js';
|
|
5
4
|
import { useApi } from '../../../hooks/useApi/useApi.es6.js';
|
|
5
|
+
import { useRequestPlugin } from '../../../hooks/useRequestPlugin/useRequestPlugin.es6.js';
|
|
6
6
|
|
|
7
7
|
const swagger = () => {
|
|
8
8
|
const { path = '/swagger-ui' } = useProps() || {};
|
|
9
|
-
const { docs,
|
|
9
|
+
const { docs, prefix } = useApi();
|
|
10
10
|
let swaggerResponse;
|
|
11
|
-
|
|
11
|
+
useRequestPlugin((req, res) => {
|
|
12
12
|
if (req.url === prefix + path) {
|
|
13
13
|
if (!swaggerResponse) {
|
|
14
14
|
swaggerResponse = html.replace('spec: {},', `spec: ${JSON.stringify(docs)},`);
|
|
@@ -18,10 +18,6 @@ const swagger = () => {
|
|
|
18
18
|
res.end();
|
|
19
19
|
return true;
|
|
20
20
|
}
|
|
21
|
-
};
|
|
22
|
-
requestPlugins.add(listener);
|
|
23
|
-
onDestroy(() => {
|
|
24
|
-
requestPlugins.delete(listener);
|
|
25
21
|
});
|
|
26
22
|
};
|
|
27
23
|
|
|
@@ -3,16 +3,16 @@
|
|
|
3
3
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
4
|
|
|
5
5
|
var jsx = require('@innet/jsx');
|
|
6
|
-
var watchState = require('watch-state');
|
|
7
6
|
require('../../../hooks/index.js');
|
|
8
7
|
var swagger$1 = require('./swagger.html.js');
|
|
9
8
|
var useApi = require('../../../hooks/useApi/useApi.js');
|
|
9
|
+
var useRequestPlugin = require('../../../hooks/useRequestPlugin/useRequestPlugin.js');
|
|
10
10
|
|
|
11
11
|
const swagger = () => {
|
|
12
12
|
const { path = '/swagger-ui' } = jsx.useProps() || {};
|
|
13
|
-
const { docs,
|
|
13
|
+
const { docs, prefix } = useApi.useApi();
|
|
14
14
|
let swaggerResponse;
|
|
15
|
-
|
|
15
|
+
useRequestPlugin.useRequestPlugin((req, res) => {
|
|
16
16
|
if (req.url === prefix + path) {
|
|
17
17
|
if (!swaggerResponse) {
|
|
18
18
|
swaggerResponse = swagger$1["default"].replace('spec: {},', `spec: ${JSON.stringify(docs)},`);
|
|
@@ -22,10 +22,6 @@ const swagger = () => {
|
|
|
22
22
|
res.end();
|
|
23
23
|
return true;
|
|
24
24
|
}
|
|
25
|
-
};
|
|
26
|
-
requestPlugins.add(listener);
|
|
27
|
-
watchState.onDestroy(() => {
|
|
28
|
-
requestPlugins.delete(listener);
|
|
29
25
|
});
|
|
30
26
|
};
|
|
31
27
|
|