@things-factory/shell 8.0.2 → 9.0.0-beta.12

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.
Files changed (174) hide show
  1. package/_index.html +0 -1
  2. package/bin/things-factory-migration +6 -3
  3. package/client/themes/calendar-theme.css +3 -1
  4. package/client/themes/index.css +2 -1
  5. package/dist-server/index.d.ts +12 -12
  6. package/dist-server/index.js +12 -12
  7. package/dist-server/index.js.map +1 -1
  8. package/dist-server/initializers/database.js +4 -10
  9. package/dist-server/initializers/database.js.map +1 -1
  10. package/dist-server/initializers/ormconfig.d.ts +2 -0
  11. package/dist-server/initializers/ormconfig.js +30 -0
  12. package/dist-server/initializers/ormconfig.js.map +1 -0
  13. package/dist-server/middlewares/domain-middleware.js +2 -2
  14. package/dist-server/middlewares/domain-middleware.js.map +1 -1
  15. package/dist-server/middlewares/index.d.ts +1 -1
  16. package/dist-server/middlewares/index.js +3 -3
  17. package/dist-server/middlewares/index.js.map +1 -1
  18. package/dist-server/migrations/1000000000000-SeedDomain.js +4 -4
  19. package/dist-server/migrations/1000000000000-SeedDomain.js.map +1 -1
  20. package/dist-server/migrations/index.js.map +1 -1
  21. package/dist-server/process-cleaner.d.ts +1 -0
  22. package/dist-server/process-cleaner.js +92 -0
  23. package/dist-server/process-cleaner.js.map +1 -0
  24. package/dist-server/routers/domain-router.js +3 -3
  25. package/dist-server/routers/domain-router.js.map +1 -1
  26. package/dist-server/routers/global-router.js +6 -6
  27. package/dist-server/routers/global-router.js.map +1 -1
  28. package/dist-server/routers/index.d.ts +3 -3
  29. package/dist-server/routers/index.js +3 -3
  30. package/dist-server/routers/index.js.map +1 -1
  31. package/dist-server/schema.js +5 -4
  32. package/dist-server/schema.js.map +1 -1
  33. package/dist-server/server-dev.js +37 -39
  34. package/dist-server/server-dev.js.map +1 -1
  35. package/dist-server/server.js +33 -35
  36. package/dist-server/server.js.map +1 -1
  37. package/dist-server/service/attribute-set/attribute-set-item-type.js +3 -3
  38. package/dist-server/service/attribute-set/attribute-set-item-type.js.map +1 -1
  39. package/dist-server/service/attribute-set/attribute-set-mutation.d.ts +2 -2
  40. package/dist-server/service/attribute-set/attribute-set-mutation.js +16 -16
  41. package/dist-server/service/attribute-set/attribute-set-mutation.js.map +1 -1
  42. package/dist-server/service/attribute-set/attribute-set-query.d.ts +3 -3
  43. package/dist-server/service/attribute-set/attribute-set-query.js +15 -15
  44. package/dist-server/service/attribute-set/attribute-set-query.js.map +1 -1
  45. package/dist-server/service/attribute-set/attribute-set-type.d.ts +2 -2
  46. package/dist-server/service/attribute-set/attribute-set-type.js +5 -5
  47. package/dist-server/service/attribute-set/attribute-set-type.js.map +1 -1
  48. package/dist-server/service/attribute-set/attribute-set.d.ts +1 -1
  49. package/dist-server/service/attribute-set/attribute-set.js +2 -2
  50. package/dist-server/service/attribute-set/attribute-set.js.map +1 -1
  51. package/dist-server/service/attribute-set/index.d.ts +3 -3
  52. package/dist-server/service/attribute-set/index.js +5 -5
  53. package/dist-server/service/attribute-set/index.js.map +1 -1
  54. package/dist-server/service/common-types/index.d.ts +6 -6
  55. package/dist-server/service/common-types/index.js +6 -6
  56. package/dist-server/service/common-types/index.js.map +1 -1
  57. package/dist-server/service/common-types/list-param.js +2 -2
  58. package/dist-server/service/common-types/list-param.js.map +1 -1
  59. package/dist-server/service/common-types/log.js +2 -2
  60. package/dist-server/service/common-types/log.js.map +1 -1
  61. package/dist-server/service/common-types/scalar-object.d.ts +2 -1
  62. package/dist-server/service/common-types/scalar-object.js +2 -2
  63. package/dist-server/service/common-types/scalar-object.js.map +1 -1
  64. package/dist-server/service/directive-transaction/index.d.ts +1 -1
  65. package/dist-server/service/directive-transaction/index.js +1 -1
  66. package/dist-server/service/directive-transaction/index.js.map +1 -1
  67. package/dist-server/service/directive-transaction/transaction.js +2 -2
  68. package/dist-server/service/directive-transaction/transaction.js.map +1 -1
  69. package/dist-server/service/domain/domain-mutation.d.ts +2 -2
  70. package/dist-server/service/domain/domain-mutation.js +21 -21
  71. package/dist-server/service/domain/domain-mutation.js.map +1 -1
  72. package/dist-server/service/domain/domain-query.d.ts +3 -3
  73. package/dist-server/service/domain/domain-query.js +18 -18
  74. package/dist-server/service/domain/domain-query.js.map +1 -1
  75. package/dist-server/service/domain/domain-types.d.ts +2 -2
  76. package/dist-server/service/domain/domain-types.js +6 -6
  77. package/dist-server/service/domain/domain-types.js.map +1 -1
  78. package/dist-server/service/domain/domain.js +3 -3
  79. package/dist-server/service/domain/domain.js.map +1 -1
  80. package/dist-server/service/domain/index.d.ts +3 -3
  81. package/dist-server/service/domain/index.js +5 -5
  82. package/dist-server/service/domain/index.js.map +1 -1
  83. package/dist-server/service/index.d.ts +7 -7
  84. package/dist-server/service/index.js +16 -16
  85. package/dist-server/service/index.js.map +1 -1
  86. package/dist-server/service/subscription-data/data-resolver.d.ts +1 -1
  87. package/dist-server/service/subscription-data/data-resolver.js +4 -4
  88. package/dist-server/service/subscription-data/data-resolver.js.map +1 -1
  89. package/dist-server/service/subscription-data/data-types.d.ts +1 -1
  90. package/dist-server/service/subscription-data/data-types.js +5 -5
  91. package/dist-server/service/subscription-data/data-types.js.map +1 -1
  92. package/dist-server/service/subscription-data/index.d.ts +1 -1
  93. package/dist-server/service/subscription-data/index.js +2 -2
  94. package/dist-server/service/subscription-data/index.js.map +1 -1
  95. package/dist-server/tsconfig.tsbuildinfo +1 -1
  96. package/dist-server/typeorm/encrypt-transform.js +3 -3
  97. package/dist-server/typeorm/encrypt-transform.js.map +1 -1
  98. package/dist-server/utils/get-query-builder-from-list-params.d.ts +2 -2
  99. package/dist-server/utils/get-query-builder-from-list-params.js +5 -5
  100. package/dist-server/utils/get-query-builder-from-list-params.js.map +1 -1
  101. package/dist-server/utils/index.d.ts +8 -8
  102. package/dist-server/utils/index.js +8 -8
  103. package/dist-server/utils/index.js.map +1 -1
  104. package/dist-server/utils/list-param-adjuster.d.ts +1 -1
  105. package/dist-server/utils/list-param-adjuster.js.map +1 -1
  106. package/dist-server/utils/list-params-converter.d.ts +2 -2
  107. package/dist-server/utils/list-params-converter.js +2 -2
  108. package/dist-server/utils/list-params-converter.js.map +1 -1
  109. package/dist-server/utils/list-query-builder.d.ts +1 -1
  110. package/dist-server/utils/list-query-builder.js +7 -7
  111. package/dist-server/utils/list-query-builder.js.map +1 -1
  112. package/dist-server/utils/publish-progress.js +2 -2
  113. package/dist-server/utils/publish-progress.js.map +1 -1
  114. package/package.json +16 -19
  115. package/views/public/home.html +0 -1
  116. package/client/hot-client/hot.js +0 -140
  117. package/client/hot-client/index.js +0 -103
  118. package/client/hot-client/log.js +0 -44
  119. package/client/hot-client/socket.js +0 -63
  120. package/ormconfig.js +0 -31
  121. package/server/graphql-local-client.ts +0 -59
  122. package/server/index.ts +0 -13
  123. package/server/initializers/database.ts +0 -96
  124. package/server/initializers/naming-strategy.ts +0 -14
  125. package/server/middlewares/domain-middleware.ts +0 -60
  126. package/server/middlewares/index.ts +0 -43
  127. package/server/migrations/1000000000000-SeedDomain.ts +0 -37
  128. package/server/migrations/index.ts +0 -9
  129. package/server/pubsub-log-transport.ts +0 -59
  130. package/server/pubsub.ts +0 -84
  131. package/server/routers/domain-router.ts +0 -13
  132. package/server/routers/global-router.ts +0 -76
  133. package/server/routers/graphql-router.ts +0 -3
  134. package/server/routers/index.ts +0 -3
  135. package/server/schema.ts +0 -163
  136. package/server/server-dev.ts +0 -305
  137. package/server/server.ts +0 -296
  138. package/server/service/attribute-set/attribute-set-item-type.ts +0 -65
  139. package/server/service/attribute-set/attribute-set-mutation.ts +0 -125
  140. package/server/service/attribute-set/attribute-set-query.ts +0 -36
  141. package/server/service/attribute-set/attribute-set-type.ts +0 -46
  142. package/server/service/attribute-set/attribute-set.ts +0 -35
  143. package/server/service/attribute-set/index.ts +0 -6
  144. package/server/service/common-types/index.ts +0 -6
  145. package/server/service/common-types/list-param.ts +0 -61
  146. package/server/service/common-types/log.ts +0 -17
  147. package/server/service/common-types/object-ref.ts +0 -13
  148. package/server/service/common-types/scalar-any.ts +0 -44
  149. package/server/service/common-types/scalar-date.ts +0 -22
  150. package/server/service/common-types/scalar-object.ts +0 -15
  151. package/server/service/directive-transaction/index.ts +0 -1
  152. package/server/service/directive-transaction/transaction.ts +0 -40
  153. package/server/service/domain/domain-mutation.ts +0 -120
  154. package/server/service/domain/domain-query.ts +0 -48
  155. package/server/service/domain/domain-types.ts +0 -63
  156. package/server/service/domain/domain.ts +0 -147
  157. package/server/service/domain/index.ts +0 -6
  158. package/server/service/index.ts +0 -32
  159. package/server/service/subscription-data/data-resolver.ts +0 -37
  160. package/server/service/subscription-data/data-types.ts +0 -16
  161. package/server/service/subscription-data/index.ts +0 -4
  162. package/server/typeorm/encrypt-transform.ts +0 -70
  163. package/server/typeorm/get-data-encryption-key.ts +0 -13
  164. package/server/typeorm/json5-transform.ts +0 -26
  165. package/server/typeorm/round-transform.ts +0 -20
  166. package/server/utils/condition-builder.ts +0 -145
  167. package/server/utils/get-domain.ts +0 -226
  168. package/server/utils/get-query-builder-from-list-params.ts +0 -469
  169. package/server/utils/get-times-for-period.ts +0 -60
  170. package/server/utils/index.ts +0 -8
  171. package/server/utils/list-param-adjuster.ts +0 -21
  172. package/server/utils/list-params-converter.ts +0 -200
  173. package/server/utils/list-query-builder.ts +0 -120
  174. package/server/utils/publish-progress.ts +0 -23
