@nlabs/reaktor 1.6.3 → 1.8.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 (278) hide show
  1. package/LICENSE +74 -201
  2. package/README.md +48 -16
  3. package/lib/actions/analytics.d.ts +10 -0
  4. package/lib/actions/analytics.js +539 -0
  5. package/lib/actions/apps.js +2 -2
  6. package/lib/actions/connections.js +1 -1
  7. package/lib/actions/content.js +2 -2
  8. package/lib/actions/conversations.js +2 -2
  9. package/lib/actions/crm.d.ts +11 -1
  10. package/lib/actions/crm.js +443 -13
  11. package/lib/actions/crud.js +2 -2
  12. package/lib/actions/dynamodb.d.ts +1 -1
  13. package/lib/actions/dynamodb.js +2 -2
  14. package/lib/actions/email.d.ts +1 -1
  15. package/lib/actions/email.js +2 -2
  16. package/lib/actions/files.js +2 -2
  17. package/lib/actions/flags.d.ts +6 -0
  18. package/lib/actions/flags.js +147 -0
  19. package/lib/actions/groups.js +2 -2
  20. package/lib/actions/images.d.ts +1 -1
  21. package/lib/actions/images.js +2 -2
  22. package/lib/actions/index.d.ts +3 -2
  23. package/lib/actions/index.js +4 -3
  24. package/lib/actions/ios.js +1 -1
  25. package/lib/actions/locations.js +2 -2
  26. package/lib/actions/messages.js +2 -2
  27. package/lib/actions/notifications.d.ts +1 -1
  28. package/lib/actions/notifications.js +2 -2
  29. package/lib/actions/payments.d.ts +3 -3
  30. package/lib/actions/payments.js +144 -189
  31. package/lib/actions/personas.js +1 -1
  32. package/lib/actions/posts.d.ts +0 -4
  33. package/lib/actions/posts.js +2 -4
  34. package/lib/actions/query.js +2 -2
  35. package/lib/actions/reactions.js +2 -2
  36. package/lib/actions/rum.js +148 -45
  37. package/lib/actions/s3.d.ts +1 -1
  38. package/lib/actions/s3.js +2 -2
  39. package/lib/actions/search.js +2 -2
  40. package/lib/actions/sms.js +2 -2
  41. package/lib/actions/statistics.js +2 -2
  42. package/lib/actions/subscriptions.js +2 -2
  43. package/lib/actions/tags.js +2 -2
  44. package/lib/actions/users.d.ts +4 -1
  45. package/lib/actions/users.js +85 -11
  46. package/lib/actions/videos.js +2 -2
  47. package/lib/adapters/arangoAdapter.js +1 -1
  48. package/lib/adapters/contentAdapter.js +2 -2
  49. package/lib/adapters/fileAdapter.js +1 -1
  50. package/lib/adapters/imageAdapter.js +1 -1
  51. package/lib/adapters/index.js +1 -1
  52. package/lib/adapters/messageAdapter.js +1 -1
  53. package/lib/adapters/postAdapter.js +1 -1
  54. package/lib/adapters/reaktorAdapter.js +1 -1
  55. package/lib/adapters/tagAdapter.d.ts +0 -1
  56. package/lib/adapters/tagAdapter.js +1 -2
  57. package/lib/adapters/userAdapter.d.ts +0 -1
  58. package/lib/adapters/userAdapter.js +1 -2
  59. package/lib/config.js +8 -2
  60. package/lib/constants/collections.d.ts +17 -1
  61. package/lib/constants/collections.js +18 -2
  62. package/lib/handlers/graphqlHandler.d.ts +2 -2
  63. package/lib/handlers/graphqlHandler.js +2 -19
  64. package/lib/index.d.ts +4 -2
  65. package/lib/index.js +4 -3
  66. package/lib/lambdas/actions/websockets.js +2 -2
  67. package/lib/lambdas/authorizer.js +2 -2
  68. package/lib/lambdas/connection.js +2 -2
  69. package/lib/lambdas/utils/message.js +2 -2
  70. package/lib/lambdas/utils/websocket.d.ts +1 -1
  71. package/lib/lambdas/utils/websocket.js +2 -2
  72. package/lib/mocks/conversation.js +1 -1
  73. package/lib/mocks/file.js +1 -1
  74. package/lib/mocks/group.js +1 -1
  75. package/lib/mocks/image.js +1 -1
  76. package/lib/mocks/post.js +1 -1
  77. package/lib/mocks/tag.js +1 -1
  78. package/lib/mocks/user.js +1 -1
  79. package/lib/mocks/video.js +1 -1
  80. package/lib/mutations/analytics/analytics.d.ts +1 -0
  81. package/lib/mutations/analytics/analytics.js +35 -0
  82. package/lib/mutations/content/content.js +2 -2
  83. package/lib/mutations/crm/crm.js +57 -11
  84. package/lib/mutations/events/events.js +2 -2
  85. package/lib/mutations/flags/flags.d.ts +1 -0
  86. package/lib/mutations/flags/flags.js +33 -0
  87. package/lib/mutations/groups/groups.js +2 -2
  88. package/lib/mutations/images/images.js +2 -2
  89. package/lib/mutations/index.d.ts +3 -1
  90. package/lib/mutations/index.js +13 -3
  91. package/lib/mutations/locations/locations.js +2 -2
  92. package/lib/mutations/messages/messages.js +2 -2
  93. package/lib/mutations/personas/personas.js +2 -2
  94. package/lib/mutations/posts/posts.js +2 -2
  95. package/lib/mutations/reactions/reactions.js +2 -2
  96. package/lib/mutations/rum/rum.js +2 -2
  97. package/lib/mutations/statistics/statistics.js +2 -2
  98. package/lib/mutations/subscriptions/subscriptions.js +2 -2
  99. package/lib/mutations/tags/tags.js +2 -2
  100. package/lib/mutations/users/users.js +30 -17
  101. package/lib/mutations/videos/videos.js +2 -2
  102. package/lib/objectTypes/analytics.d.ts +8 -0
  103. package/lib/objectTypes/analytics.js +147 -0
  104. package/lib/objectTypes/app.js +2 -2
  105. package/lib/objectTypes/bankAccount.js +2 -2
  106. package/lib/objectTypes/connection.js +2 -2
  107. package/lib/objectTypes/content.js +2 -2
  108. package/lib/objectTypes/conversation.js +2 -2
  109. package/lib/objectTypes/creditCard.js +2 -2
  110. package/lib/objectTypes/crm.d.ts +5 -0
  111. package/lib/objectTypes/crm.js +68 -2
  112. package/lib/objectTypes/document.js +1 -1
  113. package/lib/objectTypes/error.js +2 -2
  114. package/lib/objectTypes/event.js +2 -2
  115. package/lib/objectTypes/external.js +2 -2
  116. package/lib/objectTypes/file.js +2 -2
  117. package/lib/objectTypes/filter.js +2 -2
  118. package/lib/objectTypes/flag.d.ts +1 -0
  119. package/lib/objectTypes/flag.js +35 -0
  120. package/lib/objectTypes/group.js +2 -2
  121. package/lib/objectTypes/iapSubscription.js +2 -2
  122. package/lib/objectTypes/image.d.ts +1 -1
  123. package/lib/objectTypes/image.js +2 -2
  124. package/lib/objectTypes/index.d.ts +2 -0
  125. package/lib/objectTypes/index.js +3 -1
  126. package/lib/objectTypes/location.js +2 -2
  127. package/lib/objectTypes/message.js +2 -2
  128. package/lib/objectTypes/passcode.js +2 -2
  129. package/lib/objectTypes/persona.js +2 -2
  130. package/lib/objectTypes/plan.js +2 -2
  131. package/lib/objectTypes/post.js +2 -2
  132. package/lib/objectTypes/query.js +2 -2
  133. package/lib/objectTypes/reaction.js +2 -2
  134. package/lib/objectTypes/relation.js +2 -2
  135. package/lib/objectTypes/rum.js +4 -4
  136. package/lib/objectTypes/search.js +2 -2
  137. package/lib/objectTypes/statistics.js +2 -2
  138. package/lib/objectTypes/subscription.js +2 -2
  139. package/lib/objectTypes/tag.js +2 -2
  140. package/lib/objectTypes/user.js +10 -2
  141. package/lib/objectTypes/video.d.ts +1 -1
  142. package/lib/objectTypes/video.js +2 -2
  143. package/lib/queries/analytics/analytics.d.ts +1 -0
  144. package/lib/queries/analytics/analytics.js +41 -0
  145. package/lib/queries/content/content.js +2 -2
  146. package/lib/queries/crm/crm.js +52 -13
  147. package/lib/queries/events/events.js +2 -2
  148. package/lib/queries/flags/flags.d.ts +1 -0
  149. package/lib/queries/flags/flags.js +16 -0
  150. package/lib/queries/groups/groups.js +2 -2
  151. package/lib/queries/images/images.js +2 -2
  152. package/lib/queries/index.d.ts +3 -1
  153. package/lib/queries/index.js +13 -3
  154. package/lib/queries/locations/locations.js +2 -2
  155. package/lib/queries/messages/messages.js +1 -1
  156. package/lib/queries/personas/personas.js +2 -2
  157. package/lib/queries/posts/posts.js +2 -2
  158. package/lib/queries/query/query.js +2 -2
  159. package/lib/queries/reactions/reactions.js +2 -2
  160. package/lib/queries/statistics/statistics.js +2 -2
  161. package/lib/queries/subscriptions/subscriptions.js +1 -1
  162. package/lib/queries/tags/tags.js +2 -2
  163. package/lib/queries/users/users.js +2 -2
  164. package/lib/queries/videos/videos.js +2 -2
  165. package/lib/templates/email/layout.js +1 -1
  166. package/lib/templates/email/passwordForgot.js +1 -1
  167. package/lib/templates/email/passwordRecovery.js +1 -1
  168. package/lib/templates/email/verifyEmail.js +1 -1
  169. package/lib/templates/email/welcome.js +1 -1
  170. package/lib/templates/sms/passwordForgot.js +1 -1
  171. package/lib/templates/sms/passwordRecovery.js +1 -1
  172. package/lib/templates/sms/verifyEmail.js +1 -1
  173. package/lib/templates/sms/verifyPhone.js +1 -1
  174. package/lib/templates/sms/welcome.js +1 -1
  175. package/lib/types/analytics.types.d.ts +92 -0
  176. package/lib/types/analytics.types.js +6 -0
  177. package/lib/types/apps.types.d.ts +1 -1
  178. package/lib/types/apps.types.js +2 -2
  179. package/lib/types/arangodb.types.d.ts +2 -2
  180. package/lib/types/arangodb.types.js +2 -2
  181. package/lib/types/auth.types.d.ts +4 -1
  182. package/lib/types/auth.types.js +2 -2
  183. package/lib/types/connections.types.d.ts +1 -1
  184. package/lib/types/connections.types.js +2 -2
  185. package/lib/types/content.types.d.ts +1 -1
  186. package/lib/types/content.types.js +2 -2
  187. package/lib/types/conversations.types.d.ts +1 -1
  188. package/lib/types/conversations.types.js +2 -2
  189. package/lib/types/crm.types.d.ts +58 -2
  190. package/lib/types/crm.types.js +2 -2
  191. package/lib/types/email.types.d.ts +1 -1
  192. package/lib/types/email.types.js +2 -2
  193. package/lib/types/error.types.js +1 -1
  194. package/lib/types/files.types.d.ts +1 -1
  195. package/lib/types/files.types.js +2 -2
  196. package/lib/types/flags.types.d.ts +28 -0
  197. package/lib/types/flags.types.js +3 -0
  198. package/lib/types/google.types.d.ts +1 -1
  199. package/lib/types/google.types.js +2 -2
  200. package/lib/types/groups.types.d.ts +1 -1
  201. package/lib/types/groups.types.js +2 -2
  202. package/lib/types/images.types.d.ts +1 -1
  203. package/lib/types/images.types.js +2 -2
  204. package/lib/types/index.d.ts +3 -1
  205. package/lib/types/index.js +4 -2
  206. package/lib/types/locations.types.d.ts +1 -1
  207. package/lib/types/locations.types.js +2 -2
  208. package/lib/types/messages.types.d.ts +1 -1
  209. package/lib/types/messages.types.js +2 -2
  210. package/lib/types/notifications.types.d.ts +1 -1
  211. package/lib/types/notifications.types.js +2 -2
  212. package/lib/types/payments.types.d.ts +4 -1
  213. package/lib/types/payments.types.js +2 -2
  214. package/lib/types/personas.types.js +1 -1
  215. package/lib/types/posts.types.d.ts +1 -1
  216. package/lib/types/posts.types.js +2 -2
  217. package/lib/types/rum.types.d.ts +3 -3
  218. package/lib/types/rum.types.js +2 -2
  219. package/lib/types/statistics.types.js +1 -1
  220. package/lib/types/tags.types.d.ts +1 -1
  221. package/lib/types/tags.types.js +2 -2
  222. package/lib/types/users.types.d.ts +2 -1
  223. package/lib/types/users.types.js +2 -2
  224. package/lib/types/videos.types.d.ts +1 -1
  225. package/lib/types/videos.types.js +2 -2
  226. package/lib/types/websockets.types.d.ts +1 -1
  227. package/lib/types/websockets.types.js +2 -2
  228. package/lib/upload.js +4 -9
  229. package/lib/utils/adapterUtils.d.ts +1 -1
  230. package/lib/utils/adapterUtils.js +2 -2
  231. package/lib/utils/analyticsUtils.d.ts +1 -1
  232. package/lib/utils/analyticsUtils.js +2 -2
  233. package/lib/utils/appContext.d.ts +2 -0
  234. package/lib/utils/appContext.js +10 -0
  235. package/lib/utils/aqlHelpers.d.ts +1 -1
  236. package/lib/utils/aqlHelpers.js +2 -2
  237. package/lib/utils/arangodbUtils.d.ts +9 -1
  238. package/lib/utils/arangodbUtils.js +10 -2
  239. package/lib/utils/authUtils.js +2 -2
  240. package/lib/utils/awsUtils.js +2 -2
  241. package/lib/utils/collectionRegistry.d.ts +1 -1
  242. package/lib/utils/collectionRegistry.js +17 -2
  243. package/lib/utils/contextUtils.d.ts +2 -2
  244. package/lib/utils/contextUtils.js +2 -2
  245. package/lib/utils/dbI18n.example.d.ts +1 -1
  246. package/lib/utils/dbI18n.example.js +2 -2
  247. package/lib/utils/dbI18n.js +2 -2
  248. package/lib/utils/googleTranslate.d.ts +1 -1
  249. package/lib/utils/googleTranslate.js +2 -2
  250. package/lib/utils/graphqlUtils.d.ts +2 -0
  251. package/lib/utils/graphqlUtils.js +1 -1
  252. package/lib/utils/imageUtils.js +1 -1
  253. package/lib/utils/index.d.ts +1 -1
  254. package/lib/utils/index.js +2 -2
  255. package/lib/utils/languageDetection.js +1 -1
  256. package/lib/utils/localeUtils.d.ts +1 -1
  257. package/lib/utils/localeUtils.example.d.ts +1 -1
  258. package/lib/utils/localeUtils.example.js +2 -2
  259. package/lib/utils/localeUtils.js +2 -2
  260. package/lib/utils/middlewareUtils.js +1 -1
  261. package/lib/utils/queryBuilder.d.ts +1 -1
  262. package/lib/utils/queryBuilder.js +2 -2
  263. package/lib/utils/schemaUtils.js +1 -1
  264. package/lib/utils/sessionUtils.d.ts +4 -0
  265. package/lib/utils/sessionUtils.js +2 -2
  266. package/lib/utils/stripeUtils.d.ts +1 -1
  267. package/lib/utils/stripeUtils.js +2 -2
  268. package/lib/utils/templateUtils.js +1 -1
  269. package/lib/utils/testUtils.js +2 -2
  270. package/lib/utils/translationQueue.d.ts +1 -1
  271. package/lib/utils/translationQueue.example.d.ts +1 -1
  272. package/lib/utils/translationQueue.example.js +2 -2
  273. package/lib/utils/translationQueue.js +2 -2
  274. package/lib/videoProcessing.js +1 -1
  275. package/package.json +49 -86
  276. package/lib/actions/websockets.d.ts +0 -20
  277. package/lib/actions/websockets.js +0 -164
  278. package/lib/mocks/nlabs.png +0 -0
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "@nlabs/reaktor",
3
- "version": "1.6.3",
4
- "description": "Reaktor",
5
- "license": "Apache-2.0",
3
+ "version": "1.8.0",
4
+ "description": "GraphQL and ArangoDB application platform for typed actions, authentication, billing, media, messaging, and realtime services.",
5
+ "license": "SEE LICENSE IN LICENSE",
6
6
  "type": "module",
