@akanjs/server 0.9.58-canary.0 → 0.9.58-canary.2
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/cjs/src/boot.js +0 -3
- package/cjs/src/compressor.js +256 -0
- package/cjs/src/gql.js +2 -1
- package/cjs/src/index.js +3 -1
- package/esm/src/boot.js +1 -4
- package/esm/src/compressor.js +236 -0
- package/esm/src/gql.js +2 -1
- package/esm/src/index.js +1 -0
- package/package.json +2 -1
- package/src/compressor.d.ts +3 -0
- package/src/index.d.ts +1 -0
- package/src/module.d.ts +1 -1
package/cjs/src/boot.js
CHANGED
|
@@ -52,7 +52,6 @@ var import_mongoose = require("@nestjs/mongoose");
|
|
|
52
52
|
var import_schedule = require("@nestjs/schedule");
|
|
53
53
|
var import_body_parser = require("body-parser");
|
|
54
54
|
var import_cookie_parser = __toESM(require("cookie-parser"));
|
|
55
|
-
var import_dgram = __toESM(require("dgram"));
|
|
56
55
|
var import_events = __toESM(require("events"));
|
|
57
56
|
var import_graphql_upload = require("graphql-upload");
|
|
58
57
|
var import_meilisearch = require("meilisearch");
|
|
@@ -149,8 +148,6 @@ const createNestApp = async ({
|
|
|
149
148
|
const redisIoAdapter = new import_nest.RedisIoAdapter(app, { jwtSecret });
|
|
150
149
|
await redisIoAdapter.connectToRedis(redisUri);
|
|
151
150
|
app.enableShutdownHooks();
|
|
152
|
-
const udp = import_dgram.default.createSocket("udp4");
|
|
153
|
-
import_signal.client.setUdp(udp);
|
|
154
151
|
if (env.operationMode !== "local" && process.env.USE_REDIS_IO_ADAPTER !== "false")
|
|
155
152
|
app.useWebSocketAdapter(redisIoAdapter);
|
|
156
153
|
if (["federation", "all"].includes(serverMode)) {
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
var __create = Object.create;
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __export = (target, all) => {
|
|
8
|
+
for (var name in all)
|
|
9
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
+
};
|
|
11
|
+
var __copyProps = (to, from, except, desc) => {
|
|
12
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
+
for (let key of __getOwnPropNames(from))
|
|
14
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
+
}
|
|
17
|
+
return to;
|
|
18
|
+
};
|
|
19
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
20
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
21
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
22
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
23
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
24
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
25
|
+
mod
|
|
26
|
+
));
|
|
27
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
28
|
+
var compressor_exports = {};
|
|
29
|
+
__export(compressor_exports, {
|
|
30
|
+
decode: () => decode,
|
|
31
|
+
encode: () => encode
|
|
32
|
+
});
|
|
33
|
+
module.exports = __toCommonJS(compressor_exports);
|
|
34
|
+
var import_base = require("@akanjs/base");
|
|
35
|
+
var import_common = require("@akanjs/common");
|
|
36
|
+
var import_constant = require("@akanjs/constant");
|
|
37
|
+
var proto = __toESM(require("protobufjs"));
|
|
38
|
+
class ProtoModelStorage {
|
|
39
|
+
}
|
|
40
|
+
const protobufTypeMap = /* @__PURE__ */ new Map([
|
|
41
|
+
[String, "string"],
|
|
42
|
+
[import_base.Int, "int32"],
|
|
43
|
+
[import_base.Float, "float"],
|
|
44
|
+
[Boolean, "bool"],
|
|
45
|
+
[Date, "double"]
|
|
46
|
+
]);
|
|
47
|
+
const getPredefinedProtoModel = (modelRef) => {
|
|
48
|
+
const protoModel = Reflect.getMetadata(modelRef, ProtoModelStorage.prototype);
|
|
49
|
+
return protoModel;
|
|
50
|
+
};
|
|
51
|
+
const setPredefinedProtoModel = (modelRef, protoModel) => {
|
|
52
|
+
Reflect.defineMetadata(modelRef, protoModel, ProtoModelStorage.prototype);
|
|
53
|
+
};
|
|
54
|
+
const getProtoModel = (modelRef) => {
|
|
55
|
+
const refName = import_constant.constantInfo.getRefName(modelRef);
|
|
56
|
+
const predefinedProtoModel = getPredefinedProtoModel(modelRef);
|
|
57
|
+
if (predefinedProtoModel)
|
|
58
|
+
return predefinedProtoModel;
|
|
59
|
+
const namespace = refName.toLowerCase();
|
|
60
|
+
const childModelRefs = (0, import_constant.getChildClassRefs)(modelRef);
|
|
61
|
+
const allModelRefs = [modelRef, ...childModelRefs];
|
|
62
|
+
const modelDatas = allModelRefs.map((modelRef2) => {
|
|
63
|
+
const refName2 = import_constant.constantInfo.getRefName(modelRef2);
|
|
64
|
+
const fieldMetas = (0, import_constant.getFieldMetas)(modelRef2);
|
|
65
|
+
return [
|
|
66
|
+
refName2,
|
|
67
|
+
{
|
|
68
|
+
fields: Object.fromEntries(
|
|
69
|
+
fieldMetas.map((fieldMeta, id) => {
|
|
70
|
+
const rule = fieldMeta.isArray ? "repeated" : fieldMeta.nullable ? "optional" : "required";
|
|
71
|
+
const type = fieldMeta.isClass ? import_constant.constantInfo.getRefName(fieldMeta.modelRef) : fieldMeta.enum ? `${refName2}${(0, import_common.capitalize)(fieldMeta.key)}Enum` : protobufTypeMap.get(fieldMeta.modelRef) ?? "string";
|
|
72
|
+
return [fieldMeta.key, { type, id, rule }];
|
|
73
|
+
})
|
|
74
|
+
)
|
|
75
|
+
}
|
|
76
|
+
];
|
|
77
|
+
});
|
|
78
|
+
const modelJson = Object.fromEntries(modelDatas);
|
|
79
|
+
const enumDatas = allModelRefs.map((modelRef2) => {
|
|
80
|
+
const refName2 = import_constant.constantInfo.getRefName(modelRef2);
|
|
81
|
+
const enumMetas = (0, import_constant.getFieldEnumMetas)(modelRef2);
|
|
82
|
+
const enumJsons = enumMetas.map((enumMeta) => {
|
|
83
|
+
const enumName = `${refName2}${(0, import_common.capitalize)(enumMeta.key)}Enum`;
|
|
84
|
+
const enumData = {
|
|
85
|
+
values: Object.fromEntries(enumMeta.enum.values.map((value, idx) => [value, idx]))
|
|
86
|
+
};
|
|
87
|
+
return [enumName, enumData];
|
|
88
|
+
});
|
|
89
|
+
return enumJsons;
|
|
90
|
+
}).flat();
|
|
91
|
+
const enumJson = Object.fromEntries(enumDatas);
|
|
92
|
+
const protoJson = {
|
|
93
|
+
nested: {
|
|
94
|
+
[namespace]: {
|
|
95
|
+
nested: {
|
|
96
|
+
...modelJson,
|
|
97
|
+
...enumJson
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
const root = proto.Root.fromJSON(protoJson);
|
|
103
|
+
const protoModel = root.lookupType(`${namespace}.${refName}`);
|
|
104
|
+
setPredefinedProtoModel(modelRef, protoModel);
|
|
105
|
+
return protoModel;
|
|
106
|
+
};
|
|
107
|
+
class ProtoEncodeStorage {
|
|
108
|
+
}
|
|
109
|
+
const scalarProtoEncodeMap = /* @__PURE__ */ new Map([
|
|
110
|
+
[Date, (value) => (0, import_base.dayjs)(value).toDate().getTime()],
|
|
111
|
+
[String, (value) => value],
|
|
112
|
+
[import_base.ID, (value) => value],
|
|
113
|
+
[Boolean, (value) => value],
|
|
114
|
+
[import_base.Int, (value) => value],
|
|
115
|
+
[import_base.Float, (value) => value],
|
|
116
|
+
[import_base.JSON, (value) => JSON.stringify(value)]
|
|
117
|
+
]);
|
|
118
|
+
const getProtoEncodeFn = (modelRef) => {
|
|
119
|
+
const [valueRef] = (0, import_base.getNonArrayModel)(modelRef);
|
|
120
|
+
return scalarProtoEncodeMap.get(valueRef) ?? ((value) => value);
|
|
121
|
+
};
|
|
122
|
+
const protoEncode = (metadata, value) => {
|
|
123
|
+
if (metadata.nullable && (value === null || value === void 0))
|
|
124
|
+
return null;
|
|
125
|
+
if (metadata.isArray && Array.isArray(value)) {
|
|
126
|
+
return value.map((v) => protoEncode(metadata, v));
|
|
127
|
+
}
|
|
128
|
+
if (metadata.isMap && metadata.of) {
|
|
129
|
+
const protoEncodeFn = getProtoEncodeFn(metadata.of);
|
|
130
|
+
return Object.fromEntries(
|
|
131
|
+
[...value.entries()].map(([key, val]) => [key, (0, import_base.applyFnToArrayObjects)(val, protoEncodeFn)])
|
|
132
|
+
);
|
|
133
|
+
}
|
|
134
|
+
if (metadata.isClass)
|
|
135
|
+
return makeProtoEncode(metadata.modelRef)(value);
|
|
136
|
+
if (metadata.enum)
|
|
137
|
+
return metadata.enum.indexOf(value);
|
|
138
|
+
return getProtoEncodeFn(metadata.modelRef)(value);
|
|
139
|
+
};
|
|
140
|
+
const getPredefinedProtoEncodeFn = (refName) => {
|
|
141
|
+
const protoEncode2 = Reflect.getMetadata(refName, ProtoEncodeStorage.prototype);
|
|
142
|
+
return protoEncode2;
|
|
143
|
+
};
|
|
144
|
+
const setPredefinedProtoEncodeFn = (refName, protoEncode2) => {
|
|
145
|
+
Reflect.defineMetadata(refName, protoEncode2, ProtoEncodeStorage.prototype);
|
|
146
|
+
};
|
|
147
|
+
const makeProtoEncode = (modelRef) => {
|
|
148
|
+
const refName = import_constant.constantInfo.getRefName(modelRef);
|
|
149
|
+
const predefinedProtoEncode = getPredefinedProtoEncodeFn(refName);
|
|
150
|
+
if (predefinedProtoEncode)
|
|
151
|
+
return predefinedProtoEncode;
|
|
152
|
+
const fieldMetas = (0, import_constant.getFieldMetas)(modelRef);
|
|
153
|
+
const protoEncodeFn = (value) => {
|
|
154
|
+
const result = {};
|
|
155
|
+
fieldMetas.forEach((fieldMeta) => {
|
|
156
|
+
result[fieldMeta.key] = protoEncode(fieldMeta, value[fieldMeta.key]);
|
|
157
|
+
});
|
|
158
|
+
return result;
|
|
159
|
+
};
|
|
160
|
+
setPredefinedProtoEncodeFn(refName, protoEncodeFn);
|
|
161
|
+
return protoEncodeFn;
|
|
162
|
+
};
|
|
163
|
+
const encode = (modelRef, value) => {
|
|
164
|
+
try {
|
|
165
|
+
const protoModel = getProtoModel(modelRef);
|
|
166
|
+
const protoEncode2 = makeProtoEncode(modelRef);
|
|
167
|
+
const data = protoEncode2(value);
|
|
168
|
+
const errMsg = protoModel.verify(data);
|
|
169
|
+
if (errMsg) {
|
|
170
|
+
throw new Error(errMsg);
|
|
171
|
+
}
|
|
172
|
+
const message = protoModel.create(data);
|
|
173
|
+
const buffer = protoModel.encode(message).finish();
|
|
174
|
+
return buffer;
|
|
175
|
+
} catch (error) {
|
|
176
|
+
const errMsg = error instanceof Error ? error.message : String(error);
|
|
177
|
+
import_common.Logger.error(`Failed to encode ${modelRef.name}: ${errMsg}`);
|
|
178
|
+
return null;
|
|
179
|
+
}
|
|
180
|
+
};
|
|
181
|
+
class ProtoDecodeStorage {
|
|
182
|
+
}
|
|
183
|
+
const scalarProtoDecodeMap = /* @__PURE__ */ new Map([
|
|
184
|
+
[Date, (value) => (0, import_base.dayjs)(value)],
|
|
185
|
+
[String, (value) => value],
|
|
186
|
+
[import_base.ID, (value) => value],
|
|
187
|
+
[Boolean, (value) => value],
|
|
188
|
+
[import_base.Int, (value) => value],
|
|
189
|
+
[import_base.Float, (value) => value],
|
|
190
|
+
[import_base.JSON, (value) => JSON.parse(value)]
|
|
191
|
+
]);
|
|
192
|
+
const getProtoDecodeFn = (modelRef) => {
|
|
193
|
+
const [valueRef] = (0, import_base.getNonArrayModel)(modelRef);
|
|
194
|
+
return scalarProtoDecodeMap.get(valueRef) ?? ((value) => value);
|
|
195
|
+
};
|
|
196
|
+
const protoDecode = (metadata, value) => {
|
|
197
|
+
if (metadata.nullable && (value === null || value === void 0))
|
|
198
|
+
return null;
|
|
199
|
+
if (metadata.isArray) {
|
|
200
|
+
if (value === void 0)
|
|
201
|
+
return [];
|
|
202
|
+
if (Array.isArray(value))
|
|
203
|
+
return value.map((v) => protoDecode(metadata, v));
|
|
204
|
+
}
|
|
205
|
+
if (metadata.isMap && metadata.of) {
|
|
206
|
+
const protoDecodeFn = getProtoDecodeFn(metadata.of);
|
|
207
|
+
return new Map(
|
|
208
|
+
Object.entries(value).map(([key, val]) => [
|
|
209
|
+
key,
|
|
210
|
+
(0, import_base.applyFnToArrayObjects)(val, protoDecodeFn)
|
|
211
|
+
])
|
|
212
|
+
);
|
|
213
|
+
}
|
|
214
|
+
if (metadata.isClass)
|
|
215
|
+
return makeProtoDecode(metadata.modelRef)(value);
|
|
216
|
+
if (metadata.enum)
|
|
217
|
+
return metadata.enum.values.at(value);
|
|
218
|
+
return getProtoDecodeFn(metadata.modelRef)(value);
|
|
219
|
+
};
|
|
220
|
+
const getPredefinedProtoDecodeFn = (refName) => {
|
|
221
|
+
const protoDecode2 = Reflect.getMetadata(refName, ProtoDecodeStorage.prototype);
|
|
222
|
+
return protoDecode2;
|
|
223
|
+
};
|
|
224
|
+
const setPredefinedProtoDecodeFn = (refName, protoDecode2) => {
|
|
225
|
+
Reflect.defineMetadata(refName, protoDecode2, ProtoDecodeStorage.prototype);
|
|
226
|
+
};
|
|
227
|
+
const makeProtoDecode = (modelRef) => {
|
|
228
|
+
const refName = import_constant.constantInfo.getRefName(modelRef);
|
|
229
|
+
const predefinedProtoDecode = getPredefinedProtoDecodeFn(refName);
|
|
230
|
+
if (predefinedProtoDecode)
|
|
231
|
+
return predefinedProtoDecode;
|
|
232
|
+
const fieldMetas = (0, import_constant.getFieldMetas)(modelRef);
|
|
233
|
+
const protoDecodeFn = (value) => {
|
|
234
|
+
const result = {};
|
|
235
|
+
fieldMetas.forEach((fieldMeta) => {
|
|
236
|
+
result[fieldMeta.key] = protoDecode(fieldMeta, value[fieldMeta.key]);
|
|
237
|
+
});
|
|
238
|
+
return result;
|
|
239
|
+
};
|
|
240
|
+
setPredefinedProtoDecodeFn(refName, protoDecodeFn);
|
|
241
|
+
return protoDecodeFn;
|
|
242
|
+
};
|
|
243
|
+
const decode = (modelRef, buffer) => {
|
|
244
|
+
const protoModel = getProtoModel(modelRef);
|
|
245
|
+
const message = protoModel.decode(Buffer.from(buffer));
|
|
246
|
+
const data = protoModel.toObject(message);
|
|
247
|
+
const protoDecode2 = makeProtoDecode(modelRef);
|
|
248
|
+
const crystalize = (0, import_constant.makeCrystalize)(modelRef);
|
|
249
|
+
const result = crystalize(protoDecode2(data));
|
|
250
|
+
return result;
|
|
251
|
+
};
|
|
252
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
253
|
+
0 && (module.exports = {
|
|
254
|
+
decode,
|
|
255
|
+
encode
|
|
256
|
+
});
|
package/cjs/src/gql.js
CHANGED
|
@@ -109,7 +109,8 @@ const applyNestField = (model, fieldMeta, type = "object") => {
|
|
|
109
109
|
};
|
|
110
110
|
const generateGqlInput = (inputRef) => {
|
|
111
111
|
const refName = import_constant.constantInfo.getRefName(inputRef);
|
|
112
|
-
const
|
|
112
|
+
const modelType = import_constant.constantInfo.getModelType(inputRef);
|
|
113
|
+
const gqlName = `${(0, import_common.capitalize)(refName)}${modelType === "object" ? "Object" : "Input"}`;
|
|
113
114
|
const predefinedInputGql = getPredefinedInqutGql(gqlName);
|
|
114
115
|
if (predefinedInputGql)
|
|
115
116
|
return predefinedInputGql;
|
package/cjs/src/index.js
CHANGED
|
@@ -24,6 +24,7 @@ __reExport(src_exports, require("./websocket"), module.exports);
|
|
|
24
24
|
__reExport(src_exports, require("./boot"), module.exports);
|
|
25
25
|
__reExport(src_exports, require("./searchDaemon"), module.exports);
|
|
26
26
|
__reExport(src_exports, require("./schema"), module.exports);
|
|
27
|
+
__reExport(src_exports, require("./compressor"), module.exports);
|
|
27
28
|
// Annotate the CommonJS export names for ESM import in node:
|
|
28
29
|
0 && (module.exports = {
|
|
29
30
|
...require("./gql"),
|
|
@@ -35,5 +36,6 @@ __reExport(src_exports, require("./schema"), module.exports);
|
|
|
35
36
|
...require("./websocket"),
|
|
36
37
|
...require("./boot"),
|
|
37
38
|
...require("./searchDaemon"),
|
|
38
|
-
...require("./schema")
|
|
39
|
+
...require("./schema"),
|
|
40
|
+
...require("./compressor")
|
|
39
41
|
});
|
package/esm/src/boot.js
CHANGED
|
@@ -27,7 +27,7 @@ import {
|
|
|
27
27
|
SearchClient,
|
|
28
28
|
TimeoutInterceptor
|
|
29
29
|
} from "@akanjs/nest";
|
|
30
|
-
import {
|
|
30
|
+
import { signalInfo } from "@akanjs/signal";
|
|
31
31
|
import { ApolloDriver } from "@nestjs/apollo";
|
|
32
32
|
import { BullModule } from "@nestjs/bull";
|
|
33
33
|
import { Global, Module } from "@nestjs/common";
|
|
@@ -37,7 +37,6 @@ import { MongooseModule } from "@nestjs/mongoose";
|
|
|
37
37
|
import { ScheduleModule } from "@nestjs/schedule";
|
|
38
38
|
import { json, urlencoded } from "body-parser";
|
|
39
39
|
import cookieParser from "cookie-parser";
|
|
40
|
-
import dgram from "dgram";
|
|
41
40
|
import events from "events";
|
|
42
41
|
import { graphqlUploadExpress } from "graphql-upload";
|
|
43
42
|
import { MeiliSearch } from "meilisearch";
|
|
@@ -134,8 +133,6 @@ const createNestApp = async ({
|
|
|
134
133
|
const redisIoAdapter = new RedisIoAdapter(app, { jwtSecret });
|
|
135
134
|
await redisIoAdapter.connectToRedis(redisUri);
|
|
136
135
|
app.enableShutdownHooks();
|
|
137
|
-
const udp = dgram.createSocket("udp4");
|
|
138
|
-
client.setUdp(udp);
|
|
139
136
|
if (env.operationMode !== "local" && process.env.USE_REDIS_IO_ADAPTER !== "false")
|
|
140
137
|
app.useWebSocketAdapter(redisIoAdapter);
|
|
141
138
|
if (["federation", "all"].includes(serverMode)) {
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
import {
|
|
2
|
+
applyFnToArrayObjects,
|
|
3
|
+
dayjs,
|
|
4
|
+
Float,
|
|
5
|
+
getNonArrayModel,
|
|
6
|
+
ID,
|
|
7
|
+
Int,
|
|
8
|
+
JSON as GqlJSON
|
|
9
|
+
} from "@akanjs/base";
|
|
10
|
+
import { capitalize, Logger } from "@akanjs/common";
|
|
11
|
+
import {
|
|
12
|
+
constantInfo,
|
|
13
|
+
getChildClassRefs,
|
|
14
|
+
getFieldEnumMetas,
|
|
15
|
+
getFieldMetas,
|
|
16
|
+
makeCrystalize
|
|
17
|
+
} from "@akanjs/constant";
|
|
18
|
+
import * as proto from "protobufjs";
|
|
19
|
+
class ProtoModelStorage {
|
|
20
|
+
}
|
|
21
|
+
const protobufTypeMap = /* @__PURE__ */ new Map([
|
|
22
|
+
[String, "string"],
|
|
23
|
+
[Int, "int32"],
|
|
24
|
+
[Float, "float"],
|
|
25
|
+
[Boolean, "bool"],
|
|
26
|
+
[Date, "double"]
|
|
27
|
+
]);
|
|
28
|
+
const getPredefinedProtoModel = (modelRef) => {
|
|
29
|
+
const protoModel = Reflect.getMetadata(modelRef, ProtoModelStorage.prototype);
|
|
30
|
+
return protoModel;
|
|
31
|
+
};
|
|
32
|
+
const setPredefinedProtoModel = (modelRef, protoModel) => {
|
|
33
|
+
Reflect.defineMetadata(modelRef, protoModel, ProtoModelStorage.prototype);
|
|
34
|
+
};
|
|
35
|
+
const getProtoModel = (modelRef) => {
|
|
36
|
+
const refName = constantInfo.getRefName(modelRef);
|
|
37
|
+
const predefinedProtoModel = getPredefinedProtoModel(modelRef);
|
|
38
|
+
if (predefinedProtoModel)
|
|
39
|
+
return predefinedProtoModel;
|
|
40
|
+
const namespace = refName.toLowerCase();
|
|
41
|
+
const childModelRefs = getChildClassRefs(modelRef);
|
|
42
|
+
const allModelRefs = [modelRef, ...childModelRefs];
|
|
43
|
+
const modelDatas = allModelRefs.map((modelRef2) => {
|
|
44
|
+
const refName2 = constantInfo.getRefName(modelRef2);
|
|
45
|
+
const fieldMetas = getFieldMetas(modelRef2);
|
|
46
|
+
return [
|
|
47
|
+
refName2,
|
|
48
|
+
{
|
|
49
|
+
fields: Object.fromEntries(
|
|
50
|
+
fieldMetas.map((fieldMeta, id) => {
|
|
51
|
+
const rule = fieldMeta.isArray ? "repeated" : fieldMeta.nullable ? "optional" : "required";
|
|
52
|
+
const type = fieldMeta.isClass ? constantInfo.getRefName(fieldMeta.modelRef) : fieldMeta.enum ? `${refName2}${capitalize(fieldMeta.key)}Enum` : protobufTypeMap.get(fieldMeta.modelRef) ?? "string";
|
|
53
|
+
return [fieldMeta.key, { type, id, rule }];
|
|
54
|
+
})
|
|
55
|
+
)
|
|
56
|
+
}
|
|
57
|
+
];
|
|
58
|
+
});
|
|
59
|
+
const modelJson = Object.fromEntries(modelDatas);
|
|
60
|
+
const enumDatas = allModelRefs.map((modelRef2) => {
|
|
61
|
+
const refName2 = constantInfo.getRefName(modelRef2);
|
|
62
|
+
const enumMetas = getFieldEnumMetas(modelRef2);
|
|
63
|
+
const enumJsons = enumMetas.map((enumMeta) => {
|
|
64
|
+
const enumName = `${refName2}${capitalize(enumMeta.key)}Enum`;
|
|
65
|
+
const enumData = {
|
|
66
|
+
values: Object.fromEntries(enumMeta.enum.values.map((value, idx) => [value, idx]))
|
|
67
|
+
};
|
|
68
|
+
return [enumName, enumData];
|
|
69
|
+
});
|
|
70
|
+
return enumJsons;
|
|
71
|
+
}).flat();
|
|
72
|
+
const enumJson = Object.fromEntries(enumDatas);
|
|
73
|
+
const protoJson = {
|
|
74
|
+
nested: {
|
|
75
|
+
[namespace]: {
|
|
76
|
+
nested: {
|
|
77
|
+
...modelJson,
|
|
78
|
+
...enumJson
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
const root = proto.Root.fromJSON(protoJson);
|
|
84
|
+
const protoModel = root.lookupType(`${namespace}.${refName}`);
|
|
85
|
+
setPredefinedProtoModel(modelRef, protoModel);
|
|
86
|
+
return protoModel;
|
|
87
|
+
};
|
|
88
|
+
class ProtoEncodeStorage {
|
|
89
|
+
}
|
|
90
|
+
const scalarProtoEncodeMap = /* @__PURE__ */ new Map([
|
|
91
|
+
[Date, (value) => dayjs(value).toDate().getTime()],
|
|
92
|
+
[String, (value) => value],
|
|
93
|
+
[ID, (value) => value],
|
|
94
|
+
[Boolean, (value) => value],
|
|
95
|
+
[Int, (value) => value],
|
|
96
|
+
[Float, (value) => value],
|
|
97
|
+
[GqlJSON, (value) => JSON.stringify(value)]
|
|
98
|
+
]);
|
|
99
|
+
const getProtoEncodeFn = (modelRef) => {
|
|
100
|
+
const [valueRef] = getNonArrayModel(modelRef);
|
|
101
|
+
return scalarProtoEncodeMap.get(valueRef) ?? ((value) => value);
|
|
102
|
+
};
|
|
103
|
+
const protoEncode = (metadata, value) => {
|
|
104
|
+
if (metadata.nullable && (value === null || value === void 0))
|
|
105
|
+
return null;
|
|
106
|
+
if (metadata.isArray && Array.isArray(value)) {
|
|
107
|
+
return value.map((v) => protoEncode(metadata, v));
|
|
108
|
+
}
|
|
109
|
+
if (metadata.isMap && metadata.of) {
|
|
110
|
+
const protoEncodeFn = getProtoEncodeFn(metadata.of);
|
|
111
|
+
return Object.fromEntries(
|
|
112
|
+
[...value.entries()].map(([key, val]) => [key, applyFnToArrayObjects(val, protoEncodeFn)])
|
|
113
|
+
);
|
|
114
|
+
}
|
|
115
|
+
if (metadata.isClass)
|
|
116
|
+
return makeProtoEncode(metadata.modelRef)(value);
|
|
117
|
+
if (metadata.enum)
|
|
118
|
+
return metadata.enum.indexOf(value);
|
|
119
|
+
return getProtoEncodeFn(metadata.modelRef)(value);
|
|
120
|
+
};
|
|
121
|
+
const getPredefinedProtoEncodeFn = (refName) => {
|
|
122
|
+
const protoEncode2 = Reflect.getMetadata(refName, ProtoEncodeStorage.prototype);
|
|
123
|
+
return protoEncode2;
|
|
124
|
+
};
|
|
125
|
+
const setPredefinedProtoEncodeFn = (refName, protoEncode2) => {
|
|
126
|
+
Reflect.defineMetadata(refName, protoEncode2, ProtoEncodeStorage.prototype);
|
|
127
|
+
};
|
|
128
|
+
const makeProtoEncode = (modelRef) => {
|
|
129
|
+
const refName = constantInfo.getRefName(modelRef);
|
|
130
|
+
const predefinedProtoEncode = getPredefinedProtoEncodeFn(refName);
|
|
131
|
+
if (predefinedProtoEncode)
|
|
132
|
+
return predefinedProtoEncode;
|
|
133
|
+
const fieldMetas = getFieldMetas(modelRef);
|
|
134
|
+
const protoEncodeFn = (value) => {
|
|
135
|
+
const result = {};
|
|
136
|
+
fieldMetas.forEach((fieldMeta) => {
|
|
137
|
+
result[fieldMeta.key] = protoEncode(fieldMeta, value[fieldMeta.key]);
|
|
138
|
+
});
|
|
139
|
+
return result;
|
|
140
|
+
};
|
|
141
|
+
setPredefinedProtoEncodeFn(refName, protoEncodeFn);
|
|
142
|
+
return protoEncodeFn;
|
|
143
|
+
};
|
|
144
|
+
const encode = (modelRef, value) => {
|
|
145
|
+
try {
|
|
146
|
+
const protoModel = getProtoModel(modelRef);
|
|
147
|
+
const protoEncode2 = makeProtoEncode(modelRef);
|
|
148
|
+
const data = protoEncode2(value);
|
|
149
|
+
const errMsg = protoModel.verify(data);
|
|
150
|
+
if (errMsg) {
|
|
151
|
+
throw new Error(errMsg);
|
|
152
|
+
}
|
|
153
|
+
const message = protoModel.create(data);
|
|
154
|
+
const buffer = protoModel.encode(message).finish();
|
|
155
|
+
return buffer;
|
|
156
|
+
} catch (error) {
|
|
157
|
+
const errMsg = error instanceof Error ? error.message : String(error);
|
|
158
|
+
Logger.error(`Failed to encode ${modelRef.name}: ${errMsg}`);
|
|
159
|
+
return null;
|
|
160
|
+
}
|
|
161
|
+
};
|
|
162
|
+
class ProtoDecodeStorage {
|
|
163
|
+
}
|
|
164
|
+
const scalarProtoDecodeMap = /* @__PURE__ */ new Map([
|
|
165
|
+
[Date, (value) => dayjs(value)],
|
|
166
|
+
[String, (value) => value],
|
|
167
|
+
[ID, (value) => value],
|
|
168
|
+
[Boolean, (value) => value],
|
|
169
|
+
[Int, (value) => value],
|
|
170
|
+
[Float, (value) => value],
|
|
171
|
+
[GqlJSON, (value) => JSON.parse(value)]
|
|
172
|
+
]);
|
|
173
|
+
const getProtoDecodeFn = (modelRef) => {
|
|
174
|
+
const [valueRef] = getNonArrayModel(modelRef);
|
|
175
|
+
return scalarProtoDecodeMap.get(valueRef) ?? ((value) => value);
|
|
176
|
+
};
|
|
177
|
+
const protoDecode = (metadata, value) => {
|
|
178
|
+
if (metadata.nullable && (value === null || value === void 0))
|
|
179
|
+
return null;
|
|
180
|
+
if (metadata.isArray) {
|
|
181
|
+
if (value === void 0)
|
|
182
|
+
return [];
|
|
183
|
+
if (Array.isArray(value))
|
|
184
|
+
return value.map((v) => protoDecode(metadata, v));
|
|
185
|
+
}
|
|
186
|
+
if (metadata.isMap && metadata.of) {
|
|
187
|
+
const protoDecodeFn = getProtoDecodeFn(metadata.of);
|
|
188
|
+
return new Map(
|
|
189
|
+
Object.entries(value).map(([key, val]) => [
|
|
190
|
+
key,
|
|
191
|
+
applyFnToArrayObjects(val, protoDecodeFn)
|
|
192
|
+
])
|
|
193
|
+
);
|
|
194
|
+
}
|
|
195
|
+
if (metadata.isClass)
|
|
196
|
+
return makeProtoDecode(metadata.modelRef)(value);
|
|
197
|
+
if (metadata.enum)
|
|
198
|
+
return metadata.enum.values.at(value);
|
|
199
|
+
return getProtoDecodeFn(metadata.modelRef)(value);
|
|
200
|
+
};
|
|
201
|
+
const getPredefinedProtoDecodeFn = (refName) => {
|
|
202
|
+
const protoDecode2 = Reflect.getMetadata(refName, ProtoDecodeStorage.prototype);
|
|
203
|
+
return protoDecode2;
|
|
204
|
+
};
|
|
205
|
+
const setPredefinedProtoDecodeFn = (refName, protoDecode2) => {
|
|
206
|
+
Reflect.defineMetadata(refName, protoDecode2, ProtoDecodeStorage.prototype);
|
|
207
|
+
};
|
|
208
|
+
const makeProtoDecode = (modelRef) => {
|
|
209
|
+
const refName = constantInfo.getRefName(modelRef);
|
|
210
|
+
const predefinedProtoDecode = getPredefinedProtoDecodeFn(refName);
|
|
211
|
+
if (predefinedProtoDecode)
|
|
212
|
+
return predefinedProtoDecode;
|
|
213
|
+
const fieldMetas = getFieldMetas(modelRef);
|
|
214
|
+
const protoDecodeFn = (value) => {
|
|
215
|
+
const result = {};
|
|
216
|
+
fieldMetas.forEach((fieldMeta) => {
|
|
217
|
+
result[fieldMeta.key] = protoDecode(fieldMeta, value[fieldMeta.key]);
|
|
218
|
+
});
|
|
219
|
+
return result;
|
|
220
|
+
};
|
|
221
|
+
setPredefinedProtoDecodeFn(refName, protoDecodeFn);
|
|
222
|
+
return protoDecodeFn;
|
|
223
|
+
};
|
|
224
|
+
const decode = (modelRef, buffer) => {
|
|
225
|
+
const protoModel = getProtoModel(modelRef);
|
|
226
|
+
const message = protoModel.decode(Buffer.from(buffer));
|
|
227
|
+
const data = protoModel.toObject(message);
|
|
228
|
+
const protoDecode2 = makeProtoDecode(modelRef);
|
|
229
|
+
const crystalize = makeCrystalize(modelRef);
|
|
230
|
+
const result = crystalize(protoDecode2(data));
|
|
231
|
+
return result;
|
|
232
|
+
};
|
|
233
|
+
export {
|
|
234
|
+
decode,
|
|
235
|
+
encode
|
|
236
|
+
};
|
package/esm/src/gql.js
CHANGED
|
@@ -76,7 +76,8 @@ const applyNestField = (model, fieldMeta, type = "object") => {
|
|
|
76
76
|
};
|
|
77
77
|
const generateGqlInput = (inputRef) => {
|
|
78
78
|
const refName = constantInfo.getRefName(inputRef);
|
|
79
|
-
const
|
|
79
|
+
const modelType = constantInfo.getModelType(inputRef);
|
|
80
|
+
const gqlName = `${capitalize(refName)}${modelType === "object" ? "Object" : "Input"}`;
|
|
80
81
|
const predefinedInputGql = getPredefinedInqutGql(gqlName);
|
|
81
82
|
if (predefinedInputGql)
|
|
82
83
|
return predefinedInputGql;
|
package/esm/src/index.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@akanjs/server",
|
|
3
|
-
"version": "0.9.58-canary.
|
|
3
|
+
"version": "0.9.58-canary.2",
|
|
4
4
|
"sourceType": "module",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
@@ -37,6 +37,7 @@
|
|
|
37
37
|
"graphql-upload": "12.0.0",
|
|
38
38
|
"meilisearch": "^0.47.0",
|
|
39
39
|
"mongoose": "^8.9.3",
|
|
40
|
+
"protobufjs": "^7.5.4",
|
|
40
41
|
"redis": "^4.7.0",
|
|
41
42
|
"rxjs": "^7.8.2"
|
|
42
43
|
},
|
package/src/index.d.ts
CHANGED
package/src/module.d.ts
CHANGED
|
@@ -4,7 +4,7 @@ import { Database } from "@akanjs/document";
|
|
|
4
4
|
import { DynamicModule } from "@nestjs/common";
|
|
5
5
|
import type { NextFunction, Request, Response } from "express";
|
|
6
6
|
interface DatabaseModuleCreateOptions {
|
|
7
|
-
constant: ConstantModel<string, any, any, any, any>;
|
|
7
|
+
constant: ConstantModel<string, any, any, any, any, any>;
|
|
8
8
|
database: Database<string, any, any, any, any, any, any, any>;
|
|
9
9
|
signal: Type;
|
|
10
10
|
service: Type;
|