@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 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
- [useServer](#useserver)
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
- [useComponentName](#usecomponentname)
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
- ```typescript jsx
3343
- import { useServer } from '@innet/sever'
3344
-
3345
- export function Component () {
3346
- const server = useServer()
3331
+ Server start
3332
+ [useRequestPlugin](#userequestplugin)
3347
3333
 
3348
- console.log(server)
3334
+ Both
3335
+ [useServer](#useserver)
3336
+ [useComponentName](#usecomponentname)
3349
3337
 
3350
- return <success />
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
@@ -23,3 +23,5 @@ export * from './useRule';
23
23
  export * from './useObjectRule';
24
24
  export * from './useBodyFile';
25
25
  export * from './usePath';
26
+ export * from './useRequestPlugin';
27
+ export * from './useClientIp';
@@ -23,3 +23,5 @@ import './useRule/index.es6.js';
23
23
  import './useObjectRule/index.es6.js';
24
24
  import './useBodyFile/index.es6.js';
25
25
  import './usePath/index.es6.js';
26
+ import './useRequestPlugin/index.es6.js';
27
+ import './useClientIp/index.es6.js';
package/hooks/index.js CHANGED
@@ -25,4 +25,6 @@ require('./useRule/index.js');
25
25
  require('./useObjectRule/index.js');
26
26
  require('./useBodyFile/index.js');
27
27
  require('./usePath/index.js');
28
+ require('./useRequestPlugin/index.js');
29
+ require('./useClientIp/index.js');
28
30
 
@@ -0,0 +1 @@
1
+ export * from './useClientIp';
@@ -0,0 +1 @@
1
+ export { useClientIp } from './useClientIp.es6.js';
@@ -0,0 +1,9 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var useClientIp = require('./useClientIp.js');
6
+
7
+
8
+
9
+ exports.useClientIp = useClientIp.useClientIp;
@@ -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,9 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var useRequestPlugin = require('./useRequestPlugin.js');
6
+
7
+
8
+
9
+ exports.useRequestPlugin = useRequestPlugin.useRequestPlugin;
@@ -0,0 +1,2 @@
1
+ import { type RequestPlugin } from '../../types';
2
+ export declare function useRequestPlugin(listener: RequestPlugin): void;
@@ -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.6",
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);
@@ -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, requestPlugins, prefix } = useApi();
9
+ const { docs, prefix } = useApi();
10
10
  let swaggerResponse;
11
- const listener = (req, res) => {
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, requestPlugins, prefix } = useApi.useApi();
13
+ const { docs, prefix } = useApi.useApi();
14
14
  let swaggerResponse;
15
- const listener = (req, res) => {
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