7
7
  "main": "./lib/index.js",
8
8
  "module": "./lib/index.js",
@@ -27,11 +27,23 @@
27
27
  }
28
28
  },
29
29
  "keywords": [
30
- "reaktor",
31
- "nitrogenlabs",
32
- "react",
30
+ "api",
31
+ "arangodb",
33
32
  "arkhamjs",
34
- "graphql"
33
+ "authentication",
34
+ "aws-lambda",
35
+ "backend",
36
+ "billing",
37
+ "database",
38
+ "graphql",
39
+ "messaging",
40
+ "nitrogenlabs",
41
+ "reaktor",
42
+ "realtime",
43
+ "serverless",
44
+ "stripe",
45
+ "typescript",
46
+ "websocket"
35
47
  ],
36
48
  "author": {
37
49
  "name": "Giraldo Rosales",
@@ -40,18 +52,22 @@
40
52
  },
41
53
  "repository": {
42
54
  "type": "git",
43
- "url": "git+https://github.com/nitrogenlabs/reaktor.git"
55
+ "url": "git+https://github.com/nitrogenlabs/reaktor.git",
56
+ "directory": "packages/reaktor"
44
57
  },
45
- "homepage": "https://github.com/nitrogenlabs/reaktor",
58
+ "homepage": "https://reaktor.nitrogenx.co",
46
59
  "bugs": {
47
60
  "url": "https://github.com/nitrogenlabs/reaktor/issues"
48
61
  },
