@gokiteam/goki-dev 0.2.0

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 (205) hide show
  1. package/README.md +478 -0
  2. package/bin/goki-dev.js +452 -0
  3. package/bin/mcp-server.js +16 -0
  4. package/bin/secrets-cli.js +302 -0
  5. package/cli/ComposeOverrideGenerator.js +226 -0
  6. package/cli/ComposeParser.js +73 -0
  7. package/cli/ConfigGenerator.js +304 -0
  8. package/cli/ConfigManager.js +46 -0
  9. package/cli/DatabaseManager.js +94 -0
  10. package/cli/DevToolsChecker.js +21 -0
  11. package/cli/DevToolsDir.js +66 -0
  12. package/cli/DevToolsManager.js +451 -0
  13. package/cli/DockerManager.js +138 -0
  14. package/cli/FunctionManager.js +95 -0
  15. package/cli/HttpProxyRewriter.js +91 -0
  16. package/cli/Logger.js +10 -0
  17. package/cli/McpConfigManager.js +123 -0
  18. package/cli/NgrokManager.js +431 -0
  19. package/cli/ProjectCLI.js +2322 -0
  20. package/cli/PubSubManager.js +129 -0
  21. package/cli/SnapshotManager.js +88 -0
  22. package/cli/UiFormatter.js +292 -0
  23. package/cli/WebhookUrlRewriter.js +32 -0
  24. package/cli/secrets/BiometricAuth.js +125 -0
  25. package/cli/secrets/SecretInjector.js +47 -0
  26. package/cli/secrets/SecretsConfig.js +141 -0
  27. package/cli/secrets/SecretsDoctor.js +384 -0
  28. package/cli/secrets/SecretsManager.js +255 -0
  29. package/client/dist/client.d.ts +332 -0
  30. package/client/dist/client.js +507 -0
  31. package/client/dist/helpers.d.ts +62 -0
  32. package/client/dist/helpers.js +122 -0
  33. package/client/dist/index.d.ts +59 -0
  34. package/client/dist/index.js +78 -0
  35. package/client/dist/package.json +1 -0
  36. package/client/dist/types.d.ts +280 -0
  37. package/client/dist/types.js +7 -0
  38. package/config.development +46 -0
  39. package/config.test +18 -0
  40. package/guidelines/CodingStyleGuideline.md +148 -0
  41. package/guidelines/CommentingGuideline.md +10 -0
  42. package/guidelines/HttpApiImplementationGuideline.md +137 -0
  43. package/guidelines/NamingGuideline.md +182 -0
  44. package/package.json +138 -0
  45. package/patterns/api/[collectionName]/Controllers.md +62 -0
  46. package/patterns/api/[collectionName]/Logic.md +154 -0
  47. package/patterns/api/[collectionName]/Permissions.md +81 -0
  48. package/patterns/api/[collectionName]/Router.md +83 -0
  49. package/patterns/api/[collectionName]/Schemas.md +197 -0
  50. package/patterns/configs/Patterns.md +7 -0
  51. package/patterns/enums/Patterns.md +24 -0
  52. package/patterns/errorHandling/Patterns.md +185 -0
  53. package/patterns/testing/Patterns.md +232 -0
  54. package/src/Server.js +238 -0
  55. package/src/api/dashboard/Controllers.js +9 -0
  56. package/src/api/dashboard/Logic.js +76 -0
  57. package/src/api/dashboard/Router.js +11 -0
  58. package/src/api/dashboard/Schemas.js +47 -0
  59. package/src/api/data/Controllers.js +26 -0
  60. package/src/api/data/Logic.js +188 -0
  61. package/src/api/data/Router.js +16 -0
  62. package/src/api/docker/Controllers.js +33 -0
  63. package/src/api/docker/Logic.js +268 -0
  64. package/src/api/docker/Router.js +15 -0
  65. package/src/api/docker/Schemas.js +80 -0
  66. package/src/api/docs/Controllers.js +15 -0
  67. package/src/api/docs/Logic.js +85 -0
  68. package/src/api/docs/Router.js +12 -0
  69. package/src/api/export/Controllers.js +30 -0
  70. package/src/api/export/Logic.js +143 -0
  71. package/src/api/export/Router.js +18 -0
  72. package/src/api/export/Schemas.js +104 -0
  73. package/src/api/firestore/Controllers.js +152 -0
  74. package/src/api/firestore/Logic.js +474 -0
  75. package/src/api/firestore/Router.js +23 -0
  76. package/src/api/functions/Controllers.js +261 -0
  77. package/src/api/functions/Logic.js +710 -0
  78. package/src/api/functions/Router.js +50 -0
  79. package/src/api/functions/Schemas.js +193 -0
  80. package/src/api/gateway/Controllers.js +72 -0
  81. package/src/api/gateway/Logic.js +74 -0
  82. package/src/api/gateway/Router.js +10 -0
  83. package/src/api/gateway/Schemas.js +19 -0
  84. package/src/api/health/Controllers.js +14 -0
  85. package/src/api/health/Logic.js +24 -0
  86. package/src/api/health/Router.js +12 -0
  87. package/src/api/httpTraffic/Controllers.js +29 -0
  88. package/src/api/httpTraffic/Logic.js +33 -0
  89. package/src/api/httpTraffic/Router.js +9 -0
  90. package/src/api/httpTraffic/Schemas.js +23 -0
  91. package/src/api/logging/Controllers.js +80 -0
  92. package/src/api/logging/Logic.js +461 -0
  93. package/src/api/logging/Router.js +24 -0
  94. package/src/api/logging/Schemas.js +43 -0
  95. package/src/api/mqtt/Controllers.js +17 -0
  96. package/src/api/mqtt/Logic.js +66 -0
  97. package/src/api/mqtt/Router.js +12 -0
  98. package/src/api/postgres/Controllers.js +97 -0
  99. package/src/api/postgres/Logic.js +221 -0
  100. package/src/api/postgres/Router.js +21 -0
  101. package/src/api/pubsub/Controllers.js +236 -0
  102. package/src/api/pubsub/Logic.js +732 -0
  103. package/src/api/pubsub/Router.js +41 -0
  104. package/src/api/pubsub/Schemas.js +355 -0
  105. package/src/api/redis/Controllers.js +63 -0
  106. package/src/api/redis/Logic.js +239 -0
  107. package/src/api/redis/Router.js +21 -0
  108. package/src/api/scheduler/Controllers.js +27 -0
  109. package/src/api/scheduler/Logic.js +49 -0
  110. package/src/api/scheduler/Router.js +16 -0
  111. package/src/api/services/Controllers.js +26 -0
  112. package/src/api/services/Logic.js +205 -0
  113. package/src/api/services/Router.js +14 -0
  114. package/src/api/services/Schemas.js +66 -0
  115. package/src/api/snapshots/Controllers.js +37 -0
  116. package/src/api/snapshots/Logic.js +797 -0
  117. package/src/api/snapshots/Router.js +15 -0
  118. package/src/api/snapshots/Schemas.js +23 -0
  119. package/src/api/webhooks/Controllers.js +49 -0
  120. package/src/api/webhooks/Logic.js +137 -0
  121. package/src/api/webhooks/Router.js +12 -0
  122. package/src/api/webhooks/Schemas.js +31 -0
  123. package/src/configs/Application.js +147 -0
  124. package/src/configs/Default.js +13 -0
  125. package/src/consumers/BlackboxLogsConsumer.js +235 -0
  126. package/src/consumers/DockerLogsConsumer.js +687 -0
  127. package/src/db/Tables.js +66 -0
  128. package/src/db/schemas/firestore.js +18 -0
  129. package/src/db/schemas/functions.js +65 -0
  130. package/src/db/schemas/httpTraffic.js +43 -0
  131. package/src/db/schemas/logging.js +74 -0
  132. package/src/db/schemas/migrations.js +64 -0
  133. package/src/db/schemas/mqtt.js +56 -0
  134. package/src/db/schemas/pubsub.js +90 -0
  135. package/src/db/schemas/pubsubRegistry.js +22 -0
  136. package/src/db/schemas/webhooks.js +28 -0
  137. package/src/emulation/awsiot/Controllers.js +91 -0
  138. package/src/emulation/awsiot/Logic.js +70 -0
  139. package/src/emulation/awsiot/Router.js +19 -0
  140. package/src/emulation/awsiot/Server.js +100 -0
  141. package/src/emulation/firestore/Server.js +136 -0
  142. package/src/emulation/logging/Controllers.js +212 -0
  143. package/src/emulation/logging/Logic.js +416 -0
  144. package/src/emulation/logging/Router.js +36 -0
  145. package/src/emulation/logging/Schemas.js +82 -0
  146. package/src/emulation/logging/Server.js +108 -0
  147. package/src/emulation/pubsub/Controllers.js +279 -0
  148. package/src/emulation/pubsub/DefaultTopics.js +162 -0
  149. package/src/emulation/pubsub/Logic.js +427 -0
  150. package/src/emulation/pubsub/README.md +309 -0
  151. package/src/emulation/pubsub/Router.js +33 -0
  152. package/src/emulation/pubsub/Server.js +104 -0
  153. package/src/emulation/pubsub/ShadowPoller.js +276 -0
  154. package/src/emulation/pubsub/ShadowSubscriptionManager.js +199 -0
  155. package/src/enums/ContainerNames.js +106 -0
  156. package/src/enums/ErrorReason.js +28 -0
  157. package/src/enums/FunctionStatuses.js +15 -0
  158. package/src/enums/FunctionTriggerTypes.js +15 -0
  159. package/src/enums/GatewayState.js +7 -0
  160. package/src/enums/ServiceNames.js +68 -0
  161. package/src/jobs/DatabaseMaintenance.js +184 -0
  162. package/src/jobs/MessageHistoryCleanup.js +152 -0
  163. package/src/mcp/ApiClient.js +25 -0
  164. package/src/mcp/Server.js +52 -0
  165. package/src/mcp/prompts/debugging.js +104 -0
  166. package/src/mcp/resources/platform.js +118 -0
  167. package/src/mcp/tools/data.js +84 -0
  168. package/src/mcp/tools/docker.js +166 -0
  169. package/src/mcp/tools/firestore.js +162 -0
  170. package/src/mcp/tools/functions.js +380 -0
  171. package/src/mcp/tools/httpTraffic.js +69 -0
  172. package/src/mcp/tools/logging.js +174 -0
  173. package/src/mcp/tools/mqtt.js +37 -0
  174. package/src/mcp/tools/postgres.js +130 -0
  175. package/src/mcp/tools/pubsub.js +316 -0
  176. package/src/mcp/tools/redis.js +146 -0
  177. package/src/mcp/tools/services.js +169 -0
  178. package/src/mcp/tools/snapshots.js +88 -0
  179. package/src/mcp/tools/webhooks.js +115 -0
  180. package/src/middleware/DevProxy.js +67 -0
  181. package/src/middleware/ErrorCatcher.js +35 -0
  182. package/src/middleware/HttpProxy.js +215 -0
  183. package/src/middleware/Reply.js +24 -0
  184. package/src/middleware/TraceId.js +9 -0
  185. package/src/middleware/WebhookProxy.js +234 -0
  186. package/src/protocols/mqtt/Broker.js +92 -0
  187. package/src/protocols/mqtt/Handlers.js +175 -0
  188. package/src/protocols/mqtt/PubSubBridge.js +162 -0
  189. package/src/protocols/mqtt/Server.js +116 -0
  190. package/src/runtime/FunctionRunner.js +179 -0
  191. package/src/services/AppGatewayService.js +582 -0
  192. package/src/singletons/FirestoreBroadcaster.js +367 -0
  193. package/src/singletons/FunctionTriggerDispatcher.js +456 -0
  194. package/src/singletons/FunctionsService.js +418 -0
  195. package/src/singletons/HttpProxy.js +224 -0
  196. package/src/singletons/LogBroadcaster.js +159 -0
  197. package/src/singletons/Logger.js +49 -0
  198. package/src/singletons/MemoryJsonStore.js +175 -0
  199. package/src/singletons/MessageBroadcaster.js +190 -0
  200. package/src/singletons/PostgresBroadcaster.js +367 -0
  201. package/src/singletons/PostgresClient.js +180 -0
  202. package/src/singletons/RedisClient.js +184 -0
  203. package/src/singletons/SqliteStore.js +480 -0
  204. package/src/singletons/TickService.js +151 -0
  205. package/src/singletons/WebhookProxy.js +223 -0
