Skip to content

Commit 5a6835c

Browse files
author
Dennis Labordus
authored
Merge pull request #172 from com-pas/improve-event-firing
Removed use of open-scd tag for event dispatching.
2 parents 4bad347 + ac95472 commit 5a6835c

29 files changed

+1357
-865
lines changed

src/compas-editors/CompasVersions.ts

Lines changed: 239 additions & 139 deletions
Large diffs are not rendered by default.
Lines changed: 33 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
1-
import { CompasSettings } from "../compas/CompasSettings.js";
2-
import { Websockets } from "./Websockets.js";
1+
import { CompasSettings } from '../compas/CompasSettings.js';
2+
import { Websockets } from './Websockets.js';
33
import {
44
getWebsocketUri,
55
handleError,
66
handleResponse,
7-
parseXml
8-
} from "./foundation.js";
7+
parseXml,
8+
} from './foundation.js';
99

10-
export const SVS_NAMESPACE = 'https://www.lfenergy.org/compas/SclValidatorService/v1';
10+
export const SVS_NAMESPACE =
11+
'https://www.lfenergy.org/compas/SclValidatorService/v1';
1112

1213
export function CompasSclValidatorService() {
1314
function getSclValidatorServiceUrl(): string {
@@ -17,7 +18,9 @@ export function CompasSclValidatorService() {
1718
function createRequest(doc: Document): string {
1819
return `<?xml version="1.0" encoding="UTF-8"?>
1920
<svs:SclValidateRequest xmlns:svs="${SVS_NAMESPACE}">
20-
<svs:SclData><![CDATA[${new XMLSerializer().serializeToString(doc.documentElement)}]]></svs:SclData>
21+
<svs:SclData><![CDATA[${new XMLSerializer().serializeToString(
22+
doc.documentElement
23+
)}]]></svs:SclData>
2124
</svs:SclValidateRequest>`;
2225
}
2326

@@ -31,37 +34,46 @@ export function CompasSclValidatorService() {
3134
return fetch(svsUrl, {
3235
method: 'POST',
3336
headers: {
34-
'Content-Type': 'application/xml'
37+
'Content-Type': 'application/xml',
3538
},
36-
body: createRequest(doc)
37-
}).catch(handleError)
39+
body: createRequest(doc),
40+
})
41+
.catch(handleError)
3842
.then(handleResponse)
3943
.then(parseXml);
4044
},
4145

42-
validateSCLUsingWebsockets(type: string, doc: Document,
43-
callback: (doc: Document) => void,
44-
onCloseCallback: () => void) {
45-
Websockets('CompasValidatorService')
46-
.execute(
47-
getWebsocketUri(getSclValidatorServiceUrl()) + '/validate-ws/v1/' + type,
48-
createRequest(doc),
49-
callback,
50-
onCloseCallback);
46+
validateSCLUsingWebsockets(
47+
element: Element,
48+
type: string,
49+
doc: Document,
50+
callback: (doc: Document) => void,
51+
onCloseCallback: () => void
52+
) {
53+
Websockets(element, 'CompasValidatorService').execute(
54+
getWebsocketUri(getSclValidatorServiceUrl()) +
55+
'/validate-ws/v1/' +
56+
type,
57+
createRequest(doc),
58+
callback,
59+
onCloseCallback
60+
);
5161
},
5262

5363
listNsdocFiles(): Promise<Document> {
5464
const svsUrl = getSclValidatorServiceUrl() + '/nsdoc/v1';
55-
return fetch(svsUrl).catch(handleError)
65+
return fetch(svsUrl)
66+
.catch(handleError)
5667
.then(handleResponse)
5768
.then(parseXml);
5869
},
5970

6071
getNsdocFile(id: string): Promise<Document> {
6172
const svsUrl = getSclValidatorServiceUrl() + '/nsdoc/v1/' + id;
62-
return fetch(svsUrl).catch(handleError)
73+
return fetch(svsUrl)
74+
.catch(handleError)
6375
.then(handleResponse)
6476
.then(parseXml);
6577
},
66-
}
78+
};
6779
}

