@directus/api 14.1.2 → 16.0.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 (207) hide show
  1. package/dist/app.js +8 -6
  2. package/dist/auth/drivers/ldap.js +7 -4
  3. package/dist/auth/drivers/local.js +3 -2
  4. package/dist/auth/drivers/oauth2.js +11 -5
  5. package/dist/auth/drivers/openid.js +11 -5
  6. package/dist/auth/drivers/saml.js +6 -4
  7. package/dist/auth.js +7 -4
  8. package/dist/bus/index.d.ts +1 -0
  9. package/dist/bus/index.js +1 -0
  10. package/dist/bus/lib/use-bus.d.ts +9 -0
  11. package/dist/bus/lib/use-bus.js +21 -0
  12. package/dist/cache.js +9 -9
  13. package/dist/cli/commands/bootstrap/index.js +6 -2
  14. package/dist/cli/commands/count/index.js +2 -1
  15. package/dist/cli/commands/database/install.js +2 -1
  16. package/dist/cli/commands/database/migrate.js +2 -1
  17. package/dist/cli/commands/roles/create.js +2 -1
  18. package/dist/cli/commands/schema/apply.js +46 -34
  19. package/dist/cli/commands/schema/snapshot.js +6 -5
  20. package/dist/cli/commands/users/create.js +4 -3
  21. package/dist/cli/commands/users/passwd.js +5 -4
  22. package/dist/cli/index.js +2 -2
  23. package/dist/cli/load-extensions.js +4 -2
  24. package/dist/cli/utils/create-env/env-stub.liquid +1 -1
  25. package/dist/constants.d.ts +1 -1
  26. package/dist/constants.js +4 -1
  27. package/dist/controllers/assets.js +5 -3
  28. package/dist/controllers/auth.js +5 -4
  29. package/dist/controllers/extensions.js +18 -6
  30. package/dist/controllers/files.js +3 -3
  31. package/dist/controllers/schema.js +3 -2
  32. package/dist/controllers/shares.js +3 -3
  33. package/dist/database/helpers/index.d.ts +1 -1
  34. package/dist/database/index.d.ts +2 -1
  35. package/dist/database/index.js +11 -3
  36. package/dist/database/migrations/20210518A-add-foreign-key-constraints.js +3 -1
  37. package/dist/database/migrations/20210519A-add-system-fk-triggers.js +3 -1
  38. package/dist/database/migrations/20210802A-replace-groups.js +2 -1
  39. package/dist/database/migrations/20230721A-require-shares-fields.js +2 -1
  40. package/dist/database/migrations/20231215A-add-focalpoints.d.ts +3 -0
  41. package/dist/database/migrations/20231215A-add-focalpoints.js +12 -0
  42. package/dist/database/migrations/run.js +2 -1
  43. package/dist/database/run-ast.js +5 -2
  44. package/dist/database/system-data/app-access-permissions/app-access-permissions.yaml +0 -7
  45. package/dist/database/system-data/fields/files.yaml +16 -0
  46. package/dist/database/system-data/relations/relations.yaml +4 -0
  47. package/dist/emitter.d.ts +1 -0
  48. package/dist/emitter.js +4 -1
  49. package/dist/extensions/lib/get-extensions-path.d.ts +1 -1
  50. package/dist/extensions/lib/get-extensions-path.js +2 -1
  51. package/dist/extensions/lib/get-extensions.d.ts +1 -1
  52. package/dist/extensions/lib/get-extensions.js +32 -8
  53. package/dist/extensions/lib/get-shared-deps-mapping.js +7 -5
  54. package/dist/extensions/lib/sandbox/register/call-reference.js +4 -2
  55. package/dist/extensions/lib/sandbox/register/route.d.ts +1 -0
  56. package/dist/extensions/lib/sandbox/sdk/generators/log.js +2 -1
  57. package/dist/extensions/lib/sync-extensions.js +6 -4
  58. package/dist/extensions/manager.d.ts +5 -0
  59. package/dist/extensions/manager.js +84 -34
  60. package/dist/flows.js +13 -7
  61. package/dist/logger.d.ts +7 -6
  62. package/dist/logger.js +116 -91
  63. package/dist/mailer.js +4 -2
  64. package/dist/middleware/cache.js +4 -2
  65. package/dist/middleware/check-ip.js +25 -6
  66. package/dist/middleware/cors.js +2 -1
  67. package/dist/middleware/error-handler.js +5 -5
  68. package/dist/middleware/rate-limiter-global.js +4 -2
  69. package/dist/middleware/rate-limiter-ip.js +16 -12
  70. package/dist/middleware/respond.js +4 -2
  71. package/dist/operations/log/index.js +2 -1
  72. package/dist/rate-limiter.d.ts +2 -1
  73. package/dist/rate-limiter.js +5 -2
  74. package/dist/redis/index.d.ts +3 -0
  75. package/dist/redis/index.js +3 -0
  76. package/dist/redis/lib/create-redis.d.ts +7 -0
  77. package/dist/redis/lib/create-redis.js +12 -0
  78. package/dist/redis/lib/use-redis.d.ts +16 -0
  79. package/dist/redis/lib/use-redis.js +22 -0
  80. package/dist/redis/utils/redis-config-available.d.ts +4 -0
  81. package/dist/redis/utils/redis-config-available.js +8 -0
  82. package/dist/request/request-interceptor.js +7 -5
  83. package/dist/request/response-interceptor.js +2 -2
  84. package/dist/request/validate-ip.d.ts +1 -1
  85. package/dist/request/validate-ip.js +23 -7
  86. package/dist/server.d.ts +2 -0
  87. package/dist/server.js +11 -7
  88. package/dist/services/activity.js +5 -4
  89. package/dist/services/assets.d.ts +2 -0
  90. package/dist/services/assets.js +9 -4
  91. package/dist/services/authentication.js +17 -9
  92. package/dist/services/collections.js +5 -4
  93. package/dist/services/extensions.d.ts +15 -9
  94. package/dist/services/extensions.js +75 -40
  95. package/dist/services/fields.js +9 -4
  96. package/dist/services/files.d.ts +2 -2
  97. package/dist/services/files.js +22 -14
  98. package/dist/services/graphql/index.js +96 -18
  99. package/dist/services/graphql/subscription.js +2 -2
  100. package/dist/services/graphql/types/bigint.js +16 -5
  101. package/dist/services/graphql/utils/process-error.d.ts +4 -1
  102. package/dist/services/graphql/utils/process-error.js +10 -8
  103. package/dist/services/import-export/index.js +5 -3
  104. package/dist/services/items.js +12 -8
  105. package/dist/services/mail/index.js +4 -2
  106. package/dist/services/notifications.js +7 -3
  107. package/dist/services/payload.js +3 -3
  108. package/dist/services/relations.js +19 -10
  109. package/dist/services/server.js +7 -7
  110. package/dist/services/shares.js +3 -2
  111. package/dist/services/specifications.js +5 -4
  112. package/dist/services/users.js +24 -13
  113. package/dist/services/versions.js +6 -5
  114. package/dist/services/webhooks.d.ts +2 -2
  115. package/dist/services/webhooks.js +2 -2
  116. package/dist/services/websocket.d.ts +1 -1
  117. package/dist/services/websocket.js +4 -3
  118. package/dist/storage/register-drivers.js +2 -1
  119. package/dist/storage/register-locations.js +2 -1
  120. package/dist/synchronization.js +3 -1
  121. package/dist/telemetry/index.d.ts +4 -0
  122. package/dist/telemetry/index.js +4 -0
  123. package/dist/telemetry/lib/get-report.d.ts +5 -0
  124. package/dist/telemetry/lib/get-report.js +42 -0
  125. package/dist/telemetry/lib/init-telemetry.d.ts +11 -0
  126. package/dist/telemetry/lib/init-telemetry.js +30 -0
  127. package/dist/telemetry/lib/send-report.d.ts +5 -0
  128. package/dist/telemetry/lib/send-report.js +23 -0
  129. package/dist/telemetry/lib/track.d.ts +10 -0
  130. package/dist/telemetry/lib/track.js +30 -0
  131. package/dist/telemetry/types/report.d.ts +58 -0
  132. package/dist/telemetry/types/report.js +1 -0
  133. package/dist/telemetry/utils/get-item-count.d.ts +26 -0
  134. package/dist/telemetry/utils/get-item-count.js +36 -0
  135. package/dist/telemetry/utils/get-random-wait-time.d.ts +5 -0
  136. package/dist/telemetry/utils/get-random-wait-time.js +5 -0
  137. package/dist/telemetry/utils/get-user-count.d.ts +7 -0
  138. package/dist/telemetry/utils/get-user-count.js +30 -0
  139. package/dist/telemetry/utils/get-user-item-count.d.ts +13 -0
  140. package/dist/telemetry/utils/get-user-item-count.js +18 -0
  141. package/dist/types/assets.d.ts +2 -0
  142. package/dist/utils/apply-diff.js +2 -1
  143. package/dist/utils/apply-query.js +2 -2
  144. package/dist/utils/delete-from-require-cache.js +2 -1
  145. package/dist/utils/get-accountability-for-token.js +3 -2
  146. package/dist/utils/get-auth-providers.js +2 -1
  147. package/dist/utils/get-cache-headers.js +5 -2
  148. package/dist/utils/get-cache-key.js +1 -1
  149. package/dist/utils/get-config-from-env.js +2 -1
  150. package/dist/utils/get-default-value.js +4 -3
  151. package/dist/utils/get-ip-from-req.d.ts +1 -1
  152. package/dist/utils/get-ip-from-req.js +5 -3
  153. package/dist/utils/get-permissions.js +5 -3
  154. package/dist/utils/get-schema.js +5 -2
  155. package/dist/utils/get-snapshot-diff.js +7 -9
  156. package/dist/utils/get-snapshot.js +5 -5
  157. package/dist/utils/get-versioned-hash.js +1 -1
  158. package/dist/utils/ip-in-networks.d.ts +6 -0
  159. package/dist/utils/ip-in-networks.js +13 -0
  160. package/dist/utils/is-url-allowed.js +2 -1
  161. package/dist/utils/job-queue.d.ts +1 -0
  162. package/dist/utils/job-queue.js +3 -0
  163. package/dist/utils/md.d.ts +1 -1
  164. package/dist/utils/md.js +3 -2
  165. package/dist/utils/sanitize-query.js +7 -2
  166. package/dist/utils/sanitize-schema.d.ts +1 -1
  167. package/dist/utils/should-clear-cache.js +2 -1
  168. package/dist/utils/should-skip-cache.js +2 -1
  169. package/dist/utils/transformations.js +95 -12
  170. package/dist/utils/validate-env.js +4 -2
  171. package/dist/utils/validate-query.js +8 -3
  172. package/dist/utils/validate-snapshot.js +3 -3
  173. package/dist/utils/validate-storage.js +4 -2
  174. package/dist/webhooks.js +4 -3
  175. package/dist/websocket/controllers/base.d.ts +2 -0
  176. package/dist/websocket/controllers/base.js +12 -6
  177. package/dist/websocket/controllers/graphql.d.ts +2 -0
  178. package/dist/websocket/controllers/graphql.js +5 -3
  179. package/dist/websocket/controllers/hooks.js +3 -2
  180. package/dist/websocket/controllers/index.d.ts +2 -0
  181. package/dist/websocket/controllers/index.js +4 -2
  182. package/dist/websocket/controllers/rest.d.ts +2 -0
  183. package/dist/websocket/controllers/rest.js +4 -2
  184. package/dist/websocket/errors.js +2 -1
  185. package/dist/websocket/handlers/heartbeat.js +4 -3
  186. package/dist/websocket/handlers/subscribe.d.ts +2 -2
  187. package/dist/websocket/handlers/subscribe.js +5 -4
  188. package/dist/websocket/types.d.ts +3 -1
  189. package/package.json +114 -115
  190. package/dist/__utils__/items-utils.d.ts +0 -2
  191. package/dist/__utils__/items-utils.js +0 -31
  192. package/dist/__utils__/mock-env.d.ts +0 -18
  193. package/dist/__utils__/mock-env.js +0 -41
  194. package/dist/__utils__/schemas.d.ts +0 -13
  195. package/dist/__utils__/schemas.js +0 -301
  196. package/dist/__utils__/snapshots.d.ts +0 -5
  197. package/dist/__utils__/snapshots.js +0 -903
  198. package/dist/env.d.ts +0 -13
  199. package/dist/env.js +0 -505
  200. package/dist/messenger.d.ts +0 -24
  201. package/dist/messenger.js +0 -64
  202. package/dist/utils/package.d.ts +0 -2
  203. package/dist/utils/package.js +0 -6
  204. package/dist/utils/telemetry.d.ts +0 -1
  205. package/dist/utils/telemetry.js +0 -23
  206. package/dist/utils/to-boolean.d.ts +0 -4
  207. package/dist/utils/to-boolean.js +0 -6
