@akanjs/server 0.0.97 → 0.0.99
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/index.cjs +21 -0
- package/index.js +1 -21
- package/package.json +4 -4
- package/src/boot.cjs +200 -0
- package/src/boot.js +84 -94
- package/src/controller.cjs +102 -0
- package/src/controller.js +70 -63
- package/src/gql.cjs +152 -0
- package/src/gql.js +35 -64
- package/src/index.cjs +39 -0
- package/src/index.js +10 -39
- package/src/module.cjs +255 -0
- package/src/module.js +77 -103
- package/src/processor.cjs +92 -0
- package/src/processor.js +22 -41
- package/src/resolver.cjs +145 -0
- package/src/resolver.js +49 -76
- package/src/{schema.mjs → schema.cjs} +78 -54
- package/src/schema.js +54 -78
- package/src/{searchDaemon.mjs → searchDaemon.cjs} +45 -29
- package/src/searchDaemon.js +29 -45
- package/src/types.cjs +15 -0
- package/src/types.js +0 -15
- package/src/websocket.cjs +146 -0
- package/src/websocket.js +33 -55
- package/index.mjs +0 -1
- package/src/boot.mjs +0 -190
- package/src/controller.mjs +0 -109
- package/src/gql.mjs +0 -123
- package/src/index.mjs +0 -10
- package/src/module.mjs +0 -229
- package/src/processor.mjs +0 -73
- package/src/resolver.mjs +0 -118
- package/src/types.mjs +0 -0
- package/src/websocket.mjs +0 -124
package/src/processor.mjs
DELETED
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
import { lowerlize } from "@akanjs/common";
|
|
2
|
-
import { isServiceEnabled } from "@akanjs/service";
|
|
3
|
-
import {
|
|
4
|
-
deserializeArg,
|
|
5
|
-
getArgMetas,
|
|
6
|
-
getGqlMetas,
|
|
7
|
-
getSigMeta
|
|
8
|
-
} from "@akanjs/signal";
|
|
9
|
-
import { Process, Processor } from "@nestjs/bull";
|
|
10
|
-
import { Inject } from "@nestjs/common";
|
|
11
|
-
const convertProcessFunction = (gqlMeta, argMetas, internalArgMetas, fn) => {
|
|
12
|
-
return async function(job, done) {
|
|
13
|
-
const args = [];
|
|
14
|
-
argMetas.forEach((argMeta) => {
|
|
15
|
-
if (argMeta.type === "Msg")
|
|
16
|
-
args[argMeta.idx] = deserializeArg(argMeta, job.data[argMeta.idx]);
|
|
17
|
-
else
|
|
18
|
-
throw new Error(`Invalid ArgMeta Type ${argMeta.type}`);
|
|
19
|
-
});
|
|
20
|
-
internalArgMetas.forEach((internalArgMeta) => {
|
|
21
|
-
if (internalArgMeta.type === "Job")
|
|
22
|
-
args[internalArgMeta.idx] = job;
|
|
23
|
-
else
|
|
24
|
-
throw new Error(`Invalid InternalArgMeta Type ${internalArgMeta.type}`);
|
|
25
|
-
});
|
|
26
|
-
this.logger?.log(`Process-${gqlMeta.key} started`);
|
|
27
|
-
const result = await fn.apply(this, args);
|
|
28
|
-
this.logger?.log(`Process-${gqlMeta.key} finished`);
|
|
29
|
-
done(null, result);
|
|
30
|
-
};
|
|
31
|
-
};
|
|
32
|
-
const processorOf = (sigRef, allSrvs) => {
|
|
33
|
-
const sigMeta = getSigMeta(sigRef);
|
|
34
|
-
const serverMode = process.env.SERVER_MODE ?? "federation";
|
|
35
|
-
const gqlMetas = getGqlMetas(sigRef).filter((gqlMeta) => gqlMeta.type === "Process").filter(
|
|
36
|
-
(gqlMeta) => gqlMeta.signalOption.serverType === "all" || serverMode === "all" || gqlMeta.signalOption.serverType === serverMode
|
|
37
|
-
);
|
|
38
|
-
class QueueProcessor {
|
|
39
|
-
}
|
|
40
|
-
Object.keys(allSrvs).forEach((srv) => {
|
|
41
|
-
if (!isServiceEnabled(allSrvs[srv]))
|
|
42
|
-
return;
|
|
43
|
-
Inject(allSrvs[srv])(QueueProcessor.prototype, lowerlize(srv));
|
|
44
|
-
});
|
|
45
|
-
for (const gqlMeta of gqlMetas) {
|
|
46
|
-
const [argMetas, internalArgMetas] = getArgMetas(sigRef, gqlMeta.key);
|
|
47
|
-
const descriptor = { ...Object.getOwnPropertyDescriptor(sigRef.prototype, gqlMeta.key) ?? {} };
|
|
48
|
-
descriptor.value = convertProcessFunction(
|
|
49
|
-
gqlMeta,
|
|
50
|
-
argMetas,
|
|
51
|
-
internalArgMetas,
|
|
52
|
-
descriptor.value
|
|
53
|
-
);
|
|
54
|
-
Object.defineProperty(QueueProcessor.prototype, gqlMeta.key, descriptor);
|
|
55
|
-
Process(gqlMeta.key)(QueueProcessor.prototype, gqlMeta.key, descriptor);
|
|
56
|
-
}
|
|
57
|
-
Processor(sigMeta.refName)(QueueProcessor);
|
|
58
|
-
return QueueProcessor;
|
|
59
|
-
};
|
|
60
|
-
const queueOf = (sigRef, queue) => {
|
|
61
|
-
const sigMeta = getSigMeta(sigRef);
|
|
62
|
-
const gqlMetas = getGqlMetas(sigRef).filter((gqlMeta) => gqlMeta.type === "Process");
|
|
63
|
-
for (const gqlMeta of gqlMetas) {
|
|
64
|
-
if (queue[gqlMeta.key])
|
|
65
|
-
throw new Error(`Queue already has ${gqlMeta.key} in ${sigMeta.refName}`);
|
|
66
|
-
queue[gqlMeta.key] = (...args) => queue.add(gqlMeta.key, args);
|
|
67
|
-
}
|
|
68
|
-
return queue;
|
|
69
|
-
};
|
|
70
|
-
export {
|
|
71
|
-
processorOf,
|
|
72
|
-
queueOf
|
|
73
|
-
};
|
package/src/resolver.mjs
DELETED
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
import { arraiedModel, Float, getNonArrayModel, ID, Int, JSON, Upload } from "@akanjs/base";
|
|
2
|
-
import { capitalize, lowerlize } from "@akanjs/common";
|
|
3
|
-
import { getClassMeta, getFieldMetas } from "@akanjs/constant";
|
|
4
|
-
import { Access, Account, guards, Me, Req, Res, Self, UserIp } from "@akanjs/nest";
|
|
5
|
-
import { isServiceEnabled } from "@akanjs/service";
|
|
6
|
-
import {
|
|
7
|
-
copySignal,
|
|
8
|
-
getArgMetas,
|
|
9
|
-
getGqlMetas,
|
|
10
|
-
getResolveFieldMetas,
|
|
11
|
-
getSigMeta
|
|
12
|
-
} from "@akanjs/signal";
|
|
13
|
-
import { Inject, UseGuards } from "@nestjs/common";
|
|
14
|
-
import * as Nest from "@nestjs/graphql";
|
|
15
|
-
import GraphQLJson from "graphql-type-json";
|
|
16
|
-
import { GraphQLUpload } from "graphql-upload";
|
|
17
|
-
import { generateGql, generateGqlInput } from "./gql";
|
|
18
|
-
const scalarNestReturnMap = /* @__PURE__ */ new Map([
|
|
19
|
-
[Upload, GraphQLUpload],
|
|
20
|
-
[ID, Nest.ID],
|
|
21
|
-
[Int, Nest.Int],
|
|
22
|
-
[Float, Nest.Float],
|
|
23
|
-
[JSON, GraphQLJson],
|
|
24
|
-
[Boolean, Boolean],
|
|
25
|
-
[Date, Date],
|
|
26
|
-
[String, String],
|
|
27
|
-
[Map, GraphQLJson]
|
|
28
|
-
]);
|
|
29
|
-
const getNestReturn = (returns, type = "object") => {
|
|
30
|
-
const [model, arrDepth] = getNonArrayModel(returns());
|
|
31
|
-
const modelRef = scalarNestReturnMap.get(model) ?? (type === "object" ? generateGql(model) : generateGqlInput(model));
|
|
32
|
-
return () => arraiedModel(modelRef, arrDepth);
|
|
33
|
-
};
|
|
34
|
-
const internalArgMap = {
|
|
35
|
-
Parent: Nest.Parent,
|
|
36
|
-
Account,
|
|
37
|
-
UserIp,
|
|
38
|
-
Access,
|
|
39
|
-
Self,
|
|
40
|
-
Me,
|
|
41
|
-
Req,
|
|
42
|
-
Res
|
|
43
|
-
};
|
|
44
|
-
const resolverOf = (sigRef, allSrvs) => {
|
|
45
|
-
const Rsv = copySignal(sigRef);
|
|
46
|
-
const sigMeta = getSigMeta(Rsv);
|
|
47
|
-
const gqlMetas = getGqlMetas(Rsv);
|
|
48
|
-
Object.keys(allSrvs).forEach((srv) => {
|
|
49
|
-
if (!isServiceEnabled(allSrvs[srv]))
|
|
50
|
-
return;
|
|
51
|
-
Inject(allSrvs[srv])(Rsv.prototype, lowerlize(srv));
|
|
52
|
-
});
|
|
53
|
-
for (const gqlMeta of gqlMetas) {
|
|
54
|
-
if (gqlMeta.guards.some((guard) => guard === "None") || gqlMeta.signalOption.onlyFor === "restapi" || !["Query", "Mutation"].includes(gqlMeta.type))
|
|
55
|
-
continue;
|
|
56
|
-
else if (gqlMeta.signalOption.sso)
|
|
57
|
-
continue;
|
|
58
|
-
const [argMetas, internalArgMetas] = getArgMetas(Rsv, gqlMeta.key);
|
|
59
|
-
const descriptor = Object.getOwnPropertyDescriptor(Rsv.prototype, gqlMeta.key) ?? {};
|
|
60
|
-
for (const argMeta of argMetas) {
|
|
61
|
-
Nest.Args({
|
|
62
|
-
name: argMeta.name,
|
|
63
|
-
type: getNestReturn(argMeta.returns, "input"),
|
|
64
|
-
...argMeta.argsOption
|
|
65
|
-
})(Rsv.prototype, gqlMeta.key, argMeta.idx);
|
|
66
|
-
}
|
|
67
|
-
for (const internalArgMeta of internalArgMetas) {
|
|
68
|
-
const decorate = internalArgMap[internalArgMeta.type];
|
|
69
|
-
decorate(internalArgMeta.option ?? {})(Rsv.prototype, gqlMeta.key, internalArgMeta.idx);
|
|
70
|
-
}
|
|
71
|
-
UseGuards(...gqlMeta.guards.map((guard) => guards[guard]))(Rsv.prototype, gqlMeta.key, descriptor);
|
|
72
|
-
if (gqlMeta.type === "Query")
|
|
73
|
-
Nest.Query(getNestReturn(gqlMeta.returns), gqlMeta.signalOption)(Rsv.prototype, gqlMeta.key, descriptor);
|
|
74
|
-
else if (gqlMeta.type === "Mutation")
|
|
75
|
-
Nest.Mutation(getNestReturn(gqlMeta.returns), gqlMeta.signalOption)(Rsv.prototype, gqlMeta.key, descriptor);
|
|
76
|
-
}
|
|
77
|
-
const resolveFieldMetas = getResolveFieldMetas(Rsv);
|
|
78
|
-
if (sigMeta.returns) {
|
|
79
|
-
const modelRef = sigMeta.returns();
|
|
80
|
-
const fieldMetas = getFieldMetas(modelRef);
|
|
81
|
-
fieldMetas.filter((fieldMeta) => fieldMeta.isClass && !fieldMeta.isScalar).forEach((fieldMeta) => {
|
|
82
|
-
const classMeta = getClassMeta(fieldMeta.modelRef);
|
|
83
|
-
const modelName = lowerlize(classMeta.type === "light" ? classMeta.refName.slice(5) : classMeta.refName);
|
|
84
|
-
const className = capitalize(modelName);
|
|
85
|
-
const serviceName = `${modelName}Service`;
|
|
86
|
-
Rsv.prototype[fieldMeta.key] = async function(parent) {
|
|
87
|
-
const service = this[serviceName];
|
|
88
|
-
return fieldMeta.arrDepth ? await service[`load${className}Many`](parent[fieldMeta.key]) : await service[`load${className}`](parent[fieldMeta.key]);
|
|
89
|
-
};
|
|
90
|
-
Nest.Parent()(Rsv.prototype, fieldMeta.key, 0);
|
|
91
|
-
Nest.ResolveField(getNestReturn(() => arraiedModel(fieldMeta.modelRef, fieldMeta.arrDepth)))(
|
|
92
|
-
Rsv.prototype,
|
|
93
|
-
fieldMeta.key,
|
|
94
|
-
Object.getOwnPropertyDescriptor(Rsv.prototype, fieldMeta.key) ?? {}
|
|
95
|
-
);
|
|
96
|
-
});
|
|
97
|
-
}
|
|
98
|
-
for (const resolveFieldMeta of resolveFieldMetas) {
|
|
99
|
-
const [, internalArgMetas] = getArgMetas(Rsv, resolveFieldMeta.key);
|
|
100
|
-
for (const internalArgMeta of internalArgMetas) {
|
|
101
|
-
const decorate = internalArgMap[internalArgMeta.type];
|
|
102
|
-
decorate(internalArgMeta.option ?? {})(Rsv.prototype, resolveFieldMeta.key, internalArgMeta.idx);
|
|
103
|
-
}
|
|
104
|
-
Nest.ResolveField(getNestReturn(resolveFieldMeta.returns))(
|
|
105
|
-
Rsv.prototype,
|
|
106
|
-
resolveFieldMeta.key,
|
|
107
|
-
Object.getOwnPropertyDescriptor(Rsv.prototype, resolveFieldMeta.key) ?? {}
|
|
108
|
-
);
|
|
109
|
-
}
|
|
110
|
-
if (sigMeta.returns)
|
|
111
|
-
Nest.Resolver(getNestReturn(sigMeta.returns))(Rsv);
|
|
112
|
-
else
|
|
113
|
-
Nest.Resolver()(Rsv);
|
|
114
|
-
return Rsv;
|
|
115
|
-
};
|
|
116
|
-
export {
|
|
117
|
-
resolverOf
|
|
118
|
-
};
|
package/src/types.mjs
DELETED
|
File without changes
|
package/src/websocket.mjs
DELETED
|
@@ -1,124 +0,0 @@
|
|
|
1
|
-
var __defProp = Object.defineProperty;
|
|
2
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
-
var __decorateClass = (decorators, target, key, kind) => {
|
|
4
|
-
var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
|
|
5
|
-
for (var i = decorators.length - 1, decorator; i >= 0; i--)
|
|
6
|
-
if (decorator = decorators[i])
|
|
7
|
-
result = (kind ? decorator(target, key, result) : decorator(result)) || result;
|
|
8
|
-
if (kind && result)
|
|
9
|
-
__defProp(target, key, result);
|
|
10
|
-
return result;
|
|
11
|
-
};
|
|
12
|
-
import { lowerlize } from "@akanjs/common";
|
|
13
|
-
import { Access, Account, getBodyPipes, Me, Self, UserIp, Ws } from "@akanjs/nest";
|
|
14
|
-
import { isServiceEnabled } from "@akanjs/service";
|
|
15
|
-
import { getArgMetas, getGqlMetas, getSigMeta } from "@akanjs/signal";
|
|
16
|
-
import { Inject, Injectable, UseInterceptors } from "@nestjs/common";
|
|
17
|
-
import { MessageBody, SubscribeMessage, WebSocketGateway, WebSocketServer } from "@nestjs/websockets";
|
|
18
|
-
import { map } from "rxjs/operators";
|
|
19
|
-
const internalArgMap = { Account, UserIp, Access, Self, Me, Ws };
|
|
20
|
-
let TransformInterceptor = class {
|
|
21
|
-
intercept(context, next) {
|
|
22
|
-
const [, gqlKey] = [context.getArgByIndex(1), context.getArgByIndex(3)];
|
|
23
|
-
return next.handle().pipe(map((data) => ({ event: gqlKey, data })));
|
|
24
|
-
}
|
|
25
|
-
};
|
|
26
|
-
TransformInterceptor = __decorateClass([
|
|
27
|
-
Injectable()
|
|
28
|
-
], TransformInterceptor);
|
|
29
|
-
const makeRoomId = (gqlKey, argValues) => `${gqlKey}-${argValues.join("-")}`;
|
|
30
|
-
const getPubsubInterceptor = (argMetas) => {
|
|
31
|
-
let PubsubInterceptor = class {
|
|
32
|
-
async intercept(context, next) {
|
|
33
|
-
const [socket, { __subscribe__, ...body }, gqlKey] = [context.getArgByIndex(0), context.getArgByIndex(1), context.getArgByIndex(3)];
|
|
34
|
-
const roomId = makeRoomId(
|
|
35
|
-
gqlKey,
|
|
36
|
-
argMetas.map((argMeta) => body[argMeta.name])
|
|
37
|
-
);
|
|
38
|
-
if (__subscribe__)
|
|
39
|
-
await socket.join(roomId);
|
|
40
|
-
else
|
|
41
|
-
await socket.leave(roomId);
|
|
42
|
-
return next.handle().pipe(map(() => ({ event: gqlKey, data: { roomId, __subscribe__ } })));
|
|
43
|
-
}
|
|
44
|
-
};
|
|
45
|
-
PubsubInterceptor = __decorateClass([
|
|
46
|
-
Injectable()
|
|
47
|
-
], PubsubInterceptor);
|
|
48
|
-
return PubsubInterceptor;
|
|
49
|
-
};
|
|
50
|
-
const websocketOf = (sigRef, allSrvs) => {
|
|
51
|
-
const sigMeta = getSigMeta(sigRef);
|
|
52
|
-
class WsGateway {
|
|
53
|
-
__sigRef__ = sigRef;
|
|
54
|
-
}
|
|
55
|
-
Object.keys(allSrvs).forEach((srv) => {
|
|
56
|
-
if (!isServiceEnabled(allSrvs[srv]))
|
|
57
|
-
return;
|
|
58
|
-
Inject(allSrvs[srv])(WsGateway.prototype, lowerlize(srv));
|
|
59
|
-
});
|
|
60
|
-
const messageGqlMetas = getGqlMetas(sigRef).filter((gqlMeta) => gqlMeta.type === "Message");
|
|
61
|
-
for (const gqlMeta of messageGqlMetas) {
|
|
62
|
-
const descriptor = { ...Object.getOwnPropertyDescriptor(sigRef.prototype, gqlMeta.key) ?? {} };
|
|
63
|
-
Object.defineProperty(WsGateway.prototype, gqlMeta.key, descriptor);
|
|
64
|
-
const [argMetas, internalArgMetas] = getArgMetas(sigRef, gqlMeta.key);
|
|
65
|
-
argMetas.forEach((argMeta) => {
|
|
66
|
-
if (argMeta.type !== "Msg")
|
|
67
|
-
throw new Error(`Argument of Message should be Msg ${sigMeta.refName}-${gqlMeta.key}-${argMeta.name}`);
|
|
68
|
-
MessageBody(argMeta.name, ...getBodyPipes(argMeta))(WsGateway.prototype, gqlMeta.key, argMeta.idx);
|
|
69
|
-
});
|
|
70
|
-
internalArgMetas.forEach((internalArgMeta) => {
|
|
71
|
-
const internalDecorator = internalArgMap[internalArgMeta.type];
|
|
72
|
-
internalDecorator(internalArgMeta.option ?? {})(WsGateway.prototype, gqlMeta.key, internalArgMeta.idx);
|
|
73
|
-
});
|
|
74
|
-
UseInterceptors(TransformInterceptor)(WsGateway.prototype, gqlMeta.key, gqlMeta.descriptor);
|
|
75
|
-
SubscribeMessage(gqlMeta.key)(WsGateway.prototype, gqlMeta.key, descriptor);
|
|
76
|
-
}
|
|
77
|
-
const pubsubGqlMetas = getGqlMetas(sigRef).filter((gqlMeta) => gqlMeta.type === "Pubsub");
|
|
78
|
-
for (const gqlMeta of pubsubGqlMetas) {
|
|
79
|
-
const descriptor = { ...Object.getOwnPropertyDescriptor(sigRef.prototype, gqlMeta.key) ?? {} };
|
|
80
|
-
Object.defineProperty(WsGateway.prototype, gqlMeta.key, descriptor);
|
|
81
|
-
const [argMetas, internalArgMetas] = getArgMetas(sigRef, gqlMeta.key);
|
|
82
|
-
argMetas.forEach((argMeta) => {
|
|
83
|
-
if (argMeta.type !== "Room")
|
|
84
|
-
throw new Error(`Argument of Message should be Room ${sigMeta.refName}-${gqlMeta.key}-${argMeta.name}`);
|
|
85
|
-
MessageBody(argMeta.name, ...getBodyPipes(argMeta))(WsGateway.prototype, gqlMeta.key, argMeta.idx);
|
|
86
|
-
});
|
|
87
|
-
internalArgMetas.forEach((internalArgMeta) => {
|
|
88
|
-
const internalDecorator = internalArgMap[internalArgMeta.type];
|
|
89
|
-
internalDecorator(internalArgMeta.option ?? {})(WsGateway.prototype, gqlMeta.key, internalArgMeta.idx);
|
|
90
|
-
});
|
|
91
|
-
UseInterceptors(getPubsubInterceptor(argMetas))(WsGateway.prototype, gqlMeta.key, gqlMeta.descriptor);
|
|
92
|
-
SubscribeMessage(gqlMeta.key)(WsGateway.prototype, gqlMeta.key, descriptor);
|
|
93
|
-
}
|
|
94
|
-
WebSocketGateway({ cors: { origin: "*" }, transports: ["websocket"] })(WsGateway);
|
|
95
|
-
return WsGateway;
|
|
96
|
-
};
|
|
97
|
-
const websocketServerOf = (sigRef) => {
|
|
98
|
-
const pubsubGqlMetas = getGqlMetas(sigRef).filter((gqlMeta) => gqlMeta.type === "Pubsub");
|
|
99
|
-
let Websocket = class {
|
|
100
|
-
server;
|
|
101
|
-
};
|
|
102
|
-
__decorateClass([
|
|
103
|
-
WebSocketServer()
|
|
104
|
-
], Websocket.prototype, "server", 2);
|
|
105
|
-
Websocket = __decorateClass([
|
|
106
|
-
Injectable(),
|
|
107
|
-
WebSocketGateway({ cors: { origin: "*" }, transports: ["websocket"] })
|
|
108
|
-
], Websocket);
|
|
109
|
-
for (const gqlMeta of pubsubGqlMetas) {
|
|
110
|
-
const [argMetas] = getArgMetas(sigRef, gqlMeta.key);
|
|
111
|
-
Websocket.prototype[gqlMeta.key] = function(...args) {
|
|
112
|
-
const roomId = makeRoomId(
|
|
113
|
-
gqlMeta.key,
|
|
114
|
-
argMetas.map((argMeta) => args[argMeta.idx])
|
|
115
|
-
);
|
|
116
|
-
this.server.to(roomId).emit(roomId, args.at(-1));
|
|
117
|
-
};
|
|
118
|
-
}
|
|
119
|
-
return Websocket;
|
|
120
|
-
};
|
|
121
|
-
export {
|
|
122
|
-
websocketOf,
|
|
123
|
-
websocketServerOf
|
|
124
|
-
};
|