src/compas-services/Websockets.ts

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
1-
import { newPendingStateEvent } from "../foundation.js";
2-
import { dispatchEventOnOpenScd } from "../compas/foundation.js";
3-
import { createLogEvent, parseXml } from "./foundation.js";
1+
import { newPendingStateEvent } from '../foundation.js';
2+
import { createLogEvent, parseXml } from './foundation.js';
43

5-
export function Websockets(serviceName: string) {
4+
export function Websockets(element: Element, serviceName: string) {
65
let websocket: WebSocket | undefined;
76

87
function sleep(sleepTime: number): Promise<unknown> {
@@ -16,31 +15,35 @@ export function Websockets(serviceName: string) {
1615
}
1716

1817
return {
19-
execute(url: string, request: string,
20-
onMessageCallback: (doc: Document) => void,
21-
onCloseCallback?: () => void) {
18+
execute(
19+
url: string,
20+
request: string,
21+
onMessageCallback: (doc: Document) => void,
22+
onCloseCallback?: () => void
23+
) {
2224
websocket = new WebSocket(url);
2325

2426
websocket.onopen = () => {
2527
websocket?.send(request);
2628
};
2729

28-
websocket.onmessage = (evt) => {
30+
websocket.onmessage = evt => {
2931
parseXml(evt.data)
3032
.then(doc => {
3133
onMessageCallback(doc);
3234
websocket?.close();
3335
})
3436
.catch(reason => {
35-
createLogEvent(reason);
37+
createLogEvent(element, reason);
3638
websocket?.close();
3739
});
3840
};
3941

4042
websocket.onerror = () => {
41-
createLogEvent(
42-
{ message: `Websocket Error in service "${serviceName}"`,
43-
type: 'Error'})
43+
createLogEvent(element, {
44+
message: `Websocket Error in service "${serviceName}"`,
45+
type: 'Error',
46+
});
4447
websocket?.close();
4548
};
4649

@@ -49,9 +52,9 @@ export function Websockets(serviceName: string) {
4952
if (onCloseCallback) {
5053
onCloseCallback();
5154
}
52-
}
55+
};
5356

54-
dispatchEventOnOpenScd(newPendingStateEvent(waitUntilValidated()))
55-
}
56-
}
57+
element.dispatchEvent(newPendingStateEvent(waitUntilValidated()));
58+
},
59+
};
5760
}

src/compas-services/foundation.ts

Lines changed: 49 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
1-
import {get} from "lit-translate";
2-
import {newLogEvent} from "../foundation.js";
3-
import {dispatchEventOnOpenScd} from "../compas/foundation.js";
1+
import { get } from 'lit-translate';
2+
import { newLogEvent } from '../foundation.js';
43

54
export const NOT_FOUND_ERROR = 'NotFoundError';
65
export const APPLICATION_ERROR = 'ApplicationError';
@@ -16,7 +15,11 @@ export async function handleResponse(response: Response): Promise<string> {
1615
} else if (response.status >= 500) {
1716
type = SERVER_ERROR;
1817
}
19-
return Promise.reject({type: type, status: response.status, message: await processErrorMessage(response)});
18+
return Promise.reject({
19+
type: type,
20+
status: response.status,
21+
message: await processErrorMessage(response),
22+
});
2023
}
2124
return Promise.resolve(response.text());
2225
}
@@ -27,13 +30,19 @@ export async function processErrorMessage(response: Response): Promise<string> {
2730

2831
const body = await response.text();
2932
const doc = await parseXml(body);
30-
const messages = Array.from(doc.querySelectorAll('ErrorResponse > ErrorMessage') ?? []);
33+
const messages = Array.from(
34+
doc.querySelectorAll('ErrorResponse > ErrorMessage') ?? []
35+
);
3136
// But if there are messages found in the body, we will process these and replace the status text with that.
3237
if (messages.length > 0) {
3338
errorMessage = '';
3439
messages.forEach((errorMessageElement, index) => {
35-
const code = errorMessageElement.getElementsByTagNameNS(COMMONS_NAMESPACE, "Code")!.item(0)!.textContent;
36-
const message = errorMessageElement.getElementsByTagNameNS(COMMONS_NAMESPACE, "Message")!.item(0)!.textContent;
40+
const code = errorMessageElement
41+
.getElementsByTagNameNS(COMMONS_NAMESPACE, 'Code')!
42+
.item(0)!.textContent;
43+
const message = errorMessageElement
44+
.getElementsByTagNameNS(COMMONS_NAMESPACE, 'Message')!
45+
.item(0)!.textContent;
3746

3847
if (index > 0) {
3948
errorMessage += ', ';
@@ -43,55 +52,70 @@ export async function processErrorMessage(response: Response): Promise<string> {
4352
if (code) {
4453
errorMessage += ' (' + code + ')';
4554
}
46-
})
55+
});
4756
}
4857

4958
return errorMessage;
5059
}
5160