62
+ "publishConfig": {
63
+ "access": "public"
64
+ },
49
65
  "scripts": {
50
66
  "build": "lex compile --remove --config tsconfig.build.json",
51
67
  "build:dev": "APP_ENV=dev NODE_ENV=development lex compile --remove --config tsconfig.build.json",
52
68
  "build:prod": "APP_ENV=prod NODE_ENV=production lex compile --remove --config tsconfig.build.json",
53
69
  "clean": "lex clean",
54
- "lint": "lex lint --fix",
70
+ "lint": "lex lint --fix --config ../../eslint.config.mjs --maxWarnings 0",
55
71
  "prepack": "npm run build && npm run verify:package",
56
72
  "preversion": "npm run build && npm run verify:package",
57
73
  "publish:major": "npm version major && npm run publish:tags && npm publish",
@@ -65,19 +81,19 @@
65
81
  "watch": "lex compile --remove --watch"
66
82
  },
67
83
  "dependencies": {
68
- "@aws-sdk/client-apigatewaymanagementapi": "^3.1111.0",
69
- "@aws-sdk/client-dynamodb": "^3.1111.0",
70
- "@aws-sdk/client-mediaconvert": "^3.1111.0",
71
- "@aws-sdk/client-rum": "^3.1112.0",
72
- "@aws-sdk/client-s3": "^3.1111.0",
73
- "@aws-sdk/client-ses": "^3.1111.0",
74
- "@aws-sdk/client-sns": "^3.1111.0",
75
- "@aws-sdk/s3-request-presigner": "^3.1111.0",
76
- "@nlabs/arkhamjs": "^3.31.11",
77
- "@nlabs/rip-hunter": "^3.1.1",
78
- "@nlabs/utils": "^2.10.5",
84
+ "@aws-sdk/client-apigatewaymanagementapi": "^3.1125.0",
85
+ "@aws-sdk/client-dynamodb": "^3.1125.0",
86
+ "@aws-sdk/client-mediaconvert": "^3.1125.0",
87
+ "@aws-sdk/client-rum": "^3.1125.0",
88
+ "@aws-sdk/client-s3": "^3.1125.0",
89
+ "@aws-sdk/client-ses": "^3.1125.0",
90
+ "@aws-sdk/client-sns": "^3.1125.0",
91
+ "@aws-sdk/s3-request-presigner": "^3.1125.0",
92
+ "@nlabs/arkhamjs": "3.31.15",
93
+ "@nlabs/rip-hunter": "^3.1.2",
94
+ "@nlabs/utils": "^2.10.7",
79
95
  "apn": "npm:@parse/node-apn@^8.1.0",
80
- "arangojs": "^10.3.1",
96
+ "arangojs": "^10.4.0",
81
97
  "busboy": "^1.6.0",
82
98
  "child_process": "^1.0.2",
83
99
  "core-js": "^3.50.0",
@@ -85,9 +101,9 @@
85
101
  "file-type": "^22.0.2",
86
102
  "google-libphonenumber": "^3.2.46",
87
103
  "graphql": "^16.14.2",
88
- "graphql-compose": "^9.1.0",
104
+ "graphql-compose": "^9.2.1",
89
105
  "graphql-fields": "^2.0.3",
90
- "i18next": "^26.3.6",
106
+ "i18next": "^26.4.1",
91
107
  "jsonwebtoken": "^9.0.3",
92
108
  "luxon": "^3.7.2",
93
109
  "mime-types": "^3.0.2",
@@ -96,74 +112,21 @@
96
112
  "sanitize-html": "^2.17.7",
97
113
  "sharp": "0.35.3",
98
114
  "spawn-sync": "^2.0.0",
99
- "stripe": "^22.5.0",
115
+ "stripe": "^22.6.1",
100
116
  "tls": "0.0.1",
101
117
  "typed-promisify": "^0.4.0",
102
- "zod": "^4.4.3"
118
+ "zod": "^4.5.4"
103
119
  },
