@directus/api 11.0.1 → 11.1.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.
- package/dist/emitter.d.ts +3 -2
- package/dist/emitter.js +12 -4
- package/dist/env.js +15 -4
- package/dist/messenger.d.ts +3 -3
- package/dist/messenger.js +14 -5
- package/dist/middleware/authenticate.js +2 -38
- package/dist/server.js +10 -0
- package/dist/services/graphql/index.d.ts +0 -6
- package/dist/services/graphql/index.js +98 -57
- package/dist/services/graphql/subscription.d.ts +16 -0
- package/dist/services/graphql/subscription.js +77 -0
- package/dist/services/server.js +24 -0
- package/dist/services/websocket.d.ts +14 -0
- package/dist/services/websocket.js +26 -0
- package/dist/utils/apply-diff.js +11 -2
- package/dist/utils/apply-query.js +5 -6
- package/dist/utils/get-accountability-for-token.d.ts +2 -0
- package/dist/utils/get-accountability-for-token.js +50 -0
- package/dist/utils/get-service.d.ts +7 -0
- package/dist/utils/get-service.js +49 -0
- package/dist/utils/redact.d.ts +4 -0
- package/dist/utils/redact.js +15 -1
- package/dist/utils/to-boolean.d.ts +4 -0
- package/dist/utils/to-boolean.js +6 -0
- package/dist/websocket/authenticate.d.ts +6 -0
- package/dist/websocket/authenticate.js +62 -0
- package/dist/websocket/controllers/base.d.ts +42 -0
- package/dist/websocket/controllers/base.js +276 -0
- package/dist/websocket/controllers/graphql.d.ts +12 -0
- package/dist/websocket/controllers/graphql.js +102 -0
- package/dist/websocket/controllers/hooks.d.ts +1 -0
- package/dist/websocket/controllers/hooks.js +122 -0
- package/dist/websocket/controllers/index.d.ts +10 -0
- package/dist/websocket/controllers/index.js +35 -0
- package/dist/websocket/controllers/rest.d.ts +9 -0
- package/dist/websocket/controllers/rest.js +47 -0
- package/dist/websocket/exceptions.d.ts +16 -0
- package/dist/websocket/exceptions.js +55 -0
- package/dist/websocket/handlers/heartbeat.d.ts +11 -0
- package/dist/websocket/handlers/heartbeat.js +72 -0
- package/dist/websocket/handlers/index.d.ts +4 -0
- package/dist/websocket/handlers/index.js +11 -0
- package/dist/websocket/handlers/items.d.ts +6 -0
- package/dist/websocket/handlers/items.js +103 -0
- package/dist/websocket/handlers/subscribe.d.ts +43 -0
- package/dist/websocket/handlers/subscribe.js +278 -0
- package/dist/websocket/messages.d.ts +311 -0
- package/dist/websocket/messages.js +96 -0
- package/dist/websocket/types.d.ts +34 -0
- package/dist/websocket/types.js +1 -0
- package/dist/websocket/utils/get-expires-at-for-token.d.ts +1 -0
- package/dist/websocket/utils/get-expires-at-for-token.js +8 -0
- package/dist/websocket/utils/message.d.ts +4 -0
- package/dist/websocket/utils/message.js +27 -0
- package/dist/websocket/utils/wait-for-message.d.ts +4 -0
- package/dist/websocket/utils/wait-for-message.js +45 -0
- package/package.json +19 -14
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/// <reference types="node" resolution-mode="require"/>
|
|
2
|
+
/// <reference types="node" resolution-mode="require"/>
|
|
3
|
+
/// <reference types="node" resolution-mode="require"/>
|
|
4
|
+
import type { Accountability, Query } from '@directus/types';
|
|
5
|
+
import type { IncomingMessage } from 'http';
|
|
6
|
+
import type internal from 'stream';
|
|
7
|
+
import type { WebSocket } from 'ws';
|
|
8
|
+
export type AuthenticationState = {
|
|
9
|
+
accountability: Accountability | null;
|
|
10
|
+
expires_at: number | null;
|
|
11
|
+
refresh_token?: string;
|
|
12
|
+
};
|
|
13
|
+
export type WebSocketClient = WebSocket & AuthenticationState & {
|
|
14
|
+
uid: string | number;
|
|
15
|
+
auth_timer: NodeJS.Timer | null;
|
|
16
|
+
};
|
|
17
|
+
export type UpgradeRequest = IncomingMessage & AuthenticationState;
|
|
18
|
+
export type SubscriptionEvent = 'create' | 'update' | 'delete';
|
|
19
|
+
export type Subscription = {
|
|
20
|
+
uid?: string | number;
|
|
21
|
+
query?: Query;
|
|
22
|
+
item?: string | number;
|
|
23
|
+
event?: SubscriptionEvent;
|
|
24
|
+
collection: string;
|
|
25
|
+
client: WebSocketClient;
|
|
26
|
+
};
|
|
27
|
+
export type UpgradeContext = {
|
|
28
|
+
request: IncomingMessage;
|
|
29
|
+
socket: internal.Duplex;
|
|
30
|
+
head: Buffer;
|
|
31
|
+
};
|
|
32
|
+
export type GraphQLSocket = {
|
|
33
|
+
client: WebSocketClient;
|
|
34
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function getExpiresAtForToken(token: string): number | null;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { WebSocketClient } from '../types.js';
|
|
2
|
+
export declare const fmtMessage: (type: string, data?: Record<string, any>, uid?: string | number) => string;
|
|
3
|
+
export declare const safeSend: (client: WebSocketClient, data: string, delay?: number) => Promise<unknown>;
|
|
4
|
+
export declare const getMessageType: (message: any) => string;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
// a simple util for building a message object
|
|
2
|
+
export const fmtMessage = (type, data = {}, uid) => {
|
|
3
|
+
const message = { type, ...data };
|
|
4
|
+
if (uid !== undefined) {
|
|
5
|
+
message['uid'] = uid;
|
|
6
|
+
}
|
|
7
|
+
return JSON.stringify(message);
|
|
8
|
+
};
|
|
9
|
+
// we may need this later for slow connections
|
|
10
|
+
export const safeSend = async (client, data, delay = 100) => {
|
|
11
|
+
if (client.readyState !== client.OPEN)
|
|
12
|
+
return false;
|
|
13
|
+
if (client.bufferedAmount > 0) {
|
|
14
|
+
// wait for the buffer to clear
|
|
15
|
+
return new Promise((resolve) => {
|
|
16
|
+
setTimeout(() => {
|
|
17
|
+
safeSend(client, data, delay).then((success) => resolve(success));
|
|
18
|
+
}, delay);
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
client.send(data);
|
|
22
|
+
return true;
|
|
23
|
+
};
|
|
24
|
+
// an often used message type extractor function
|
|
25
|
+
export const getMessageType = (message) => {
|
|
26
|
+
return typeof message !== 'object' || Array.isArray(message) || message === null ? '' : String(message.type);
|
|
27
|
+
};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { WebSocket } from 'ws';
|
|
2
|
+
import { WebSocketMessage } from '../messages.js';
|
|
3
|
+
export declare const waitForAnyMessage: (client: WebSocket, timeout: number) => Promise<Record<string, any>>;
|
|
4
|
+
export declare const waitForMessageType: (client: WebSocket, type: string, timeout: number) => Promise<WebSocketMessage>;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { parseJSON } from '@directus/utils';
|
|
2
|
+
import { WebSocketMessage } from '../messages.js';
|
|
3
|
+
import { getMessageType } from './message.js';
|
|
4
|
+
export const waitForAnyMessage = (client, timeout) => {
|
|
5
|
+
return new Promise((resolve, reject) => {
|
|
6
|
+
client.on('message', awaitMessage);
|
|
7
|
+
const timer = setTimeout(() => {
|
|
8
|
+
client.off('message', awaitMessage);
|
|
9
|
+
reject();
|
|
10
|
+
}, timeout);
|
|
11
|
+
function awaitMessage(event) {
|
|
12
|
+
try {
|
|
13
|
+
clearTimeout(timer);
|
|
14
|
+
client.off('message', awaitMessage);
|
|
15
|
+
resolve(parseJSON(event.toString()));
|
|
16
|
+
}
|
|
17
|
+
catch (err) {
|
|
18
|
+
reject(err);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
};
|
|
23
|
+
export const waitForMessageType = (client, type, timeout) => {
|
|
24
|
+
return new Promise((resolve, reject) => {
|
|
25
|
+
client.on('message', awaitMessage);
|
|
26
|
+
const timer = setTimeout(() => {
|
|
27
|
+
client.off('message', awaitMessage);
|
|
28
|
+
reject();
|
|
29
|
+
}, timeout);
|
|
30
|
+
function awaitMessage(event) {
|
|
31
|
+
let msg;
|
|
32
|
+
try {
|
|
33
|
+
msg = WebSocketMessage.parse(parseJSON(event.toString()));
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
if (getMessageType(msg) === type) {
|
|
39
|
+
clearTimeout(timer);
|
|
40
|
+
client.off('message', awaitMessage);
|
|
41
|
+
resolve(msg);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@directus/api",
|
|
3
|
-
"version": "11.0
|
|
3
|
+
"version": "11.1.0",
|
|
4
4
|
"description": "Directus is a real-time API and App dashboard for managing SQL database content",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"directus",
|
|
@@ -92,6 +92,7 @@
|
|
|
92
92
|
"fs-extra": "11.1.1",
|
|
93
93
|
"graphql": "16.6.0",
|
|
94
94
|
"graphql-compose": "9.0.10",
|
|
95
|
+
"graphql-ws": "5.12.0",
|
|
95
96
|
"helmet": "7.0.0",
|
|
96
97
|
"icc": "3.0.0",
|
|
97
98
|
"inquirer": "9.2.4",
|
|
@@ -139,20 +140,23 @@
|
|
|
139
140
|
"uuid-validate": "0.0.3",
|
|
140
141
|
"vm2": "3.9.19",
|
|
141
142
|
"wellknown": "0.5.0",
|
|
142
|
-
"
|
|
143
|
-
"
|
|
144
|
-
"
|
|
145
|
-
"@directus/
|
|
146
|
-
"@directus/
|
|
143
|
+
"ws": "8.12.1",
|
|
144
|
+
"zod": "3.21.4",
|
|
145
|
+
"zod-validation-error": "1.0.1",
|
|
146
|
+
"@directus/app": "10.3.1",
|
|
147
|
+
"@directus/constants": "10.2.1",
|
|
148
|
+
"@directus/exceptions": "10.0.3",
|
|
149
|
+
"@directus/extensions-sdk": "10.1.4",
|
|
150
|
+
"@directus/pressure": "1.0.4",
|
|
147
151
|
"@directus/schema": "10.0.1",
|
|
148
152
|
"@directus/specs": "10.1.1",
|
|
149
|
-
"@directus/storage": "10.0.
|
|
150
|
-
"@directus/storage-driver-azure": "10.0.
|
|
151
|
-
"@directus/storage-driver-cloudinary": "10.0.
|
|
152
|
-
"@directus/storage-driver-gcs": "10.0.
|
|
153
|
-
"@directus/storage-driver-local": "10.0.
|
|
154
|
-
"@directus/storage-driver-s3": "10.0.
|
|
155
|
-
"@directus/utils": "10.0.
|
|
153
|
+
"@directus/storage": "10.0.3",
|
|
154
|
+
"@directus/storage-driver-azure": "10.0.5",
|
|
155
|
+
"@directus/storage-driver-cloudinary": "10.0.5",
|
|
156
|
+
"@directus/storage-driver-gcs": "10.0.5",
|
|
157
|
+
"@directus/storage-driver-local": "10.0.5",
|
|
158
|
+
"@directus/storage-driver-s3": "10.0.5",
|
|
159
|
+
"@directus/utils": "10.0.5"
|
|
156
160
|
},
|
|
157
161
|
"devDependencies": {
|
|
158
162
|
"@ngneat/falso": "6.4.0",
|
|
@@ -191,6 +195,7 @@
|
|
|
191
195
|
"@types/uuid": "9.0.1",
|
|
192
196
|
"@types/uuid-validate": "0.0.1",
|
|
193
197
|
"@types/wellknown": "0.5.4",
|
|
198
|
+
"@types/ws": "8.5.4",
|
|
194
199
|
"@vitest/coverage-c8": "0.31.1",
|
|
195
200
|
"copyfiles": "2.4.1",
|
|
196
201
|
"form-data": "4.0.0",
|
|
@@ -199,7 +204,7 @@
|
|
|
199
204
|
"typescript": "5.0.4",
|
|
200
205
|
"vitest": "0.31.1",
|
|
201
206
|
"@directus/tsconfig": "0.0.7",
|
|
202
|
-
"@directus/types": "10.1.
|
|
207
|
+
"@directus/types": "10.1.1"
|
|
203
208
|
},
|
|
204
209
|
"optionalDependencies": {
|
|
205
210
|
"@keyv/redis": "2.5.8",
|