@@ -0,0 +1,261 @@
1
+ import { Logic } from './Logic.js'
2
+ import { FunctionsService } from '../../singletons/FunctionsService.js'
3
+
4
+ export const Controllers = {
5
+ async create (ctx) {
6
+ const { traceId } = ctx.state
7
+ const body = ctx.request.body
8
+ const result = await Logic.create({ ...body, traceId })
9
+ ctx.reply(result)
10
+ },
11
+
12
+ async list (ctx) {
13
+ const { traceId } = ctx.state
14
+ const { filter, limit, offset } = ctx.request.body
15
+ const result = Logic.list({ filter, limit, offset, traceId })
16
+ ctx.reply(result)
17
+ },
18
+
19
+ async details (ctx) {
20
+ const { traceId } = ctx.state
21
+ const { id, name } = ctx.request.body
22
+ const result = Logic.details({ id, name, traceId })
23
+ ctx.reply(result)
24
+ },
25
+
26
+ async update (ctx) {
27
+ const { traceId } = ctx.state
28
+ const body = ctx.request.body
29
+ const result = await Logic.update({ ...body, traceId })
30
+ ctx.reply(result)
31
+ },
32
+
33
+ async delete (ctx) {
34
+ const { traceId } = ctx.state
35
+ const { id, name } = ctx.request.body
36
+ const result = await Logic.delete({ id, name, traceId })
37
+ ctx.reply(result)
38
+ },
39
+
40
+ async start (ctx) {
41
+ const { traceId } = ctx.state
42
+ const { id, name } = ctx.request.body
43
+ const result = await Logic.start({ id, name, traceId })
44
+ ctx.reply(result)
45
+ },
46
+
47
+ async stop (ctx) {
48
+ const { traceId } = ctx.state
49
+ const { id, name } = ctx.request.body
50
+ const result = await Logic.stop({ id, name, traceId })
51
+ ctx.reply(result)
52
+ },
53
+
54
+ async restart (ctx) {
55
+ const { traceId } = ctx.state
56
+ const { id, name } = ctx.request.body
57
+ const result = await Logic.restart({ id, name, traceId })
58
+ ctx.reply(result)
59
+ },
60
+
61
+ async readSource (ctx) {
62
+ const { traceId } = ctx.state
63
+ const { id, name } = ctx.request.body
64
+ const result = Logic.readSource({ id, name, traceId })
65
+ ctx.reply(result)
66
+ },
67
+
68
+ async updateSource (ctx) {
69
+ const { traceId } = ctx.state
70
+ const { id, name, content } = ctx.request.body
71
+ const result = await Logic.updateSource({ id, name, content, traceId })
72
+ ctx.reply(result)
73
+ },
74
+
75
+ async readDependencies (ctx) {
76
+ const { traceId } = ctx.state
77
+ const { id, name } = ctx.request.body
78
+ const result = Logic.readDependencies({ id, name, traceId })
79
+ ctx.reply(result)
80
+ },
81
+
82
+ async updateDependencies (ctx) {
83
+ const { traceId } = ctx.state
84
+ const { id, name, packageJson, install } = ctx.request.body
85
+ const result = await Logic.updateDependencies({ id, name, packageJson, install, traceId })
86
+ ctx.reply(result)
87
+ },
88
+
89
+ async listFiles (ctx) {
90
+ const { traceId } = ctx.state
91
+ const { id, name } = ctx.request.body
92
+ const result = Logic.listFiles({ id, name, traceId })
93
+ ctx.reply(result)
94
+ },
95
+
96
+ async readFile (ctx) {
97
+ const { traceId } = ctx.state
98
+ const { id, name, filePath } = ctx.request.body
99
+ const result = Logic.readFile({ id, name, filePath, traceId })
100
+ ctx.reply(result)
101
+ },
102
+
103
+ async writeFile (ctx) {
104
+ const { traceId } = ctx.state
105
+ const { id, name, filePath, content } = ctx.request.body
106
+ const result = await Logic.writeFile({ id, name, filePath, content, traceId })
107
+ ctx.reply(result)
108
+ },
109
+
110
+ async deleteFile (ctx) {
111
+ const { traceId } = ctx.state
112
+ const { id, name, filePath } = ctx.request.body
113
+ const result = Logic.deleteFile({ id, name, filePath, traceId })
114
+ ctx.reply(result)
115
+ },
116
+
117
+ async invoke (ctx) {
118
+ const { traceId } = ctx.state
119
+ const { id, name, payload } = ctx.request.body
120
+ const result = await Logic.invoke({ id, name, payload, traceId })
121
+ ctx.reply(result)
122
+ },
123
+
124
+ async listInvocations (ctx) {
125
+ const { traceId } = ctx.state
126
+ const { functionId, functionName, triggerType, limit, offset } = ctx.request.body
127
+ const result = Logic.listInvocations({ functionId, functionName, triggerType, limit, offset, traceId })
128
+ ctx.reply(result)
129
+ },
130
+
131
+ async invocationDetails (ctx) {
132
+ const { traceId } = ctx.state
133
+ const { id } = ctx.request.body
134
+ const result = Logic.invocationDetails({ id, traceId })
135
+ ctx.reply(result)
136
+ },
137
+
138
+ async clearInvocations (ctx) {
139
+ const { traceId } = ctx.state
140
+ const { functionId } = ctx.request.body
141
+ const result = Logic.clearInvocations({ functionId, traceId })
142
+ ctx.reply(result)
143
+ },
144
+
145
+ async stats (ctx) {
146
+ const { traceId } = ctx.state
147
+ const result = Logic.stats({ traceId })
148
+ ctx.reply(result)
149
+ },
150
+
151
+ async streamLogs (ctx) {
152
+ const { traceId } = ctx.state
153
+ const { functionName } = ctx.query
154
+ ctx.set({
155
+ 'Content-Type': 'text/event-stream',
156
+ 'Cache-Control': 'no-cache',
157
+ Connection: 'keep-alive',
158
+ 'X-Accel-Buffering': 'no'
159
+ })
160
+ ctx.status = 200
161
+ ctx.respond = false
162
+ ctx.res.write(`event: connected\ndata: ${JSON.stringify({ connected: true, traceId })}\n\n`)
163
+ const filters = {}
164
+ if (functionName) filters.functionName = functionName
165
+ FunctionsService.addLogClient(traceId, ctx, filters)
166
+ await new Promise((resolve) => {
167
+ ctx.req.on('close', () => {
168
+ FunctionsService.removeLogClient(traceId)
169
+ resolve()
170
+ })
171
+ ctx.req.on('error', () => {
172
+ FunctionsService.removeLogClient(traceId)
173
+ resolve()
174
+ })
175
+ })
176
+ },
177
+
178
+ async streamInvocations (ctx) {
179
+ const { traceId } = ctx.state
180
+ const { functionName } = ctx.query
181
+ ctx.set({
182
+ 'Content-Type': 'text/event-stream',
183
+ 'Cache-Control': 'no-cache',
184
+ Connection: 'keep-alive',
185
+ 'X-Accel-Buffering': 'no'
186
+ })
187
+ ctx.status = 200
188
+ ctx.respond = false
189
+ ctx.res.write(`event: connected\ndata: ${JSON.stringify({ connected: true, traceId })}\n\n`)
190
+ const filters = {}
191
+ if (functionName) filters.functionName = functionName
192
+ FunctionsService.addInvocationClient(traceId, ctx, filters)
193
+ await new Promise((resolve) => {
194
+ ctx.req.on('close', () => {
195
+ FunctionsService.removeInvocationClient(traceId)
196
+ resolve()
197
+ })
198
+ ctx.req.on('error', () => {
199
+ FunctionsService.removeInvocationClient(traceId)
200
+ resolve()
201
+ })
202
+ })
203
+ },
204
+
205
+ async streamFileChanges (ctx) {
206
+ const { traceId } = ctx.state
207
+ const { functionName } = ctx.query
208
+ if (!functionName) {
209
+ ctx.status = 400
210
+ ctx.body = { error: 'functionName query parameter is required' }
211
+ return
212
+ }
213
+ ctx.set({
214
+ 'Content-Type': 'text/event-stream',
215
+ 'Cache-Control': 'no-cache',
216
+ Connection: 'keep-alive',
217
+ 'X-Accel-Buffering': 'no'
218
+ })
219
+ ctx.status = 200
220
+ ctx.respond = false
221
+ ctx.res.write(`event: connected\ndata: ${JSON.stringify({ connected: true, functionName, traceId })}\n\n`)
222
+ FunctionsService.addFileChangeClient(traceId, ctx, functionName)
223
+ await new Promise((resolve) => {
224
+ ctx.req.on('close', () => {
225
+ FunctionsService.removeFileChangeClient(traceId)
226
+ resolve()
227
+ })
228
+ ctx.req.on('error', () => {
229
+ FunctionsService.removeFileChangeClient(traceId)
230
+ resolve()
231
+ })
232
+ })
233
+ },
234
+
235
+ async callHttpFunction (ctx) {
236
+ const { traceId } = ctx.state
237
+ const { functionName } = ctx.params
238
+ const result = await Logic.callHttpFunction({
239
+ functionName,
240
+ method: ctx.method,
241
+ headers: ctx.headers,
242
+ body: ctx.request.body,
243
+ path: ctx.params[0] || '',
244
+ query: ctx.query,
245
+ traceId
246
+ })
247
+ if (result.success === false) {
248
+ ctx.reply(result)
249
+ return
250
+ }
251
+ ctx.status = result.status || 200
252
+ if (result.headers) {
253
+ for (const [key, value] of Object.entries(result.headers)) {
254
+ if (key.toLowerCase() !== 'transfer-encoding') {
255
+ ctx.set(key, value)
256
+ }
257
+ }
258
+ }
259
+ ctx.body = result.body
260
+ }
261
+ }