104
120
  "devDependencies": {
105
- "@nlabs/lex": "^1.59.5",
106
- "@types/aws-lambda": "^8.10.162",
121
+ "@nlabs/lex": "^2.0.6",
122
+ "@types/aws-lambda": "^8.10.163",
107
123
  "@types/busboy": "^1.5.4",
108
- "@types/history": "^5.0.0",
109
- "@types/luxon": "^3.7.4",
110
- "@types/node": "^26.2.0",
111
- "@types/stripe": "^8.0.417",
112
- "@types/twilio": "^3.19.3",
124
+ "@types/luxon": "^3.7.5",
125
+ "@types/node": "^26.4.1",
126
+ "@vitest/coverage-v8": "^4.1.11",
113
127
  "chokidar": "^5.0.0",
114
128
  "graphql-tools": "^9.0.34",
115
- "typescript": "^6.0.3",
116
- "vitest": "^4.1.10"
117
- },
118
- "overrides": {
119
- "@swc/cli": "0.8.1",
120
- "@swc/core": "1.15.47",
121
- "@xhmikosr/decompress": "11.1.4",
122
- "@xmldom/xmldom": "0.9.10",
123
- "axios": "1.19.0",
124
- "body-parser": "2.3.0",
125
- "brace-expansion": "2.1.4",
126
- "css-loader": "7.1.4",
127
- "cross-spawn": "7.0.6",
128
- "fast-uri": "3.1.5",
129
- "fast-xml-parser": "5.7.3",
130
- "file-type": "$file-type",
131
- "follow-redirects": "1.16.0",
132
- "form-data": "4.0.6",
133
- "got": "11.8.6",
134
- "http-cache-semantics": "4.2.0",
135
- "http-proxy-middleware": "2.0.10",
136
- "icss-utils": "5.1.0",
137
- "is-svg": "6.1.0",
138
- "js-yaml": "4.3.1",
139
- "jsonwebtoken": "$jsonwebtoken",
140
- "lodash": "4.18.1",
141
- "lodash-es": "4.18.1",
142
- "minimist": "1.2.8",
143
- "nanoid": "3.3.18",
144
- "node-forge": "1.4.0",
145
- "path-to-regexp": "8.4.2",
146
- "picomatch": "4.0.4",
147
- "piscina": "4.9.3",
148
- "postcss": "8.5.26",
149
- "postcss-modules-extract-imports": "3.1.0",
150
- "postcss-modules-local-by-default": "4.2.0",
151
- "postcss-modules-scope": "3.2.1",
152
- "postcss-modules-values": "4.0.0",
153
- "postcss-simple-vars": "7.0.1",
154
- "postcss-url": {
155
- ".": "10.1.3",
156
- "minimatch": "3.1.4"
157
- },
158
- "semver-regex": "4.0.5",
159
- "serialize-javascript": "7.0.5",
160
- "sharp": "0.35.3",
161
- "tmp": "0.2.7",
162
- "typescript-eslint": "8.65.0",
163
- "vite": "8.2.1",
164
- "webpack-plugin-serve": {
165
- "ws": "7.5.13"
166
- },
167
- "yaml": "2.9.0"
129
+ "typescript": "^7.0.2",
130
+ "vitest": "^4.1.11"
168
131
  }
169
132
  }