@@ -4,7 +4,7 @@ import { ALIAS_TYPES } from '../constants.js';
4
4
  import { getDatabaseClient } from '../database/index.js';
5
5
  import { InvalidPayloadError } from '@directus/errors';
6
6
  import { DatabaseClients } from '../types/index.js';
7
- import { version as currentDirectusVersion } from './package.js';
7
+ import { version } from 'directus/version';
8
8
  const snapshotJoiSchema = Joi.object({
9
9
  version: Joi.number().valid(1).required(),
10
10
  directus: Joi.string().required(),
@@ -51,9 +51,9 @@ export function validateSnapshot(snapshot, force = false) {
51
51
  // Bypass checks when "force" option is enabled
52
52
  if (force)
53
53
  return;
54
- if (snapshot.directus !== currentDirectusVersion) {
54
+ if (snapshot.directus !== version) {
55
55
  throw new InvalidPayloadError({
56
- reason: `Provided snapshot's directus version ${snapshot.directus} does not match the current instance's version ${currentDirectusVersion}. You can bypass this check by passing the "force" query parameter`,
56
+ reason: `Provided snapshot's directus version ${snapshot.directus} does not match the current instance's version ${version}. You can bypass this check by passing the "force" query parameter`,
57
57
  });
58
58
  }
59
59
  if (!snapshot.vendor) {
@@ -1,11 +1,13 @@
1
+ import { useEnv } from '@directus/env';
1
2
  import { toArray } from '@directus/utils';
2
3
  import { constants } from 'fs';
3
4
  import { access } from 'node:fs/promises';
4
5
  import path from 'path';
5
- import env from '../env.js';
6
6
  import { getExtensionsPath } from '../extensions/lib/get-extensions-path.js';
7
- import logger from '../logger.js';
7
+ import { useLogger } from '../logger.js';
8
8
  export async function validateStorage() {
9
+ const env = useEnv();
10
+ const logger = useLogger();
9
11
  if (env['DB_CLIENT'] === 'sqlite3') {
10
12
  try {
11
13
  await access(path.dirname(env['DB_FILENAME']), constants.R_OK | constants.W_OK);
package/dist/webhooks.js CHANGED
@@ -1,7 +1,7 @@
1
+ import { useBus } from './bus/index.js';
1
2
  import getDatabase from './database/index.js';
2
3
  import emitter from './emitter.js';
3
- import logger from './logger.js';
4
- import { getMessenger } from './messenger.js';
4
+ import { useLogger } from './logger.js';
5
5
  import { getAxios } from './request/index.js';
6
6
  import { WebhooksService } from './services/webhooks.js';
7
7
  import { getSchema } from './utils/get-schema.js';
@@ -10,7 +10,7 @@ let registered = [];
10
10
  const reloadQueue = new JobQueue();
11
11
  export async function init() {
12
12
  await register();
13
- const messenger = getMessenger();
13
+ const messenger = useBus();
14
14
  messenger.subscribe('webhooks', (event) => {
15
15
  if (event['type'] === 'reload') {
16
16
  reloadQueue.enqueue(async () => {
@@ -42,6 +42,7 @@ export function unregister() {
42
42
  registered = [];
43
43
  }
44
44
  function createHandler(webhook, event) {
45
+ const logger = useLogger();
45
46
  return async (meta, context) => {
46
47
  if (webhook.collections.includes(meta['collection']) === false)
47
48
  return;
@@ -2,6 +2,8 @@
2
2
  /// <reference types="node" resolution-mode="require"/>
3
3
  /// <reference types="node" resolution-mode="require"/>
4
4
  /// <reference types="node" resolution-mode="require"/>
5
+ /// <reference types="node/http.js" />
6
+ /// <reference types="pino-http" />
5
7
  import type { IncomingMessage, Server as httpServer } from 'http';
6
8
  import type { ParsedUrlQuery } from 'querystring';
7
9
  import type { RateLimiterAbstract } from 'rate-limiter-flexible';
@@ -1,15 +1,14 @@
1
- import { parseJSON } from '@directus/utils';
1
+ import { useEnv } from '@directus/env';
2
+ import { InvalidProviderConfigError, TokenExpiredError } from '@directus/errors';
3
+ import { parseJSON, toBoolean } from '@directus/utils';
2
4
  import { parse } from 'url';
3
5
  import { v4 as uuid } from 'uuid';
4
6
  import WebSocket, { WebSocketServer } from 'ws';
5
7
  import { fromZodError } from 'zod-validation-error';
6
8
  import emitter from '../../emitter.js';
7
- import env from '../../env.js';
8
- import { InvalidProviderConfigError, TokenExpiredError } from '@directus/errors';
9
- import logger from '../../logger.js';
9
+ import { useLogger } from '../../logger.js';
10
10
  import { createRateLimiter } from '../../rate-limiter.js';
11
11
  import { getAccountabilityForToken } from '../../utils/get-accountability-for-token.js';
12
- import { toBoolean } from '../../utils/to-boolean.js';
13
12
  import { authenticateConnection, authenticationSuccess } from '../authenticate.js';
14
13
  import { WebSocketError, handleWebSocketError } from '../errors.js';
15
14
  import { AuthMode, WebSocketAuthMessage, WebSocketMessage } from '../messages.js';
@@ -18,6 +17,7 @@ import { getMessageType } from '../utils/message.js';
18
17
  import { waitForAnyMessage, waitForMessageType } from '../utils/wait-for-message.js';
19
18
  import { registerWebSocketEvents } from './hooks.js';
20
19
  const TOKEN_CHECK_INTERVAL = 15 * 60 * 1000; // 15 minutes
20
+ const logger = useLogger();
21
21
  export default class SocketController {
22
22
  server;
23
23
  clients;
@@ -27,7 +27,11 @@ export default class SocketController {
27
27
  rateLimiter;
28
28
  authInterval;
29
29
  constructor(httpServer, configPrefix) {
30
- this.server = new WebSocketServer({ noServer: true });
30
+ this.server = new WebSocketServer({
31
+ noServer: true,
32
+ // @ts-ignore TODO Remove once @types/ws has been updated
33
+ autoPong: false,
34
+ });
31
35
  this.clients = new Set();
32
36
  this.authInterval = null;
33
37
  const { endpoint, authentication, maxConnections } = this.getEnvironmentConfig(configPrefix);
@@ -40,6 +44,7 @@ export default class SocketController {
40
44
  registerWebSocketEvents();
41
45
  }
42
46
  getEnvironmentConfig(configPrefix) {
47
+ const env = useEnv();
43
48
  const endpoint = String(env[`${configPrefix}_PATH`]);
44
49
  const authMode = AuthMode.safeParse(String(env[`${configPrefix}_AUTH`]).toLowerCase());
45
50
  const authTimeout = Number(env[`${configPrefix}_AUTH_TIMEOUT`]) * 1000;
@@ -60,6 +65,7 @@ export default class SocketController {
60
65
  };
61
66
  }
62
67
  getRateLimiter() {
68
+ const env = useEnv();
63
69
  if (toBoolean(env['RATE_LIMITER_ENABLED']) === true) {
64
70
  return createRateLimiter('RATE_LIMITER', {
65
71
  keyPrefix: 'websocket',
@@ -1,4 +1,6 @@
1
1
  /// <reference types="node" resolution-mode="require"/>
2
+ /// <reference types="node/http.js" />
3
+ /// <reference types="pino-http" />
2
4
  import type { Server } from 'graphql-ws';
3
5
  import type { Server as httpServer } from 'http';
4
6
  import type { GraphQLSocket, UpgradeContext, WebSocketClient } from '../types.js';
@@ -1,6 +1,6 @@
1
+ import { useEnv } from '@directus/env';
1
2
  import { CloseCode, MessageType, makeServer } from 'graphql-ws';
2
- import env from '../../env.js';
3
- import logger from '../../logger.js';
3
+ import { useLogger } from '../../logger.js';
4
4
  import { bindPubSub } from '../../services/graphql/subscription.js';
5
5
  import { GraphQLService } from '../../services/index.js';
6
6
  import { getSchema } from '../../utils/get-schema.js';
@@ -9,10 +9,12 @@ import { handleWebSocketError } from '../errors.js';
9
9
  import { ConnectionParams, WebSocketMessage } from '../messages.js';
10
10
  import { getMessageType } from '../utils/message.js';
11
11
  import SocketController from './base.js';
12
+ const logger = useLogger();
12
13
  export class GraphQLSubscriptionController extends SocketController {
13
14
  gql;
14
15
  constructor(httpServer) {
15
16
  super(httpServer, 'WEBSOCKETS_GRAPHQL');
17
+ const env = useEnv();
16
18
  this.server.on('connection', (ws, auth) => {
17
19
  this.bindEvents(this.createClient(ws, auth));
18
20
  });
@@ -37,7 +39,7 @@ export class GraphQLSubscriptionController extends SocketController {
37
39
  send: (data) => new Promise((resolve, reject) => {
38
40
  client.send(data, (err) => (err ? reject(err) : resolve()));
39
41
  }),
40
- close: (code, reason) => client.close(code, reason),
42
+ close: (code, reason) => client.close(code, reason), // for standard closures
41
43
  onMessage: (cb) => {
42
44
  client.on('parsed-message', async (message) => {
43
45
  try {
@@ -1,5 +1,5 @@
1
+ import { useBus } from '../../bus/index.js';
1
2
  import emitter from '../../emitter.js';
2
- import { getMessenger } from '../../messenger.js';
3
3
  let actionsRegistered = false;
4
4
  export function registerWebSocketEvents() {
5
5
  if (actionsRegistered)
@@ -21,6 +21,7 @@ export function registerWebSocketEvents() {
21
21
  'settings',
22
22
  'shares',
23
23
  'users',
24
+ 'versions',
24
25
  'webhooks',
25
26
  ]);
26
27
  registerFieldsHooks();
@@ -128,7 +129,7 @@ function registerSortHooks() {
128
129
  * @param transform Transformer function
129
130
  */
130
131
  function registerAction(event, transform) {
131
- const messenger = getMessenger();
132
+ const messenger = useBus();
132
133
  emitter.onAction(event, async (data) => {
133
134
  // push the event through the Redis pub/sub
134
135
  messenger.publish('websocket.event', transform(data));
@@ -1,4 +1,6 @@
1
1
  /// <reference types="node" resolution-mode="require"/>
2
+ /// <reference types="node/http.js" />
3
+ /// <reference types="pino-http" />
2
4
  import type { Server as httpServer } from 'http';
3
5
  import { GraphQLSubscriptionController } from './graphql.js';
4
6
  import { WebSocketController } from './rest.js';
@@ -1,10 +1,11 @@
1
- import env from '../../env.js';
2
- import { toBoolean } from '../../utils/to-boolean.js';
1
+ import { useEnv } from '@directus/env';
2
+ import { toBoolean } from '@directus/utils';
3
3
  import { GraphQLSubscriptionController } from './graphql.js';
4
4
  import { WebSocketController } from './rest.js';
5
5
  let websocketController;
6
6
  let subscriptionController;
7
7
  export function createWebSocketController(server) {
8
+ const env = useEnv();
8
9
  if (toBoolean(env['WEBSOCKETS_REST_ENABLED'])) {
9
10
  websocketController = new WebSocketController(server);
10
11
  }
@@ -13,6 +14,7 @@ export function getWebSocketController() {
13
14
  return websocketController;
14
15
  }
15
16
  export function createSubscriptionController(server) {
17
+ const env = useEnv();
16
18
  if (toBoolean(env['WEBSOCKETS_GRAPHQL_ENABLED'])) {
17
19
  subscriptionController = new GraphQLSubscriptionController(server);
18
20
  }
@@ -1,4 +1,6 @@
1
1
  /// <reference types="node" resolution-mode="require"/>
2
+ /// <reference types="node/http.js" />
3
+ /// <reference types="pino-http" />
2
4
  import type { Server as httpServer } from 'http';
3
5
  import { WebSocketMessage } from '../messages.js';
4
6
  import SocketController from './base.js';
@@ -1,14 +1,16 @@
1
+ import { useEnv } from '@directus/env';
1
2
  import { parseJSON } from '@directus/utils';
2
3
  import emitter from '../../emitter.js';
3
- import env from '../../env.js';
4
- import logger from '../../logger.js';
4
+ import { useLogger } from '../../logger.js';
5
5
  import { refreshAccountability } from '../authenticate.js';
6
6
  import { WebSocketError, handleWebSocketError } from '../errors.js';
7
7
  import { WebSocketMessage } from '../messages.js';
8
8
  import SocketController from './base.js';
9
+ const logger = useLogger();
9
10
  export class WebSocketController extends SocketController {
10
11
  constructor(httpServer) {
11
12
  super(httpServer, 'WEBSOCKETS_REST');
13
+ const env = useEnv();
12
14
  this.server.on('connection', (ws, auth) => {
13
15
  this.bindEvents(this.createClient(ws, auth));
14
16
  });
@@ -1,7 +1,7 @@
1
1
  import { isDirectusError } from '@directus/errors';
2
2
  import { ZodError } from 'zod';
3
3
  import { fromZodError } from 'zod-validation-error';
4
- import logger from '../logger.js';
4
+ import { useLogger } from '../logger.js';
5
5
  export class WebSocketError extends Error {
6
6
  type;
7
7
  code;
@@ -38,6 +38,7 @@ export class WebSocketError extends Error {
38
38
  }
39
39
  }
40
40
  export function handleWebSocketError(client, error, type) {
41
+ const logger = useLogger();
41
42
  if (isDirectusError(error)) {
42
43
  client.send(WebSocketError.fromError(error, type).toMessage());
43
44
  return;
@@ -1,10 +1,11 @@
1
+ import { useEnv } from '@directus/env';
2
+ import { ServiceUnavailableError } from '@directus/errors';
3
+ import { toBoolean } from '@directus/utils';
1
4
  import emitter from '../../emitter.js';
2
- import env from '../../env.js';
3
- import { toBoolean } from '../../utils/to-boolean.js';
4
5
  import { WebSocketController, getWebSocketController } from '../controllers/index.js';
5
6
  import { WebSocketMessage } from '../messages.js';
6
7
  import { fmtMessage, getMessageType } from '../utils/message.js';
7
- import { ServiceUnavailableError } from '@directus/errors';
8
+ const env = useEnv();
8
9
  const HEARTBEAT_FREQUENCY = Number(env['WEBSOCKETS_HEARTBEAT_PERIOD']) * 1000;
9
10
  export class HeartbeatHandler {
10
11
  pulse;
@@ -1,4 +1,4 @@
1
- import type { Messenger } from '../../messenger.js';
1
+ import { type Bus } from '@directus/memory';
2
2
  import type { WebSocketEvent } from '../messages.js';
3
3
  import { WebSocketSubscribeMessage } from '../messages.js';
4
4
  import type { Subscription, WebSocketClient } from '../types.js';
@@ -7,7 +7,7 @@ import type { Subscription, WebSocketClient } from '../types.js';
7
7
  */
8
8
  export declare class SubscribeHandler {
9
9
  subscriptions: Record<string, Set<Subscription>>;
10
- protected messenger: Messenger;
10
+ protected messenger: Bus;
11
11
  /**
12
12
  * Initialize the handler
13
13
  */
@@ -1,13 +1,14 @@
1
- import emitter from '../../emitter.js';
2
1
  import { InvalidPayloadError } from '@directus/errors';
3
- import { getMessenger } from '../../messenger.js';
2
+ import {} from '@directus/memory';
3
+ import { useBus } from '../../bus/index.js';
4
+ import emitter from '../../emitter.js';
4
5
  import { getSchema } from '../../utils/get-schema.js';
5
6
  import { sanitizeQuery } from '../../utils/sanitize-query.js';
6
7
  import { refreshAccountability } from '../authenticate.js';
7
8
  import { WebSocketError, handleWebSocketError } from '../errors.js';
8
9
  import { WebSocketSubscribeMessage } from '../messages.js';
9
- import { fmtMessage, getMessageType } from '../utils/message.js';
10
10
  import { getPayload } from '../utils/items.js';
11
+ import { fmtMessage, getMessageType } from '../utils/message.js';
11
12
  /**
12
13
  * Handler responsible for subscriptions
13
14
  */
@@ -21,7 +22,7 @@ export class SubscribeHandler {
21
22
  */
22
23
  constructor() {
23
24
  this.subscriptions = {};
24
- this.messenger = getMessenger();
25
+ this.messenger = useBus();
25
26
  this.bindWebSocket();
26
27
  // listen to the Redis pub/sub and dispatch
27
28
  this.messenger.subscribe('websocket.event', (message) => {
@@ -1,6 +1,8 @@
1
1
  /// <reference types="node" resolution-mode="require"/>
2
2
  /// <reference types="node" resolution-mode="require"/>
3
3
  /// <reference types="node" resolution-mode="require"/>
4
+ /// <reference types="node/http.js" />
5
+ /// <reference types="pino-http" />
4
6
  import type { Accountability, Query } from '@directus/types';
5
7
  import type { IncomingMessage } from 'http';
6
8
  import type internal from 'stream';
@@ -12,7 +14,7 @@ export type AuthenticationState = {
12
14
  };
13
15
  export type WebSocketClient = WebSocket & AuthenticationState & {
14
16
  uid: string | number;
15
- auth_timer: NodeJS.Timer | null;
17
+ auth_timer: NodeJS.Timeout | null;
16
18
  };
17
19
  export type UpgradeRequest = IncomingMessage & AuthenticationState;
18
20
  export type SubscriptionEvent = 'create' | 'update' | 'delete';