From fc3942b372f1b227b2c326661bdc2a036cc1eb20 Mon Sep 17 00:00:00 2001 From: Ruben Verborgh Date: Mon, 30 Nov 2020 00:33:59 +0100 Subject: [PATCH] change: Move WebSocketAdvertiser to middleware. --- config/presets/ldp/response-writer.json | 6 ------ config/presets/middleware.json | 6 ++++++ index.ts | 2 +- .../middleware/WebSocketAdvertiser.ts} | 10 +++++----- test/configs/middleware.json | 3 ++- test/integration/Middleware.test.ts | 1 + .../middleware/WebSocketAdvertiser.test.ts} | 14 +++++++------- 7 files changed, 22 insertions(+), 20 deletions(-) rename src/{ldp/http/metadata/WebSocketMetadataWriter.ts => server/middleware/WebSocketAdvertiser.ts} (69%) rename test/unit/{ldp/http/metadata/WebSocketMetadataWriter.test.ts => server/middleware/WebSocketAdvertiser.test.ts} (65%) diff --git a/config/presets/ldp/response-writer.json b/config/presets/ldp/response-writer.json index 12d2c26b3..778e23658 100644 --- a/config/presets/ldp/response-writer.json +++ b/config/presets/ldp/response-writer.json @@ -26,12 +26,6 @@ "LinkRelMetadataWriter:_headerMap_value": "type" } ] - }, - { - "@type": "WebSocketMetadataWriter", - "WebSocketMetadataWriter:_settings_port": { - "@id": "urn:solid-server:default:variable:port" - } } ] }, diff --git a/config/presets/middleware.json b/config/presets/middleware.json index e4978027b..32a989809 100644 --- a/config/presets/middleware.json +++ b/config/presets/middleware.json @@ -28,6 +28,12 @@ "HeaderHandler:_headers_value": "Community Solid Server" } ] + }, + { + "@type": "WebSocketAdvertiser", + "WebSocketAdvertiser:_settings_port": { + "@id": "urn:solid-server:default:variable:port" + } } ] } diff --git a/index.ts b/index.ts index c0b52d5c1..05f856a64 100644 --- a/index.ts +++ b/index.ts @@ -26,7 +26,6 @@ export * from './src/ldp/http/metadata/MetadataExtractor'; export * from './src/ldp/http/metadata/MetadataParser'; export * from './src/ldp/http/metadata/MetadataWriter'; export * from './src/ldp/http/metadata/SlugParser'; -export * from './src/ldp/http/metadata/WebSocketMetadataWriter'; // LDP/HTTP/Response export * from './src/ldp/http/response/CreatedResponseDescription'; @@ -98,6 +97,7 @@ export * from './src/server/WebSocketHandler'; // Server/Middleware export * from './src/server/middleware/CorsHandler'; export * from './src/server/middleware/HeaderHandler'; +export * from './src/server/middleware/WebSocketAdvertiser'; // Storage/Accessors export * from './src/storage/accessors/DataAccessor'; diff --git a/src/ldp/http/metadata/WebSocketMetadataWriter.ts b/src/server/middleware/WebSocketAdvertiser.ts similarity index 69% rename from src/ldp/http/metadata/WebSocketMetadataWriter.ts rename to src/server/middleware/WebSocketAdvertiser.ts index 9f0d85b2e..fdd083454 100644 --- a/src/ldp/http/metadata/WebSocketMetadataWriter.ts +++ b/src/server/middleware/WebSocketAdvertiser.ts @@ -1,6 +1,6 @@ -import type { HttpResponse } from '../../../server/HttpResponse'; -import { addHeader } from '../../../util/HeaderUtil'; -import { MetadataWriter } from './MetadataWriter'; +import { addHeader } from '../../util/HeaderUtil'; +import { HttpHandler } from '../HttpHandler'; +import type { HttpResponse } from '../HttpResponse'; interface WebSocketSettings { hostname?: string; @@ -9,9 +9,9 @@ interface WebSocketSettings { } /** - * A {@link MetadataWriter} that advertises a WebSocket through the Updates-Via header. + * Handler that advertises a WebSocket through the Updates-Via header. */ -export class WebSocketMetadataWriter extends MetadataWriter { +export class WebSocketAdvertiser extends HttpHandler { private readonly socketUrl: string; public constructor(settings: WebSocketSettings = {}) { diff --git a/test/configs/middleware.json b/test/configs/middleware.json index 129a9f4b7..e123dc0df 100644 --- a/test/configs/middleware.json +++ b/test/configs/middleware.json @@ -2,7 +2,8 @@ "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^1.0.0/components/context.jsonld", "import": [ "files-scs:config/presets/http.json", - "files-scs:config/presets/middleware.json" + "files-scs:config/presets/middleware.json", + "files-scs:config/presets/cli-params.json" ], "@graph": [ { diff --git a/test/integration/Middleware.test.ts b/test/integration/Middleware.test.ts index d3fec7c5b..8d0710bb0 100644 --- a/test/integration/Middleware.test.ts +++ b/test/integration/Middleware.test.ts @@ -22,6 +22,7 @@ describe('An Express server with middleware', (): void => { const factory = await instantiateFromConfig( 'urn:solid-server:default:ExpressHttpServerFactory', 'middleware.json', { 'urn:solid-server:default:LdpHandler': new SimpleHttpHandler(), + 'urn:solid-server:default:variable:port': port, }, ) as ExpressHttpServerFactory; server = factory.startServer(port); diff --git a/test/unit/ldp/http/metadata/WebSocketMetadataWriter.test.ts b/test/unit/server/middleware/WebSocketAdvertiser.test.ts similarity index 65% rename from test/unit/ldp/http/metadata/WebSocketMetadataWriter.test.ts rename to test/unit/server/middleware/WebSocketAdvertiser.test.ts index f11ea5f5d..d4c8d7a56 100644 --- a/test/unit/ldp/http/metadata/WebSocketMetadataWriter.test.ts +++ b/test/unit/server/middleware/WebSocketAdvertiser.test.ts @@ -1,37 +1,37 @@ import { createResponse } from 'node-mocks-http'; -import { WebSocketMetadataWriter } from '../../../../../src/ldp/http/metadata/WebSocketMetadataWriter'; +import { WebSocketAdvertiser } from '../../../../src/server/middleware/WebSocketAdvertiser'; -describe('A WebSocketMetadataWriter', (): void => { +describe('A WebSocketAdvertiser', (): void => { it('writes a default HTTP WebSocket.', async(): Promise => { - const writer = new WebSocketMetadataWriter(); + const writer = new WebSocketAdvertiser(); const response = createResponse(); await writer.handle({ response } as any); expect(response.getHeaders()).toEqual({ 'updates-via': 'ws://localhost' }); }); it('writes an HTTP WebSocket with port 80.', async(): Promise => { - const writer = new WebSocketMetadataWriter({ hostname: 'test.example', port: 80, protocol: 'http' }); + const writer = new WebSocketAdvertiser({ hostname: 'test.example', port: 80, protocol: 'http' }); const response = createResponse(); await writer.handle({ response } as any); expect(response.getHeaders()).toEqual({ 'updates-via': 'ws://test.example' }); }); it('writes an HTTP WebSocket with port 3000.', async(): Promise => { - const writer = new WebSocketMetadataWriter({ hostname: 'test.example', port: 3000, protocol: 'http' }); + const writer = new WebSocketAdvertiser({ hostname: 'test.example', port: 3000, protocol: 'http' }); const response = createResponse(); await writer.handle({ response } as any); expect(response.getHeaders()).toEqual({ 'updates-via': 'ws://test.example:3000' }); }); it('writes an HTTPS WebSocket with port 443.', async(): Promise => { - const writer = new WebSocketMetadataWriter({ hostname: 'test.example', port: 443, protocol: 'https' }); + const writer = new WebSocketAdvertiser({ hostname: 'test.example', port: 443, protocol: 'https' }); const response = createResponse(); await writer.handle({ response } as any); expect(response.getHeaders()).toEqual({ 'updates-via': 'wss://test.example' }); }); it('rejects an invalid hostname.', (): void => { - expect((): any => new WebSocketMetadataWriter({ hostname: 'test.example/invalid' })) + expect((): any => new WebSocketAdvertiser({ hostname: 'test.example/invalid' })) .toThrow('Invalid hostname: test.example/invalid'); }); });