-
Notifications
You must be signed in to change notification settings - Fork 127
/
handlers-map.ts
51 lines (45 loc) · 1.68 KB
/
handlers-map.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import { TileDocumentHandler } from '@ceramicnetwork/stream-tile-handler';
import { Caip10LinkHandler } from '@ceramicnetwork/stream-caip10-link-handler';
import { Stream, StreamHandler } from '@ceramicnetwork/common';
import { DiagnosticsLogger } from '@ceramicnetwork/common';
import { StreamType } from '@ceramicnetwork/streamid';
type Registry = Map<number, StreamHandler<Stream>>
function defaultHandlers(): Registry {
const tile = new TileDocumentHandler()
const caip10Link = new Caip10LinkHandler()
const handlers = new Map<number, StreamHandler<Stream>>()
handlers.set(tile.type, tile)
handlers.set(caip10Link.type, caip10Link)
return handlers
}
/**
* Container for stream handlers. Maps stream code to the handler instance.
*/
export class HandlersMap {
private readonly handlers: Registry;
constructor(private readonly logger: DiagnosticsLogger, handlers?: Registry) {
this.handlers = handlers || defaultHandlers()
}
/**
* Return stream handler based on its name or code. Throw error if not found.
*
* @param type - name or id of the handler.
*/
get<T extends Stream>(type: string | number): StreamHandler<T> {
const id = typeof type == 'string' ? StreamType.codeByName(type) : type
const handler = this.handlers.get(id);
if (handler) {
return handler as StreamHandler<T>;
} else {
throw new Error(type + ' is not a valid stream type');
}
}
/**
* Add stream handler to the collection.
*/
add<T extends Stream>(streamHandler: StreamHandler<T>): HandlersMap {
this.logger.debug(`Registered handler for ${streamHandler.type} stream type`);
this.handlers.set(streamHandler.type, streamHandler);
return this;
}
}