@@ -1,305 +0,0 @@
1
- // ts-import-sorter: disable
2
-
3
- /* following 7 lines should be located in top of the file */
4
- const OS = require('os')
5
- process.env.UV_THREADPOOL_SIZE = OS.cpus().length
6
-
7
- console.log('UV_THREADPOOL_SIZE', process.env.UV_THREADPOOL_SIZE)
8
-
9
- process.env.NODE_ENV = 'development'
10
- process.setMaxListeners(0)
11
-
12
- import { ApolloServer } from '@apollo/server'
13
- import { ApolloServerPluginDrainHttpServer } from '@apollo/server/plugin/drainHttpServer'
14
- import { ApolloServerPluginLandingPageLocalDefault } from '@apollo/server/plugin/landingPage/default'
15
-
16
- import { koaMiddleware } from '@as-integrations/koa'
17
- import bytesFormat from 'bytes'
18
- import graphqlUploadKoa from 'graphql-upload/graphqlUploadKoa.js'
19
- import { useServer } from 'graphql-ws/lib/use/ws'
20
- import { createServer } from 'http'
21
- import Koa from 'koa'
22
- import koaBodyParser from 'koa-bodyparser'
23
- import compose from 'koa-compose'
24
- import { historyApiFallback } from 'koa2-connect-history-api-fallback'
25
- import { WebSocketServer } from 'ws'
26
- import co from 'co'
27
- import http from 'http'
28
-
29
- import cors from '@koa/cors'
30
-
31
- import crypto from 'crypto'
32
-
33
- import { config, loader, logger, orderedModuleNames } from '@things-factory/env'
34
- import { initLicense, checkValidity } from '@things-factory/operato-license-checker'
35
-
36
- import { GraphqlLocalClient } from './graphql-local-client'
37
- import { databaseInitializer } from './initializers/database'
38
- import {
39
- domainPrivateRouter,
40
- domainPublicRouter,
41
- globalPrivateRouter,
42
- globalPublicRouter,
43
- graphqlRouter
44
- } from './routers'
45
- import { schema } from './schema'
46
- import { Domain } from './service'
47
- import { EntityManager } from 'typeorm'
48
- import { domainMiddleware } from './middlewares'
49
- const wdm = require('webpack-dev-middleware')
50
-
51
- process.on('uncaughtException', error => {
52
- logger.error('uncaughtException: ', error)
53
-
54
- //process.exit(1)
55
- })
56
-
57
- const args = require('args')
58
-
59
- args.option('port', 'The port on which the app will be running', config.get('port', 3000))
60
- args.option(
61
- 'inspect',
62
- `The address on which the inspection will be running. Used in development mode only.
63
- This option is just to prevent termination for reasons of not recognizing the 'inspect' option.`,
64
- config.get('inspect', ':9229')
65
- )
66
- args.option('webpack', 'webpack configuration file', config.get('webpack'))
67
-
68
- const flags = args.parse(process.argv)
69
-
70
- const webpack = require('webpack')
71
- const webpackConfig = require(flags.webpack || '@things-factory/builder/webpack.config.dev.js')
72
-
73
- const compiler = webpack(webpackConfig)
74
-
75
- const PORT = (process.env.PORT = flags.port)
76
-
77
- const requestBody = config.get('requestBody') || {}
78
-
79
- const bodyParserOption = {
80
- formLimit: requestBody.formLimit || '10mb',
81
- jsonLimit: requestBody.jsonLimit || '10mb',
82
- textLimit: requestBody.textLimit || '10mb'
83
- }
84
-
85
- const fileUpload = config.get('fileUpload') || {}
86
- const fileUploadOption = {
87
- maxFileSize: bytesFormat.parse(fileUpload.maxFileSize) || bytesFormat.parse('10mb'),
88
- maxFiles: fileUpload.maxFiles || 10
89
- }
90
-
91
- interface ICustomAppState {
92
- domain: Domain
93
- user: any
94
- tx: EntityManager
95
- }
96
-
97
- interface ICustomAppContext {
98
- t: any
99
- ssoMiddlewares: any[]
100
- }
101
-
102
- initLicense(config.get('licenseKey'))
103
-
104
- /* bootstrap */
105
- const bootstrap = async () => {
106
- await databaseInitializer()
107
-
108
- const app = new Koa<ICustomAppState, ICustomAppContext>() as any
109
- app.proxy = true
110
-
111
- app.use(
112
- cors({
113
- origin: function (ctx) {
114
- return ctx.request.headers.origin || '*'
115
- },
116
- exposeHeaders: ['WWW-Authenticate', 'Server-Authorization'],
117
- maxAge: 5,
118
- credentials: true,
119
- /* allowMethods: ['GET', 'POST', 'DELETE'], -- use default */
120
- allowHeaders: ['Content-Type', 'Authorization', 'Accept']
121
- })
122
- )
123
-
124
- app.use(async (ctx, next) => {
125
- ctx.set('X-Content-Type-Options', 'nosniff')
126
-
127
- const { directives = {} } = config.get('CSP') || {}
128
-
129
- const nonce = crypto.randomBytes(16).toString('base64')
130
- ctx.state.nonce = nonce
131
-
132
- const cspHeader = Object.entries(directives as { [key: string]: string[] })
133
- .map(([key, value]) => `${key} ${value.join(' ')}`)
134
- .join('; ')
135
-
136
- ctx.set('Content-Security-Policy', cspHeader)
137
-
138
- await next()
139
- })
140
-
141
- var subscriptionMiddleware = []
142
- process.emit('bootstrap-module-subscription' as any, app, subscriptionMiddleware)
143
-
144
- const builtSchema = await schema()
145
-
146
- const httpServer = createServer(app.callback())
147
- const websocketServer = new WebSocketServer({
148
- server: httpServer,
149
- path: '/graphql'
150
- })
151
-
152
- // Save the returned server's info so we can shut down this server later
153
- const serverCleanup = useServer(
154
- {
155
- schema: builtSchema,
156
- context: async (ctx, msg, args) => {
157
- return ctx['context']
158
- },
159
- onConnect: async ctx => {
160
- var { extra, connectionParams } = ctx
161
- var { request } = extra
162
-
163
- if (((connectionParams['headers'] as any) || connectionParams)?.referer) {
164
- var url = new URL(((connectionParams['headers'] as any) || connectionParams).referer)
165
- var accessToken = url.searchParams.get('access_token')
166
- if (accessToken) {
167
- connectionParams['headers']['authorization'] = accessToken
168
- }
169
- }
170
-
171
- request.headers = {
172
- ...request.headers,
173
- ...(connectionParams['headers'] || (connectionParams as any))
174
- }
175
-
176
- var koacontext = await app.createContext(request, new http.ServerResponse(request))
177
- koacontext['state'] = {}
178
-
179
- /* in case connect error(like a authentication error) just throw exception */
180
- var middlewares = [domainMiddleware, ...subscriptionMiddleware]
181
- const fn = co.wrap(compose(middlewares))
182
-
183
- await fn(koacontext)
184
-
185
- return (ctx['context'] = koacontext)
186
- },
187
- onDisconnect(ctx, code, reason) {
188
- console.log('Disconnected!')
189
- },
190
- onError(ctx, msg, errors) {
191
- console.error(msg, errors)
192
- }
193
- },
194
- websocketServer
195
- )
196
-
197
- const server = new ApolloServer({
198
- schema: builtSchema,
199
- formatError: error => {
200
- logger.error(error)
201
- return error
202
- },
203
- introspection: true,
204
- csrfPrevention: true,
205
- plugins: [
206
- // Proper shutdown for the HTTP server.
207
- ApolloServerPluginDrainHttpServer({ httpServer }),
208
- // Proper shutdown for the WebSocket server.
209
- {
210
- async serverWillStart() {
211
- return {
212
- async drainServer() {
213
- await serverCleanup.dispose()
214
- }
215
- }
216
- }
217
- },
218
- // TODO make this landing page work
219
- ApolloServerPluginLandingPageLocalDefault({
220
- footer: false,
221
- embed: true,
222
- includeCookies: true
223
- })
224
- ],
225
- cache: 'bounded'
226
- })
227
-
228
- await server.start()
229
-
230
- GraphqlLocalClient.init(builtSchema, app)
231
-
232
- orderedModuleNames.forEach(name => {
233
- const { initMiddlewares } = loader(name)
234
- initMiddlewares && initMiddlewares(app)
235
- })
236
-
237
- const render = require('@things-factory/ejs-remote')
238
- render(app, {
239
- root: '/views',
240
- host: `http://127.0.0.1:${PORT}`,
241
- layout: false,
242
- viewExt: 'html',
243
- cache: false,
244
- debug: false
245
- })
246
-
247
- // only for development mode. triggered after webpack compilation is done.
248
- compiler.hooks.done.tap({ name: 'server-dev' }, stats => {
249
- process.emit('client-rebuilt' as any, app, compiler.outputFileSystem)
250
- })
251
-
252
- app.use(koaBodyParser(bodyParserOption))
253
-
254
- /* routers */
255
- const ssoMiddlewares = []
256
- process.emit('bootstrap-collect-sso-middleware' as any, null, ssoMiddlewares)
257
- app.ssoMiddlewares = ssoMiddlewares
258
-
259
- process.emit('bootstrap-module-global-public-route' as any, app, globalPublicRouter)
260
- process.emit('bootstrap-module-global-private-route' as any, app, globalPrivateRouter)
261
- process.emit('bootstrap-module-domain-public-route' as any, app, domainPublicRouter)
262
- process.emit('bootstrap-module-domain-private-route' as any, app, domainPrivateRouter)
263
-
264
- app.use(checkValidity) /* Check the license after most of the context has been built */
265
-
266
- app
267
- .use(globalPublicRouter.routes())
268
- .use(globalPublicRouter.allowedMethods())
269
- .use(globalPrivateRouter.routes())
270
- .use(globalPrivateRouter.allowedMethods())
271
- .use(domainPublicRouter.routes())
272
- .use(domainPublicRouter.allowedMethods())
273
- .use(domainPrivateRouter.routes())
274
- .use(domainPrivateRouter.allowedMethods())
275
-
276
- /* Graphql Upload's multipart/form-data handling affects the restful file upload feature, so it should be placed after the routers configuration. */
277
- app.use(graphqlUploadKoa(fileUploadOption))
278
-
279
- graphqlRouter.post(
280
- '/graphql',
281
- koaMiddleware(server, {
282
- context: async ({ ctx }) => ctx
283
- })
284
- )
285
- app.use(graphqlRouter.routes())
286
- app.use(graphqlRouter.allowedMethods())
287
-
288
- /* should follow this order : history-fallback => webpack-middleware */
289
- app.use(historyApiFallback({ whiteList: [] }))
290
-
291
- app.use(
292
- wdm.koaWrapper(compiler, {
293
- publicPath: webpackConfig.output.publicPath
294
- })
295
- )
296
-
297
- httpServer.listen({ port: PORT }, () => {
298
- logger.info(`🚀 Server ready at http://0.0.0.0:${PORT}/graphql`)
299
- logger.info(`🚀 Subscriptions ready at ws://0.0.0.0:${PORT}/graphql`)
300
-
301
- process.emit('bootstrap-module-start' as any, { app, config, builtSchema, httpServer } as any)
302
- })
303
- }
304
-
305
- bootstrap()
package/server/server.ts DELETED
@@ -1,296 +0,0 @@
1
- // ts-import-sorter: disable
2
-
3
- /* following 5 lines should be located in top of the file */
4
- const OS = require('os')
5
- process.env.UV_THREADPOOL_SIZE = OS.cpus().length
6
-
7
- console.log('UV_THREADPOOL_SIZE', process.env.UV_THREADPOOL_SIZE)
8
-
9
- process.env.NODE_ENV = 'production'
10
- process.setMaxListeners(0)
11
-
12
- import { ApolloServer } from '@apollo/server'
13
- import { ApolloServerPluginDrainHttpServer } from '@apollo/server/plugin/drainHttpServer'
14
- import { ApolloServerPluginLandingPageProductionDefault } from '@apollo/server/plugin/landingPage/default'
15
- import { koaMiddleware } from '@as-integrations/koa'
16
-
17
- import bytesFormat from 'bytes'
18
- import graphqlUploadKoa from 'graphql-upload/graphqlUploadKoa.js'
19
- import { useServer } from 'graphql-ws/lib/use/ws'
20
- import { createServer } from 'http'
21
- import Koa from 'koa'
22
- import koaBodyParser from 'koa-bodyparser'
23
- import koaStatic from 'koa-static'
24
- import compose from 'koa-compose'
25
- import { historyApiFallback } from 'koa2-connect-history-api-fallback'
26
- import { WebSocketServer } from 'ws'
27
- import co from 'co'
28
- import http from 'http'
29
-
30
- import cors from '@koa/cors'
31
- import crypto from 'crypto'
32
-
33
- import { config, loader, logger, orderedModuleNames } from '@things-factory/env'
34
- import { initLicense, checkValidity } from '@things-factory/operato-license-checker'
35
-
36
- import { GraphqlLocalClient } from './graphql-local-client'
37
- import { databaseInitializer } from './initializers/database'
38
- import {
39
- domainPrivateRouter,
40
- domainPublicRouter,
41
- globalPrivateRouter,
42
- globalPublicRouter,
43
- graphqlRouter
44
- } from './routers'
45
- import { schema } from './schema'
46
- import { domainMiddleware } from './middlewares'
47
-
48
- process.on('uncaughtException', error => {
49
- logger.error('uncaughtException: ', error)
50
-
51
- //process.exit(1)
52
- })
53
-
54
- const args = require('args')
55
-
56
- args.option('port', 'The port on which the app will be running', config.get('port', 3000))
57
-
58
- const flags = args.parse(process.argv)
59
-
60
- const path = require('path')
61
-
62
- const PORT = (process.env.PORT = flags.port)
63
-
64
- const requestBody = config.get('requestBody') || {}
65
-
66
- const bodyParserOption = {
67
- formLimit: requestBody.formLimit || '10mb',
68
- jsonLimit: requestBody.jsonLimit || '10mb',
69
- textLimit: requestBody.textLimit || '10mb'
70
- }
71
-
72
- const fileUpload = config.get('fileUpload') || {}
73
- const fileUploadOption = {
74
- maxFileSize: bytesFormat.parse(fileUpload.maxFileSize) || bytesFormat.parse('10mb'),
75
- maxFiles: fileUpload.maxFiles || 10
76
- }
77
-
78
- initLicense(config.get('licenseKey'))
79
-
80
- /* bootstrap */
81
- const bootstrap = async () => {
82
- await databaseInitializer()
83
-
84
- const app = new Koa() as any
85
- app.proxy = true
86
-
87
- app.use(
88
- cors({
89
- origin: function (ctx) {
90
- return ctx.request.headers.origin || '*'
91
- },
92
- exposeHeaders: ['WWW-Authenticate', 'Server-Authorization'],
93
- maxAge: 5,
94
- credentials: true,
95
- /* allowMethods: ['GET', 'POST', 'DELETE'], -- use default */
96
- allowHeaders: ['Content-Type', 'Authorization', 'Accept']
97
- })
98
- )
99
-
100
- app.use(async (ctx, next) => {
101
- ctx.set('X-Content-Type-Options', 'nosniff')
102
-
103
- const { directives = {} } = config.get('CSP') || {}
104
-
105
- const nonce = crypto.randomBytes(16).toString('base64')
106
- ctx.state.nonce = nonce
107
-
108
- const cspHeader = Object.entries(directives as { [key: string]: string[] })
109
- .map(([key, value]) => `${key} ${value.join(' ')}`)
110
- .join('; ')
111
-
112
- ctx.set('Content-Security-Policy', cspHeader)
113
-
114
- await next()
115
- })
116
-
117
- var subscriptionMiddleware = []
118
- process.emit('bootstrap-module-subscription' as any, app, subscriptionMiddleware)
119
-
120
- const builtSchema = await schema()
121
-
122
- const httpServer = createServer(app.callback())
123
- const websocketServer = new WebSocketServer({
124
- server: httpServer,
125
- path: '/graphql'
126
- })
127
-
128
- // Save the returned server's info so we can shut down this server later
129
- const serverCleanup = useServer(
130
- {
131
- schema: builtSchema,
132
- context: async (ctx, msg, args) => {
133
- return ctx['context']
134
- },
135
- onConnect: async ctx => {
136
- var { extra, connectionParams } = ctx
137
- var { request } = extra
138
-
139
- if (((connectionParams['headers'] as any) || connectionParams)?.referer) {
140
- var url = new URL(((connectionParams['headers'] as any) || connectionParams).referer)
141
- var accessToken = url.searchParams.get('access_token')
142
- if (accessToken) {
143
- connectionParams['headers']['authorization'] = accessToken
144
- }
145
- }
146
-
147
- request.headers = {
148
- ...request.headers,
149
- ...(connectionParams['headers'] || (connectionParams as any))
150
- }
151
-
152
- var koacontext = await app.createContext(request, new http.ServerResponse(request))
153
- koacontext['state'] = {}
154
-
155
- /* in case connect error(like a authentication error) just throw exception */
156
- var middlewares = [domainMiddleware, ...subscriptionMiddleware]
157
- const fn = co.wrap(compose(middlewares))
158
-
159
- await fn(koacontext)
160
-
161
- return (ctx['context'] = koacontext)
162
- },
163
- onDisconnect(ctx, code, reason) {
164
- console.log('Disconnected!')
165
- },
166
- onError(ctx, msg, errors) {
167
- console.error(msg, errors)
168
- }
169
- },
170
- websocketServer
171
- )
172
-
173
- const server = new ApolloServer({
174
- schema: builtSchema,
175
- formatError: error => {
176
- logger.error(error)
177
- return error
178
- },
179
- introspection: true,
180
- csrfPrevention: true,
181
- plugins: [
182
- // Proper shutdown for the HTTP server.
183
- ApolloServerPluginDrainHttpServer({ httpServer }),
184
- // Proper shutdown for the WebSocket server.
185
- {
186
- async serverWillStart() {
187
- return {
188
- async drainServer() {
189
- await serverCleanup.dispose()
190
- }
191
- }
192
- }
193
- },
194
- // TODO make this landing page work
195
- ApolloServerPluginLandingPageProductionDefault({
196
- graphRef: 'my-graph-id@my-graph-variant',
197
- footer: false
198
- })
199
- ],
200
- cache: 'bounded'
201
- })
202
-
203
- await server.start()
204
-
205
- GraphqlLocalClient.init(builtSchema, app)
206
-
207
- orderedModuleNames.forEach(name => {
208
- const { initMiddlewares } = loader(name)
209
- initMiddlewares && initMiddlewares(app)
210
- })
211
-
212
- const render = require('@things-factory/ejs-remote')
213
- render(app, {
214
- root: '/views',
215
- host: `http://127.0.0.1:${PORT}`,
216
- layout: false,
217
- viewExt: 'html',
218
- cache: true,
219
- debug: false
220
- })
221
-
222
- app.use(koaBodyParser(bodyParserOption))
223
-
224
- /* routers */
225
- const ssoMiddlewares = []
226
- process.emit('bootstrap-collect-sso-middleware' as any, null, ssoMiddlewares)
227
- app.ssoMiddlewares = ssoMiddlewares
228
-
229
- process.emit('bootstrap-module-global-public-route' as any, app, globalPublicRouter)
230
- process.emit('bootstrap-module-global-private-route' as any, app, globalPrivateRouter)
231
- process.emit('bootstrap-module-domain-public-route' as any, app, domainPublicRouter)
232
- process.emit('bootstrap-module-domain-private-route' as any, app, domainPrivateRouter)
233
-
234
- app.use(checkValidity) /* Check the license after most of the context has been built */
235
-
236
- app
237
- .use(globalPublicRouter.routes())
238
- .use(globalPublicRouter.allowedMethods())
239
- .use(globalPrivateRouter.routes())
240
- .use(globalPrivateRouter.allowedMethods())
241
- .use(domainPublicRouter.routes())
242
- .use(domainPublicRouter.allowedMethods())
243
- .use(domainPrivateRouter.routes())
244
- .use(domainPrivateRouter.allowedMethods())
245
-
246
- /* Graphql Upload's multipart/form-data handling affects the restful file upload feature, so it should be placed after the routers configuration. */
247
- app.use(graphqlUploadKoa(fileUploadOption))
248
-
249
- graphqlRouter.post(
250
- '/graphql',
251
- koaMiddleware(server, {
252
- context: async ({ ctx }) => ctx
253
- })
254
- )
255
- app.use(graphqlRouter.routes())
256
- app.use(graphqlRouter.allowedMethods())
257
-
258
- /* should follow this order : history-fallback => koaStatic */
259
- app.use(historyApiFallback({ whiteList: [] }))
260
-
261
- app.use(
262
- koaStatic(path.join(process.cwd(), 'dist-app'), {
263
- index: 'index.html'
264
- })
265
- )
266
-
267
- // Set keep-alive timeout from configuration or fallback to default (65000ms).
268
- // The keepAliveTimeout determines how long the server will keep an idle connection
269
- // alive before closing it.
270
- const keepAliveTimeout = config.get('keepAliveTimeout', 65000)
271
-
272
- // Apply the configured keep-alive timeout to the server. If no configuration is
273
- // provided, default to 65000ms (65 seconds). In the context of an external load balancer,
274
- // this timeout is critical for maintaining persistent connections between the load
275
- // balancer and the server. Setting a sufficiently long keepAliveTimeout minimizes
276
- // the need to constantly re-establish TCP connections, improving efficiency and
277
- // reducing connection overhead.
278
- httpServer.keepAliveTimeout = keepAliveTimeout || 65000
279
-
280
- // Set headersTimeout to be 1000ms (1 second) longer than keepAliveTimeout.
281
- // This ensures the server has sufficient time to receive headers from the client
282
- // before closing the connection, preventing premature disconnections. In the context
283
- // of a load balancer, this ensures that if the load balancer is sending headers
284
- // slowly (due to network delays or other factors), the connection isn't closed
285
- // before the headers are fully transmitted.
286
- httpServer.headersTimeout = keepAliveTimeout + 1000
287
-
288
- httpServer.listen({ port: PORT }, () => {
289
- logger.info(`🚀 Server ready at http://0.0.0.0:${PORT}/graphql`)
290
- logger.info(`🚀 Subscriptions ready at ws://0.0.0.0:${PORT}/graphql`)
291
-
292
- process.emit('bootstrap-module-start' as any, { app, config, builtSchema, httpServer } as any)
293
- })
294
- }
295
-
296
- bootstrap()
@@ -1,65 +0,0 @@
1
- import { Field, InputType, Int, ObjectType, registerEnumType } from 'type-graphql'
2
- import { ScalarObject } from '../common-types'
3
-
4
- export enum AttributeSetItemType {
5
- number = 'number',
6
- text = 'text',
7
- boolean = 'boolean',
8
- select = 'select',
9
- date = 'date',
10
- datetime = 'datetime',
11
- file = 'file'
12
- }
13
-
14
- registerEnumType(AttributeSetItemType, {
15
- name: 'AttributeSetItemType',
16
- description: 'type enumeration of a attribute-set-item'
17
- })
18
-
19
- @ObjectType({ description: 'Entity for AttributeSetItem' })
20
- export class AttributeSetItem {
21
- @Field()
22
- name: string
23
-
24
- @Field({ nullable: true })
25
- description?: string
26
-
27
- @Field({ nullable: true })
28
- tag?: string
29
-
30
- @Field({ nullable: true })
31
- active?: boolean
32
-
33
- @Field({ nullable: true })
34
- hidden?: boolean
35
-
36
- @Field({ nullable: true })
37
- type?: AttributeSetItemType
38
-
39
- @Field(type => ScalarObject, { nullable: true })
40
- options?: { [option: string]: any }
41
- }
42
-
43
- @InputType()
44
- export class AttributeSetItemPatch {
45
- @Field({ nullable: true })
46
- name?: string
47
-
48
- @Field({ nullable: true })
49
- description?: string
50
-
51
- @Field({ nullable: true })
52
- tag?: string
53
-
54
- @Field(type => AttributeSetItemType, { nullable: true })
55
- type?: AttributeSetItemType
56
-
57
- @Field(type => ScalarObject, { nullable: true })
58
- options?: { [option: string]: any }
59
-
60
- @Field({ nullable: true })
61
- active?: boolean
62
-
63
- @Field({ nullable: true })
64
- hidden?: boolean
65
- }