@@ -1,20 +0,0 @@
1
- import { ApiContext } from '../types/auth.types.js';
2
- import type { WebsocketConnection } from '../types/websockets.types.js';
3
- export declare const addSocket: (socketId: string, token: string) => Promise<WebsocketConnection>;
4
- export declare const getSocketByUser: (userId: string) => Promise<WebsocketConnection>;
5
- export declare const getSocketById: (socketId: string) => Promise<any>;
6
- export declare const getConnectionByConversation: (context: ApiContext, conversationId: string) => Promise<any>;
7
- export declare const removeSocket: (socketId: string) => Promise<WebsocketConnection>;
8
- export interface WebSocketClientContext {
9
- readonly requestContext?: {
10
- readonly apiId: string;
11
- readonly domainName: string;
12
- readonly stage: string;
13
- };
14
- }
15
- export declare class WebsocketClient {
16
- client: any;
17
- constructor(config?: any);
18
- setupClient({ requestContext }: WebSocketClientContext): Promise<void>;
19
- send(connection: any, payload: any): Promise<boolean>;
20
- }
@@ -1,164 +0,0 @@
1
- /**
2
- * Copyright (c) 2019-Present, Nitrogen Labs, Inc.
3
- * Copyrights licensed under the MIT License. See the accompanying LICENSE file for terms.
4
- */ import { ApiGatewayManagementApi } from '@aws-sdk/client-apigatewaymanagementapi';
5
- import { createHash, parseId, parseString } from '@nlabs/utils/parsers/strings';
6
- import { aql } from 'arangojs';
7
- import { Config } from '../config.js';
8
- import { useDb } from '../utils/arangodbUtils.js';
9
- import { getUserByToken } from './users.js';
10
- import { ErrorTypes } from '../types/error.types.js';
11
- import { logError } from '../utils/analyticsUtils.js';
12
- export const addSocket = async (socketId, token)=>{
13
- const action = 'addSocket';
14
- const formatSocketId = parseString(socketId, 32);
15
- const formatToken = parseString(token);
16
- try {
17
- const databaseName = process.env.ARANGODB_DATABASE || '';
18
- const database = useDb(databaseName);
19
- const user = await getUserByToken({
20
- config: Config.get(),
21
- databaseName
22
- }, formatToken);
23
- if (!user) {
24
- throw new Error('Unauthorized');
25
- }
26
- const update = {
27
- socketId: formatSocketId,
28
- modified: Date.now()
29
- };
30
- const insert = {
31
- ...update,
32
- _key: createHash(`socket-${formatSocketId}`),
33
- userId: user.userId
34
- };
35
- const aqlQry = aql`UPSERT {userId: ${user.userId}}
36
- INSERT ${insert}
37
- UPDATE ${update}
38
- IN sockets RETURN NEW`;
39
- return database.query(aqlQry).then((cursor)=>cursor.next()).catch((error)=>{
40
- throw logError({
41
- action,
42
- category: 'websockets',
43
- value: ErrorTypes.DATABASE_ERROR
44
- }, error, {});
45
- });
46
- } catch (error) {
47
- throw new Error('Unauthorized');
48
- }
49
- };
50
- export const getSocketByUser = (userId)=>{
51
- const formatUserId = parseId(userId);
52
- const databaseName = process.env.ARANGODB_DATABASE || '';
53
- const database = useDb(databaseName);
54
- const aqlQry = aql`FOR s IN sockets
55
- FILTER s.userId == ${formatUserId}
56
- LIMIT 1
57
- RETURN s`;
58
- return database.query(aqlQry).then((cursor)=>cursor.next()).catch((error)=>{
59
- throw error;
60
- });
61
- };
62
- export const getSocketById = (socketId)=>{
63
- const formatSocketId = parseId(socketId);
64
- const databaseName = process.env.ARANGODB_DATABASE || '';
65
- const database = useDb(databaseName);
66
- const aqlQry = aql`FOR s IN sockets
67
- FILTER s.socketId == ${formatSocketId}
68
- LET user = FIRST(
69
- FOR u IN users
70
- FILTER u.sub == s.sub
71
- LIMIT 1
72
- RETURN u;
73
- )
74
- LIMIT 1
75
- RETURN MERGE(s, {user})`;
76
- return database.query(aqlQry).then((cursor)=>cursor.next()).catch((error)=>{
77
- throw error;
78
- });
79
- };
80
- export const getConnectionByConversation = (context, conversationId)=>{
81
- const { databaseName, session: { userId: sessionId } = {} } = context;
82
- const sessionDocId = `users/${parseId(sessionId)}`;
83
- const conversationDocId = `conversations/${parseId(conversationId)}`;
84
- const database = useDb(databaseName);
85
- const aqlQry = aql`FOR c, e IN 1..1 OUTBOUND ${sessionDocId} hasConversation
86
- FILTER c._id == ${conversationDocId}
87
- LIMIT 1
88
- LET u = (
89
- FOR inUser, inEdge IN 1..1 INBOUND ${conversationDocId} hasConversation
90
- FOR n IN connections
91
- FILTER inUser.sub == n.sub
92
- RETURN n.connectionId
93
- )
94
- RETURN u`;
95
- return database.query(aqlQry).then((cursor)=>cursor.all()).catch((error)=>{
96
- throw error;
97
- });
98
- };
99
- export const removeSocket = (socketId)=>{
100
- const action = 'removeSocket';
101
- const formatSocketId = parseString(socketId, 32);
102
- const databaseName = process.env.ARANGODB_DATABASE || '';
103
- const database = useDb(databaseName);
104
- const aqlQry = aql`FOR s IN sockets
105
- FILTER s.socketId == ${formatSocketId}
106
- LIMIT 1
107
- REMOVE s IN sockets
108
- RETURN OLD`;
109
- return database.query(aqlQry).then((cursor)=>cursor.next()).catch((error)=>{
110
- throw logError({
111
- action,
112
- category: 'websockets',
113
- value: ErrorTypes.DATABASE_ERROR
114
- }, error, {});
115
- });
116
- };
117
- export class WebsocketClient {
118
- client;
119
- constructor(config){
120
- if (config) {
121
- this.setupClient(config || {});
122
- }
123
- }
124
- // Allow just passing a single event to setup the client for ease of use
125
- async setupClient({ requestContext }) {
126
- if (!this.client && requestContext) {
127
- const { apiId, domainName, stage } = requestContext;
128
- let updatedDomainName = domainName;
129
- if (apiId) {
130
- updatedDomainName = `${apiId}.execute-api.${process.env.API_REGION}.amazonaws.com`;
131
- }
132
- this.client = new ApiGatewayManagementApi({
133
- credentials: Config.get('aws.credentials'),
134
- endpoint: `https://${updatedDomainName}/${stage}`,
135
- region: Config.get('aws.region')
136
- });
137
- }
138
- }
139
- async send(connection, payload) {
140
- console.log(connection, payload);
141
- // Cheat and allow event to be passed in this also lets us default to setupClient too
142
- let socketId;
143
- if (connection?.requestContext) {
144
- await this.setupClient(connection);
145
- const { socketId: updatedSocketId } = connection.requestContext;
146
- socketId = updatedSocketId;
147
- } else {
148
- socketId = connection;
149
- }
150
- await this.client.postToConnection({
151
- ConnectionId: socketId,
152
- Data: JSON.stringify(payload)
153
- }).promise().catch(async (postError)=>{
154
- console.log(JSON.stringify(postError));
155
- if (postError.statusCode === 410) {
156
- // Disconnect client
157
- await removeSocket(socketId);
158
- }
159
- });
160
- return true;
161
- }
162
- }
163
-
164
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L3JlYWt0b3Ivc3JjL2FjdGlvbnMvd2Vic29ja2V0cy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOS1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuaW1wb3J0IHtBcGlHYXRld2F5TWFuYWdlbWVudEFwaX0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LWFwaWdhdGV3YXltYW5hZ2VtZW50YXBpJztcbmltcG9ydCB7Y3JlYXRlSGFzaCwgcGFyc2VJZCwgcGFyc2VTdHJpbmd9IGZyb20gJ0BubGFicy91dGlscy9wYXJzZXJzL3N0cmluZ3MnO1xuaW1wb3J0IHthcWwsIERhdGFiYXNlfSBmcm9tICdhcmFuZ29qcyc7XG5pbXBvcnQge0FxbFF1ZXJ5fSBmcm9tICdhcmFuZ29qcy9hcWwnO1xuXG5pbXBvcnQge0NvbmZpZ30gZnJvbSAnLi4vY29uZmlnLmpzJztcbmltcG9ydCB7QXBpQ29udGV4dH0gZnJvbSAnLi4vdHlwZXMvYXV0aC50eXBlcy5qcyc7XG5pbXBvcnQge3VzZURifSBmcm9tICcuLi91dGlscy9hcmFuZ29kYlV0aWxzLmpzJztcbmltcG9ydCB7Z2V0VXNlckJ5VG9rZW59IGZyb20gJy4vdXNlcnMuanMnO1xuXG5pbXBvcnQge0Vycm9yVHlwZXN9IGZyb20gJy4uL3R5cGVzL2Vycm9yLnR5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtXZWJzb2NrZXRDb25uZWN0aW9ufSBmcm9tICcuLi90eXBlcy93ZWJzb2NrZXRzLnR5cGVzLmpzJztcbmltcG9ydCB7bG9nRXJyb3J9IGZyb20gJy4uL3V0aWxzL2FuYWx5dGljc1V0aWxzLmpzJztcblxuZXhwb3J0IGNvbnN0IGFkZFNvY2tldCA9IGFzeW5jIChzb2NrZXRJZDogc3RyaW5nLCB0b2tlbjogc3RyaW5nKTogUHJvbWlzZTxXZWJzb2NrZXRDb25uZWN0aW9uPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdhZGRTb2NrZXQnO1xuICBjb25zdCBmb3JtYXRTb2NrZXRJZCA9IHBhcnNlU3RyaW5nKHNvY2tldElkLCAzMik7XG4gIGNvbnN0IGZvcm1hdFRva2VuID0gcGFyc2VTdHJpbmcodG9rZW4pO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgZGF0YWJhc2VOYW1lID0gcHJvY2Vzcy5lbnYuQVJBTkdPREJfREFUQUJBU0UgfHwgJyc7XG4gICAgY29uc3QgZGF0YWJhc2U6IERhdGFiYXNlID0gdXNlRGIoZGF0YWJhc2VOYW1lKTtcbiAgICBjb25zdCB1c2VyID0gYXdhaXQgZ2V0VXNlckJ5VG9rZW4oe2NvbmZpZzogQ29uZmlnLmdldCgpLCBkYXRhYmFzZU5hbWV9LCBmb3JtYXRUb2tlbik7XG5cbiAgICBpZighdXNlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmF1dGhvcml6ZWQnKTtcbiAgICB9XG5cbiAgICBjb25zdCB1cGRhdGUgPSB7XG4gICAgICBzb2NrZXRJZDogZm9ybWF0U29ja2V0SWQsXG4gICAgICBtb2RpZmllZDogRGF0ZS5ub3coKVxuICAgIH07XG4gICAgY29uc3QgaW5zZXJ0ID0ge1xuICAgICAgLi4udXBkYXRlLFxuICAgICAgX2tleTogY3JlYXRlSGFzaChgc29ja2V0LSR7Zm9ybWF0U29ja2V0SWR9YCksXG4gICAgICB1c2VySWQ6IHVzZXIudXNlcklkXG4gICAgfTtcbiAgICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYFVQU0VSVCB7dXNlcklkOiAke3VzZXIudXNlcklkfX1cbiAgICAgIElOU0VSVCAke2luc2VydH1cbiAgICAgIFVQREFURSAke3VwZGF0ZX1cbiAgICAgIElOIHNvY2tldHMgUkVUVVJOIE5FV2A7XG5cbiAgICByZXR1cm4gZGF0YWJhc2UucXVlcnkoYXFsUXJ5KVxuICAgICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICAgIHRocm93IGxvZ0Vycm9yKHtcbiAgICAgICAgICBhY3Rpb24sXG4gICAgICAgICAgY2F0ZWdvcnk6ICd3ZWJzb2NrZXRzJyxcbiAgICAgICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgICB9LCBlcnJvciwge30pO1xuICAgICAgfSk7XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYXV0aG9yaXplZCcpO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0U29ja2V0QnlVc2VyID0gKHVzZXJJZDogc3RyaW5nKTogUHJvbWlzZTxXZWJzb2NrZXRDb25uZWN0aW9uPiA9PiB7XG4gIGNvbnN0IGZvcm1hdFVzZXJJZCA9IHBhcnNlSWQodXNlcklkKTtcbiAgY29uc3QgZGF0YWJhc2VOYW1lID0gcHJvY2Vzcy5lbnYuQVJBTkdPREJfREFUQUJBU0UgfHwgJyc7XG4gIGNvbnN0IGRhdGFiYXNlOiBEYXRhYmFzZSA9IHVzZURiKGRhdGFiYXNlTmFtZSk7XG4gIGNvbnN0IGFxbFFyeSA9IGFxbGBGT1IgcyBJTiBzb2NrZXRzXG4gICAgRklMVEVSIHMudXNlcklkID09ICR7Zm9ybWF0VXNlcklkfVxuICAgIExJTUlUIDFcbiAgICBSRVRVUk4gc2A7XG5cbiAgcmV0dXJuIGRhdGFiYXNlLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRTb2NrZXRCeUlkID0gKHNvY2tldElkOiBzdHJpbmcpOiBQcm9taXNlPGFueT4gPT4ge1xuICBjb25zdCBmb3JtYXRTb2NrZXRJZCA9IHBhcnNlSWQoc29ja2V0SWQpO1xuICBjb25zdCBkYXRhYmFzZU5hbWUgPSBwcm9jZXNzLmVudi5BUkFOR09EQl9EQVRBQkFTRSB8fCAnJztcbiAgY29uc3QgZGF0YWJhc2U6IERhdGFiYXNlID0gdXNlRGIoZGF0YWJhc2VOYW1lKTtcbiAgY29uc3QgYXFsUXJ5ID0gYXFsYEZPUiBzIElOIHNvY2tldHNcbiAgICBGSUxURVIgcy5zb2NrZXRJZCA9PSAke2Zvcm1hdFNvY2tldElkfVxuICAgIExFVCB1c2VyID0gRklSU1QoXG4gICAgICBGT1IgdSBJTiB1c2Vyc1xuICAgICAgRklMVEVSIHUuc3ViID09IHMuc3ViXG4gICAgICBMSU1JVCAxXG4gICAgICBSRVRVUk4gdTtcbiAgICApXG4gICAgTElNSVQgMVxuICAgIFJFVFVSTiBNRVJHRShzLCB7dXNlcn0pYDtcblxuICByZXR1cm4gZGF0YWJhc2UucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldENvbm5lY3Rpb25CeUNvbnZlcnNhdGlvbiA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBjb252ZXJzYXRpb25JZDogc3RyaW5nKTogUHJvbWlzZTxhbnk+ID0+IHtcbiAgY29uc3Qge2RhdGFiYXNlTmFtZSwgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfSA9IHt9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IHNlc3Npb25Eb2NJZCA9IGB1c2Vycy8ke3BhcnNlSWQoc2Vzc2lvbklkKX1gO1xuICBjb25zdCBjb252ZXJzYXRpb25Eb2NJZCA9IGBjb252ZXJzYXRpb25zLyR7cGFyc2VJZChjb252ZXJzYXRpb25JZCl9YDtcbiAgY29uc3QgZGF0YWJhc2U6IERhdGFiYXNlID0gdXNlRGIoZGF0YWJhc2VOYW1lKTtcbiAgY29uc3QgYXFsUXJ5ID0gYXFsYEZPUiBjLCBlIElOIDEuLjEgT1VUQk9VTkQgJHtzZXNzaW9uRG9jSWR9IGhhc0NvbnZlcnNhdGlvblxuICBGSUxURVIgYy5faWQgPT0gJHtjb252ZXJzYXRpb25Eb2NJZH1cbiAgTElNSVQgMVxuICBMRVQgdSA9IChcbiAgICBGT1IgaW5Vc2VyLCBpbkVkZ2UgSU4gMS4uMSBJTkJPVU5EICR7Y29udmVyc2F0aW9uRG9jSWR9IGhhc0NvbnZlcnNhdGlvblxuICAgIEZPUiBuIElOIGNvbm5lY3Rpb25zXG4gICAgRklMVEVSIGluVXNlci5zdWIgPT0gbi5zdWJcbiAgICBSRVRVUk4gbi5jb25uZWN0aW9uSWRcbiAgKVxuICBSRVRVUk4gdWA7XG5cbiAgcmV0dXJuIGRhdGFiYXNlLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IHJlbW92ZVNvY2tldCA9IChzb2NrZXRJZDogc3RyaW5nKTogUHJvbWlzZTxXZWJzb2NrZXRDb25uZWN0aW9uPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdyZW1vdmVTb2NrZXQnO1xuICBjb25zdCBmb3JtYXRTb2NrZXRJZCA9IHBhcnNlU3RyaW5nKHNvY2tldElkLCAzMik7XG4gIGNvbnN0IGRhdGFiYXNlTmFtZSA9IHByb2Nlc3MuZW52LkFSQU5HT0RCX0RBVEFCQVNFIHx8ICcnO1xuICBjb25zdCBkYXRhYmFzZTogRGF0YWJhc2UgPSB1c2VEYihkYXRhYmFzZU5hbWUpO1xuICBjb25zdCBhcWxRcnkgPSBhcWxgRk9SIHMgSU4gc29ja2V0c1xuICAgICAgRklMVEVSIHMuc29ja2V0SWQgPT0gJHtmb3JtYXRTb2NrZXRJZH1cbiAgICAgIExJTUlUIDFcbiAgICAgIFJFTU9WRSBzIElOIHNvY2tldHNcbiAgICAgIFJFVFVSTiBPTERgO1xuXG4gIHJldHVybiBkYXRhYmFzZS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgdGhyb3cgbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiAnd2Vic29ja2V0cycsXG4gICAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgICB9LCBlcnJvciwge30pO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBXZWJTb2NrZXRDbGllbnRDb250ZXh0IHtcbiAgcmVhZG9ubHkgcmVxdWVzdENvbnRleHQ/OiB7XG4gICAgcmVhZG9ubHkgYXBpSWQ6IHN0cmluZztcbiAgICByZWFkb25seSBkb21haW5OYW1lOiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgc3RhZ2U6IHN0cmluZztcbiAgfTtcbn1cbmV4cG9ydCBjbGFzcyBXZWJzb2NrZXRDbGllbnQge1xuICBjbGllbnQ7XG5cbiAgY29uc3RydWN0b3IoY29uZmlnPykge1xuICAgIGlmKGNvbmZpZykge1xuICAgICAgdGhpcy5zZXR1cENsaWVudChjb25maWcgfHwge30pO1xuICAgIH1cbiAgfVxuXG4gIC8vIEFsbG93IGp1c3QgcGFzc2luZyBhIHNpbmdsZSBldmVudCB0byBzZXR1cCB0aGUgY2xpZW50IGZvciBlYXNlIG9mIHVzZVxuICBhc3luYyBzZXR1cENsaWVudCh7cmVxdWVzdENvbnRleHR9OiBXZWJTb2NrZXRDbGllbnRDb250ZXh0KSB7XG4gICAgaWYoIXRoaXMuY2xpZW50ICYmIHJlcXVlc3RDb250ZXh0KSB7XG4gICAgICBjb25zdCB7YXBpSWQsIGRvbWFpbk5hbWUsIHN0YWdlfSA9IHJlcXVlc3RDb250ZXh0O1xuICAgICAgbGV0IHVwZGF0ZWREb21haW5OYW1lID0gZG9tYWluTmFtZTtcblxuICAgICAgaWYoYXBpSWQpIHtcbiAgICAgICAgdXBkYXRlZERvbWFpbk5hbWUgPSBgJHthcGlJZH0uZXhlY3V0ZS1hcGkuJHtwcm9jZXNzLmVudi5BUElfUkVHSU9OfS5hbWF6b25hd3MuY29tYDtcbiAgICAgIH1cblxuICAgICAgdGhpcy5jbGllbnQgPSBuZXcgQXBpR2F0ZXdheU1hbmFnZW1lbnRBcGkoe1xuICAgICAgICBjcmVkZW50aWFsczogQ29uZmlnLmdldCgnYXdzLmNyZWRlbnRpYWxzJyksXG4gICAgICAgIGVuZHBvaW50OiBgaHR0cHM6Ly8ke3VwZGF0ZWREb21haW5OYW1lfS8ke3N0YWdlfWAsXG4gICAgICAgIHJlZ2lvbjogQ29uZmlnLmdldCgnYXdzLnJlZ2lvbicpXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBzZW5kKGNvbm5lY3Rpb24sIHBheWxvYWQpIHtcbiAgICBjb25zb2xlLmxvZyhjb25uZWN0aW9uLCBwYXlsb2FkKTtcblxuICAgIC8vIENoZWF0IGFuZCBhbGxvdyBldmVudCB0byBiZSBwYXNzZWQgaW4gdGhpcyBhbHNvIGxldHMgdXMgZGVmYXVsdCB0byBzZXR1cENsaWVudCB0b29cbiAgICBsZXQgc29ja2V0SWQ7XG5cbiAgICBpZihjb25uZWN0aW9uPy5yZXF1ZXN0Q29udGV4dCkge1xuICAgICAgYXdhaXQgdGhpcy5zZXR1cENsaWVudChjb25uZWN0aW9uKTtcbiAgICAgIGNvbnN0IHtzb2NrZXRJZDogdXBkYXRlZFNvY2tldElkfSA9IGNvbm5lY3Rpb24ucmVxdWVzdENvbnRleHQ7XG4gICAgICBzb2NrZXRJZCA9IHVwZGF0ZWRTb2NrZXRJZDtcbiAgICB9IGVsc2Uge1xuICAgICAgc29ja2V0SWQgPSBjb25uZWN0aW9uO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuY2xpZW50LnBvc3RUb0Nvbm5lY3Rpb24oe0Nvbm5lY3Rpb25JZDogc29ja2V0SWQsIERhdGE6IEpTT04uc3RyaW5naWZ5KHBheWxvYWQpfSlcbiAgICAgIC5wcm9taXNlKClcbiAgICAgIC5jYXRjaChhc3luYyAocG9zdEVycm9yKSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHBvc3RFcnJvcikpO1xuXG4gICAgICAgIGlmKHBvc3RFcnJvci5zdGF0dXNDb2RlID09PSA0MTApIHtcbiAgICAgICAgICAvLyBEaXNjb25uZWN0IGNsaWVudFxuICAgICAgICAgIGF3YWl0IHJlbW92ZVNvY2tldChzb2NrZXRJZCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJBcGlHYXRld2F5TWFuYWdlbWVudEFwaSIsImNyZWF0ZUhhc2giLCJwYXJzZUlkIiwicGFyc2VTdHJpbmciLCJhcWwiLCJDb25maWciLCJ1c2VEYiIsImdldFVzZXJCeVRva2VuIiwiRXJyb3JUeXBlcyIsImxvZ0Vycm9yIiwiYWRkU29ja2V0Iiwic29ja2V0SWQiLCJ0b2tlbiIsImFjdGlvbiIsImZvcm1hdFNvY2tldElkIiwiZm9ybWF0VG9rZW4iLCJkYXRhYmFzZU5hbWUiLCJwcm9jZXNzIiwiZW52IiwiQVJBTkdPREJfREFUQUJBU0UiLCJkYXRhYmFzZSIsInVzZXIiLCJjb25maWciLCJnZXQiLCJFcnJvciIsInVwZGF0ZSIsIm1vZGlmaWVkIiwiRGF0ZSIsIm5vdyIsImluc2VydCIsIl9rZXkiLCJ1c2VySWQiLCJhcWxRcnkiLCJxdWVyeSIsInRoZW4iLCJjdXJzb3IiLCJuZXh0IiwiY2F0Y2giLCJlcnJvciIsImNhdGVnb3J5IiwidmFsdWUiLCJEQVRBQkFTRV9FUlJPUiIsImdldFNvY2tldEJ5VXNlciIsImZvcm1hdFVzZXJJZCIsImdldFNvY2tldEJ5SWQiLCJnZXRDb25uZWN0aW9uQnlDb252ZXJzYXRpb24iLCJjb250ZXh0IiwiY29udmVyc2F0aW9uSWQiLCJzZXNzaW9uIiwic2Vzc2lvbklkIiwic2Vzc2lvbkRvY0lkIiwiY29udmVyc2F0aW9uRG9jSWQiLCJhbGwiLCJyZW1vdmVTb2NrZXQiLCJXZWJzb2NrZXRDbGllbnQiLCJjbGllbnQiLCJzZXR1cENsaWVudCIsInJlcXVlc3RDb250ZXh0IiwiYXBpSWQiLCJkb21haW5OYW1lIiwic3RhZ2UiLCJ1cGRhdGVkRG9tYWluTmFtZSIsIkFQSV9SRUdJT04iLCJjcmVkZW50aWFscyIsImVuZHBvaW50IiwicmVnaW9uIiwic2VuZCIsImNvbm5lY3Rpb24iLCJwYXlsb2FkIiwiY29uc29sZSIsImxvZyIsInVwZGF0ZWRTb2NrZXRJZCIsInBvc3RUb0Nvbm5lY3Rpb24iLCJDb25uZWN0aW9uSWQiLCJEYXRhIiwiSlNPTiIsInN0cmluZ2lmeSIsInByb21pc2UiLCJwb3N0RXJyb3IiLCJzdGF0dXNDb2RlIl0sIm1hcHBpbmdzIjoiQUFBQTs7O0NBR0MsR0FDRCxTQUFRQSx1QkFBdUIsUUFBTywwQ0FBMEM7QUFDaEYsU0FBUUMsVUFBVSxFQUFFQyxPQUFPLEVBQUVDLFdBQVcsUUFBTywrQkFBK0I7QUFDOUUsU0FBUUMsR0FBRyxRQUFpQixXQUFXO0FBR3ZDLFNBQVFDLE1BQU0sUUFBTyxlQUFlO0FBRXBDLFNBQVFDLEtBQUssUUFBTyw0QkFBNEI7QUFDaEQsU0FBUUMsY0FBYyxRQUFPLGFBQWE7QUFFMUMsU0FBUUMsVUFBVSxRQUFPLDBCQUEwQjtBQUVuRCxTQUFRQyxRQUFRLFFBQU8sNkJBQTZCO0FBRXBELE9BQU8sTUFBTUMsWUFBWSxPQUFPQyxVQUFrQkM7SUFDaEQsTUFBTUMsU0FBUztJQUNmLE1BQU1DLGlCQUFpQlgsWUFBWVEsVUFBVTtJQUM3QyxNQUFNSSxjQUFjWixZQUFZUztJQUVoQyxJQUFJO1FBQ0YsTUFBTUksZUFBZUMsUUFBUUMsR0FBRyxDQUFDQyxpQkFBaUIsSUFBSTtRQUN0RCxNQUFNQyxXQUFxQmQsTUFBTVU7UUFDakMsTUFBTUssT0FBTyxNQUFNZCxlQUFlO1lBQUNlLFFBQVFqQixPQUFPa0IsR0FBRztZQUFJUDtRQUFZLEdBQUdEO1FBRXhFLElBQUcsQ0FBQ00sTUFBTTtZQUNSLE1BQU0sSUFBSUcsTUFBTTtRQUNsQjtRQUVBLE1BQU1DLFNBQVM7WUFDYmQsVUFBVUc7WUFDVlksVUFBVUMsS0FBS0MsR0FBRztRQUNwQjtRQUNBLE1BQU1DLFNBQVM7WUFDYixHQUFHSixNQUFNO1lBQ1RLLE1BQU03QixXQUFXLENBQUMsT0FBTyxFQUFFYSxn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
Binary file