5261
export function parseXml(textContent: string): Promise<Document> {
53-
return Promise.resolve(new DOMParser().parseFromString(textContent, 'application/xml'));
62+
return Promise.resolve(
63+
new DOMParser().parseFromString(textContent, 'application/xml')
64+
);
5465
}
5566

5667
export function extractSclFromResponse(response: Document): Promise<Document> {
5768
// Extract the SCL Result from the Response and create a new Document from it.
58-
const sclData = response.querySelectorAll("SclData").item(0).textContent ?? '';
59-
const sclDocument = new DOMParser().parseFromString(sclData, 'application/xml');
69+
const sclData =
70+
response.querySelectorAll('SclData').item(0).textContent ?? '';
71+
const sclDocument = new DOMParser().parseFromString(
72+
sclData,
73+
'application/xml'
74+
);
6075
return Promise.resolve(sclDocument);
6176
}
6277

6378
export function handleError(error: Error): Promise<never> {
64-
return Promise.reject({type: SERVER_ERROR, message: error.message});
79+
return Promise.reject({ type: SERVER_ERROR, message: error.message });
6580
}
6681

67-
export function createLogEvent(reason: any): void {
82+
export function createLogEvent(element: Element, reason: any): void {
6883
let message = reason.message;
6984
if (reason.status) {
70-
message += " (" + reason.status + ")";
85+
message += ' (' + reason.status + ')';
7186
}
7287

73-
dispatchEventOnOpenScd(
88+
element.dispatchEvent(
7489
newLogEvent({
7590
kind: 'error',
7691
title: get('compas.error.server'),
77-
message: get('compas.error.serverDetails', {type: reason.type, message: message})
78-
}));
92+
message: get('compas.error.serverDetails', {
93+
type: reason.type,
94+
message: message,
95+
}),
96+
})
97+
);
7998
}
8099

81100
export function getWebsocketUri(settingsUrl: string): string {
82-
if (settingsUrl.startsWith("http://") || settingsUrl.startsWith("https://")) {
83-
return settingsUrl.replace("http://", "ws://").replace("https://", "wss://");
101+
if (settingsUrl.startsWith('http://') || settingsUrl.startsWith('https://')) {
102+
return settingsUrl
103+
.replace('http://', 'ws://')
104+
.replace('https://', 'wss://');
84105
}
85106

86-
return (document.location.protocol == "http:" ? "ws://" : "wss://")
87-
+ document.location.hostname + ":" + getWebsocketPort()
88-
+ settingsUrl;
107+
return (
108+
(document.location.protocol == 'http:' ? 'ws://' : 'wss://') +
109+
document.location.hostname +
110+
':' +
111+
getWebsocketPort() +
112+
settingsUrl
113+
);
89114
}
90115

91116
export function getWebsocketPort(): string {
92-
if (document.location.port === "") {
93-
return (document.location.protocol == "http:" ? "80" : "443")
117+
if (document.location.port === '') {
118+
return document.location.protocol == 'http:' ? '80' : '443';
94119
}
95120
return document.location.port;
96121
}
97-

0 commit comments

Comments
 (0)