change: Move WebSocketAdvertiser to middleware.

This commit is contained in:
Ruben Verborgh 2020-11-30 00:33:59 +01:00
parent 49d37dcd6c
commit fc3942b372
7 changed files with 22 additions and 20 deletions

View File

@ -26,12 +26,6 @@
"LinkRelMetadataWriter:_headerMap_value": "type" "LinkRelMetadataWriter:_headerMap_value": "type"
} }
] ]
},
{
"@type": "WebSocketMetadataWriter",
"WebSocketMetadataWriter:_settings_port": {
"@id": "urn:solid-server:default:variable:port"
}
} }
] ]
}, },

View File

@ -28,6 +28,12 @@
"HeaderHandler:_headers_value": "Community Solid Server" "HeaderHandler:_headers_value": "Community Solid Server"
} }
] ]
},
{
"@type": "WebSocketAdvertiser",
"WebSocketAdvertiser:_settings_port": {
"@id": "urn:solid-server:default:variable:port"
}
} }
] ]
} }

View File

@ -26,7 +26,6 @@ export * from './src/ldp/http/metadata/MetadataExtractor';
export * from './src/ldp/http/metadata/MetadataParser'; export * from './src/ldp/http/metadata/MetadataParser';
export * from './src/ldp/http/metadata/MetadataWriter'; export * from './src/ldp/http/metadata/MetadataWriter';
export * from './src/ldp/http/metadata/SlugParser'; export * from './src/ldp/http/metadata/SlugParser';
export * from './src/ldp/http/metadata/WebSocketMetadataWriter';
// LDP/HTTP/Response // LDP/HTTP/Response
export * from './src/ldp/http/response/CreatedResponseDescription'; export * from './src/ldp/http/response/CreatedResponseDescription';
@ -98,6 +97,7 @@ export * from './src/server/WebSocketHandler';
// Server/Middleware // Server/Middleware
export * from './src/server/middleware/CorsHandler'; export * from './src/server/middleware/CorsHandler';
export * from './src/server/middleware/HeaderHandler'; export * from './src/server/middleware/HeaderHandler';
export * from './src/server/middleware/WebSocketAdvertiser';
// Storage/Accessors // Storage/Accessors
export * from './src/storage/accessors/DataAccessor'; export * from './src/storage/accessors/DataAccessor';

View File

@ -1,6 +1,6 @@
import type { HttpResponse } from '../../../server/HttpResponse'; import { addHeader } from '../../util/HeaderUtil';
import { addHeader } from '../../../util/HeaderUtil'; import { HttpHandler } from '../HttpHandler';
import { MetadataWriter } from './MetadataWriter'; import type { HttpResponse } from '../HttpResponse';
interface WebSocketSettings { interface WebSocketSettings {
hostname?: string; 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; private readonly socketUrl: string;
public constructor(settings: WebSocketSettings = {}) { public constructor(settings: WebSocketSettings = {}) {

View File

@ -2,7 +2,8 @@
"@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^1.0.0/components/context.jsonld", "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^1.0.0/components/context.jsonld",
"import": [ "import": [
"files-scs:config/presets/http.json", "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": [ "@graph": [
{ {

View File

@ -22,6 +22,7 @@ describe('An Express server with middleware', (): void => {
const factory = await instantiateFromConfig( const factory = await instantiateFromConfig(
'urn:solid-server:default:ExpressHttpServerFactory', 'middleware.json', { 'urn:solid-server:default:ExpressHttpServerFactory', 'middleware.json', {
'urn:solid-server:default:LdpHandler': new SimpleHttpHandler(), 'urn:solid-server:default:LdpHandler': new SimpleHttpHandler(),
'urn:solid-server:default:variable:port': port,
}, },
) as ExpressHttpServerFactory; ) as ExpressHttpServerFactory;
server = factory.startServer(port); server = factory.startServer(port);

View File

@ -1,37 +1,37 @@
import { createResponse } from 'node-mocks-http'; 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<void> => { it('writes a default HTTP WebSocket.', async(): Promise<void> => {
const writer = new WebSocketMetadataWriter(); const writer = new WebSocketAdvertiser();
const response = createResponse(); const response = createResponse();
await writer.handle({ response } as any); await writer.handle({ response } as any);
expect(response.getHeaders()).toEqual({ 'updates-via': 'ws://localhost' }); expect(response.getHeaders()).toEqual({ 'updates-via': 'ws://localhost' });
}); });
it('writes an HTTP WebSocket with port 80.', async(): Promise<void> => { it('writes an HTTP WebSocket with port 80.', async(): Promise<void> => {
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(); const response = createResponse();
await writer.handle({ response } as any); await writer.handle({ response } as any);
expect(response.getHeaders()).toEqual({ 'updates-via': 'ws://test.example' }); expect(response.getHeaders()).toEqual({ 'updates-via': 'ws://test.example' });
}); });
it('writes an HTTP WebSocket with port 3000.', async(): Promise<void> => { it('writes an HTTP WebSocket with port 3000.', async(): Promise<void> => {
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(); const response = createResponse();
await writer.handle({ response } as any); await writer.handle({ response } as any);
expect(response.getHeaders()).toEqual({ 'updates-via': 'ws://test.example:3000' }); expect(response.getHeaders()).toEqual({ 'updates-via': 'ws://test.example:3000' });
}); });
it('writes an HTTPS WebSocket with port 443.', async(): Promise<void> => { it('writes an HTTPS WebSocket with port 443.', async(): Promise<void> => {
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(); const response = createResponse();
await writer.handle({ response } as any); await writer.handle({ response } as any);
expect(response.getHeaders()).toEqual({ 'updates-via': 'wss://test.example' }); expect(response.getHeaders()).toEqual({ 'updates-via': 'wss://test.example' });
}); });
it('rejects an invalid hostname.', (): void => { 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'); .toThrow('Invalid hostname: test.example/invalid');
}); });
}); });