@open-charging-cloud/chargy-core 0.12.1 → 0.13.1
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/CHANGELOG.md +44 -0
- package/README.md +1 -1
- package/dist/OCMF.d.ts +4 -2
- package/dist/OCMF.d.ts.map +1 -1
- package/dist/browser/index.js +98 -8
- package/dist/browser/index.js.map +1 -1
- package/dist/chargy.d.ts +16 -0
- package/dist/chargy.d.ts.map +1 -1
- package/dist/interfaces/IChargeTransparencyLiveLink.d.ts +15 -4
- package/dist/interfaces/IChargeTransparencyLiveLink.d.ts.map +1 -1
- package/dist/node/index.js +98 -8
- package/dist/node/index.js.map +1 -1
- package/package.json +1 -1
package/dist/chargy.d.ts
CHANGED
|
@@ -85,6 +85,22 @@ export declare class Chargy {
|
|
|
85
85
|
private readTarString;
|
|
86
86
|
private readTarOctal;
|
|
87
87
|
DetectAndConvertContentFormat(FileInfos: Array<chargyInterfaces.IFileInfo>): Promise<chargeTransparencyRecord.IChargeTransparencyRecord | chargeTransparencyLiveLink.IChargeTransparencyLiveLink | simpleURL.IURL | publicKeyInfo.IPublicKey | publicKeyInfo.IPublicKeyLookup | chargyInterfaces.ISessionCryptoResult>;
|
|
88
|
+
/**
|
|
89
|
+
* The signed meter values a live link carries, parsed and verified with the
|
|
90
|
+
* public keys of the very same document, as an ordinary charge transparency
|
|
91
|
+
* record.
|
|
92
|
+
*
|
|
93
|
+
* A live link is not turned into one: it describes a charging session that
|
|
94
|
+
* is still running, a charge transparency record a collection of finished
|
|
95
|
+
* ones, and an application shows the two differently. The meter values are
|
|
96
|
+
* an optional part of the live link view, so they are only produced when
|
|
97
|
+
* they are asked for.
|
|
98
|
+
*
|
|
99
|
+
* Returns undefined when the live link carries no meter values yet, or none
|
|
100
|
+
* that are understood here.
|
|
101
|
+
*/
|
|
102
|
+
TryToParseLiveLinkMeterValues(LiveLink: chargeTransparencyLiveLink.IChargeTransparencyLiveLink): Promise<chargeTransparencyRecord.IChargeTransparencyRecord | undefined>;
|
|
103
|
+
private collectLiveLinkMeterValueKeys;
|
|
88
104
|
private processChargeTransparencyRecord;
|
|
89
105
|
private hasInplausibleChargingSessionTotalEnergyMeasurement;
|
|
90
106
|
private isInplausibleChargingSessionTotalEnergy;
|
package/dist/chargy.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chargy.d.ts","sourceRoot":"","sources":["../src/chargy.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"chargy.d.ts","sourceRoot":"","sources":["../src/chargy.ts"],"names":[],"mappings":"AAiCA,OAAO,KAAK,gBAAgB,MAAqB,+BAA+B,CAAA;AAChF,OAAO,KAAK,wBAAwB,MAAa,wCAAwC,CAAA;AACzF,OAAO,KAAK,0BAA0B,MAAW,0CAA0C,CAAA;AAC3F,OAAO,KAAK,SAAS,MAA4B,mBAAmB,CAAA;AACpE,OAAO,KAAK,aAAa,MAAwB,6BAA6B,CAAA;AAC9E,OAAO,KAAK,SAAS,MAA4B,wBAAwB,CAAA;AAKzE,OAAO,KAAK,MAAM,MAA+B,QAAQ,CAAC;AAE1D,OAAO,KAAK,EAAE,eAAe,EACf,mBAAmB,EACnB,oBAAoB,EAAE,MAAa,mBAAmB,CAAA;AAUpE,KAAK,WAAW,GAAG;IACf,MAAM,IAAI,WAAW,CAAC;IACtB,GAAG,IAAI,WAAW,CAAC;IACnB,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC/B,GAAG,CAAC,GAAG,KAAK,EAAE,OAAO,EAAE,GAAG,WAAW,CAAC;IACtC,KAAK,IAAI,WAAW,CAAC;IACrB,GAAG,IAAI,WAAW,CAAC;IACnB,KAAK,CAAC,MAAM,EAAE,OAAO,GAAG,WAAW,CAAC;CACvC,CAAC;AAEF,KAAK,UAAU,GAAG;IACd,MAAM,CAAC,IAAI,EAAE,UAAU,GAAG,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;CACrE,CAAC;AA0BF,KAAK,UAAU,GAAG;IACd,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,KAAK,UAAU,CAAC;CAC3E,CAAC;AAEF,KAAK,YAAY,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,GAAG,SAAS,GAAG,aAAa,GAAG,WAAW,KAAK,WAAW,CAAC;AAEjH,gEAAgE;AAChE,MAAM,MAAM,eAAe,GAAG,mBAAmB,CAAC;AAClD,4DAA4D;AAC5D,MAAM,MAAM,aAAa,GAAG,eAAe,CAAC;AAC5C,KAAK,cAAc,GAAG,oBAAoB,CAAC;AAE3C,KAAK,YAAY,GAAG,OAAO,MAAM,CAAC;AAElC,qBAAa,MAAM;IAIf,SAAiB,IAAI,EAAc,SAAS,CAAC,cAAc,CAAC;IAC3C,WAAW,EAAO,SAAS,CAAC,eAAe,CAAC;IAC7D,SAAiB,QAAQ,EAAU,cAAc,CAAC;IAClD,SAAiB,MAAM,EAAY,YAAY,CAAC;IAChD,SAAiB,IAAI,EAAc,UAAU,CAAC;IAC9C,SAAiB,YAAY,EAAM,YAAY,CAAC;IAChD,SAAiB,cAAc,EAAI,gBAAgB,CAAC,sBAAsB,CAAC;IAC3E,SAAiB,eAAe,EAAG,gBAAgB,CAAC,gBAAgB,CAAC;IACrE,SAAiB,WAAW,EAAO,OAAO,CAAC;IAC3C,SAAiB,WAAW,EAAO,SAAS,CAAC,WAAW,GAAG,SAAS,CAAC;IAErE,OAAO,CAAC,wBAAwB,CAA2D;IAC3F,OAAO,CAAC,aAAa,CAA2D;IAChF,OAAO,CAAC,gBAAgB,CAA2D;IACnF,OAAO,CAAC,KAAK,CAA2D;IACxE,OAAO,CAAC,MAAM,CAAiE;IAC/E,OAAO,CAAC,gBAAgB,CAAmE;IAEnF,UAAU,EAAwB,wBAAwB,CAAC,yBAAyB,CAAC;IACrF,WAAW,EAAuB,wBAAwB,CAAC,yBAAyB,CAAC;gBAIjF,IAAI,EAAc,SAAS,CAAC,cAAc,EAC1C,WAAW,EAAO,SAAS,CAAC,eAAe,EAC3C,QAAQ,EAAU,cAAc,EAChC,MAAM,EAAY,YAAY,EAC9B,IAAI,EAAc,UAAU,EAC5B,YAAY,EAAM,YAAY,EAC9B,cAAc,EAAI,gBAAgB,CAAC,sBAAsB,EACzD,eAAe,GAAG,gBAAgB,CAAC,gBAA8E,EACjH,WAAW,GAAO,OAAe,EACjC,WAAW,CAAC,EAAM,SAAS,CAAC,WAAW;YAerC,UAAU;IAoDxB,OAAO,CAAC,wBAAwB;IAc5B,OAAO,CAAC,uBAAuB;IAQnC,OAAO,CAAC,sBAAsB;IAsI9B,OAAO,CAAC,yBAAyB;IAoBjC,OAAO,CAAC,oBAAoB;IAkE5B,OAAO,CAAC,0BAA0B;IAyClC,OAAO,CAAC,iBAAiB;IASzB,OAAO,CAAC,kCAAkC;IA6B1C,OAAO,CAAC,sBAAsB;IAoB9B,OAAO,CAAC,8BAA8B;YAyBxB,sBAAsB;IAuDpC,OAAO,CAAC,4BAA4B;IAwB7B,cAAc,CAAC,WAAW,EAAE,SAAS,CAAC,eAAe,GAAG,IAAI;IAOnE,OAAO,CAAC,oBAAoB;IAuB5B,OAAO,CAAC,yBAAyB;IAoBjC,OAAO,CAAC,yBAAyB;IAgB1B,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAkBzC,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC,UAAU;IASxD,gCAAgC,CAAC,IAAI,EAAQ,MAAM,EAClB,SAAS,EAAG,MAAM,GAAG,MAAM,GAAG,MAAM;IAkBrE,iCAAiC,CAAC,IAAI,EAAQ,MAAM,EAClB,SAAS,EAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC,UAAU;IAuBpF,gBAAgB,CAAC,IAAI,EAAE,SAAS,CAAC,UAAU,GAAC,SAAS,GAAG,MAAM,GAAC,SAAS;IAaxE,eAAe,EAAE,gBAAgB,CAAC,mBAAmB,CAU3D;IAEM,kBAAkB,EAAE,gBAAgB,CAAC,sBAAsB,CAUjE;IAEM,OAAO,EAAE,gBAAgB,CAAC,WAAW,CAU3C;IAEM,QAAQ,EAAE,gBAAgB,CAAC,YAAY,CAU7C;IAOY,4BAA4B,CAAC,eAAe,EAAG,gBAAgB,CAAC,gBAAgB,GAAG,IAAI,GAAG,SAAS,EACtE,IAAI,EAAc,gBAAgB,CAAC,KAAK,GAAc,IAAI,GAAG,SAAS,EACtE,KAAK,EAAa,gBAAgB,CAAC,YAAY,GAAO,IAAI,GAAG,SAAS,EACtE,SAAS,EAAS,aAAa,CAAI,UAAU,GAAS,IAAI,GAAG,SAAS,EACtE,SAAS,EAAS,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;YAwFvE,eAAe;YAsPf,cAAc;IA8C5B,OAAO,CAAC,iBAAiB;YA2CX,iBAAiB;YA+EjB,gBAAgB;IAQ9B,OAAO,CAAC,4BAA4B;IAapC,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,aAAa;IAWrB,OAAO,CAAC,YAAY;IAWP,6BAA6B,CAAC,SAAS,EAAE,KAAK,CAAC,gBAAgB,CAAC,SAAS,CAAC,GAEjF,OAAO,CAAC,wBAAwB,CAAG,yBAAyB,GACpD,0BAA0B,CAAC,2BAA2B,GACtD,SAAS,CAAqB,IAAI,GAClC,aAAa,CAAc,UAAU,GACrC,aAAa,CAAc,gBAAgB,GAC3C,gBAAgB,CAAW,oBAAoB,CAAC;IA0pB9D;;;;;;;;;;;;;OAaG;IACU,6BAA6B,CAAC,QAAQ,EAAE,0BAA0B,CAAC,2BAA2B,GAErG,OAAO,CAAC,wBAAwB,CAAC,yBAAyB,GAAC,SAAS,CAAC;IAoD3E,OAAO,CAAC,6BAA6B;YAmDvB,+BAA+B;IAgS7C,OAAO,CAAC,mDAAmD;IAuC3D,OAAO,CAAC,uCAAuC;IAwC/C,OAAO,CAAC,gBAAgB;IA6BxB,OAAO,CAAC,qBAAqB;IAwB7B,OAAO,CAAC,yCAAyC;IAQjD,OAAO,CAAC,kCAAkC;IAc1C,OAAO,CAAC,aAAa;YAaP,sBAAsB;IAsG7B,8BAA8B,CAAC,IAAI,EAAE,KAAK,CAAC,wBAAwB,CAAC,yBAAyB,CAAC,GAAG,wBAAwB,CAAC,yBAAyB;CAgF7J"}
|
|
@@ -1,11 +1,13 @@
|
|
|
1
|
-
import * as chargyInterfaces from './chargyInterfaces';
|
|
1
|
+
import type * as chargyInterfaces from './chargyInterfaces';
|
|
2
2
|
import * as chargyLib from './chargyLib';
|
|
3
3
|
export declare const ChargeTransparencyLiveLinkContext = "https://open.charging.cloud/contexts/chargeTransparency/live/link/1.0";
|
|
4
|
+
export declare function isConnector(data: unknown): data is IConnector;
|
|
5
|
+
export declare function isTransport(data: unknown): data is Transport;
|
|
4
6
|
export declare function IsAChargeTransparencyLiveLink(data: unknown): data is IChargeTransparencyLiveLink;
|
|
5
7
|
export interface IChargeTransparencyLiveLink extends chargyLib.JSONObject {
|
|
6
8
|
"@context": typeof ChargeTransparencyLiveLinkContext;
|
|
7
|
-
/** ISO 8601 timestamp */
|
|
8
|
-
|
|
9
|
+
/** ISO 8601 creation timestamp */
|
|
10
|
+
created?: string | null;
|
|
9
11
|
/** Multi-language description */
|
|
10
12
|
description?: chargyLib.I18NString;
|
|
11
13
|
/** URLs to images / logos */
|
|
@@ -15,7 +17,7 @@ export interface IChargeTransparencyLiveLink extends chargyLib.JSONObject {
|
|
|
15
17
|
/** Technical connector data */
|
|
16
18
|
connector?: IConnector;
|
|
17
19
|
/** Available transport methods for live data */
|
|
18
|
-
|
|
20
|
+
liveTransports?: Transport[];
|
|
19
21
|
/** Digital signatures (currently empty or extendable) */
|
|
20
22
|
signatures?: chargyInterfaces.ISignature[];
|
|
21
23
|
}
|
|
@@ -35,6 +37,15 @@ export interface ITransport {
|
|
|
35
37
|
}
|
|
36
38
|
export interface TransportHTTPS extends ITransport {
|
|
37
39
|
type: "https";
|
|
40
|
+
/**
|
|
41
|
+
* How often to ask for the document again, in seconds.
|
|
42
|
+
*
|
|
43
|
+
* This belongs to https alone: a websocket or a server-sent event stream
|
|
44
|
+
* delivers a new document when there is one, and if either ever needs a
|
|
45
|
+
* period of its own it will mean something else than asking again. Absent
|
|
46
|
+
* means: do not poll.
|
|
47
|
+
*/
|
|
48
|
+
refresh?: number;
|
|
38
49
|
}
|
|
39
50
|
export interface TransportHTTPSSE extends ITransport {
|
|
40
51
|
type: "httpSSE";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IChargeTransparencyLiveLink.d.ts","sourceRoot":"","sources":["../../src/interfaces/IChargeTransparencyLiveLink.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,gBAAgB,MAAO,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"IChargeTransparencyLiveLink.d.ts","sourceRoot":"","sources":["../../src/interfaces/IChargeTransparencyLiveLink.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,KAAK,gBAAgB,MAAO,oBAAoB,CAAA;AAC5D,OAAO,KAAK,SAAS,MAAmB,aAAa,CAAA;AAGrD,eAAO,MAAM,iCAAiC,0EAA0E,CAAC;AAGzH,wBAAgB,WAAW,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,UAAU,CAM7D;AAiBD,wBAAgB,WAAW,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,SAAS,CA2B5D;AAED,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,2BAA2B,CAWhG;AAQD,MAAM,WAAW,2BAA4B,SAAQ,SAAS,CAAC,UAAU;IAErE,UAAU,EAAE,OAAO,iCAAiC,CAAC;IAErD,kCAAkC;IAClC,OAAO,CAAC,EAAQ,MAAM,GAAC,IAAI,CAAC;IAE5B,iCAAiC;IACjC,WAAW,CAAC,EAAI,SAAS,CAAC,UAAU,CAAC;IAErC,6BAA6B;IAC7B,SAAS,CAAC,EAAM,MAAM,EAAE,CAAC;IAEzB,kDAAkD;IAClD,WAAW,CAAC,EAAI,gBAAgB,CAAC,YAAY,CAAC;IAE9C,+BAA+B;IAC/B,SAAS,CAAC,EAAM,UAAU,CAAC;IAE3B,gDAAgD;IAChD,cAAc,CAAC,EAAE,SAAS,EAAE,CAAC;IAE7B,yDAAyD;IACzD,UAAU,CAAC,EAAK,gBAAgB,CAAC,UAAU,EAAE,CAAC;CAEjD;AAED,4BAA4B;AAC5B,MAAM,WAAW,UAAU;IACvB,QAAQ,CAAC,EAAc,MAAM,CAAC;IAC9B,MAAM,CAAC,EAAgB,MAAM,CAAC;IAC9B,SAAS,CAAC,EAAa,MAAM,CAAC;IAC9B,QAAQ,CAAC,EAAc,MAAM,CAAC;CACjC;AAID,sDAAsD;AACtD,MAAM,MAAM,SAAS,GACjB,cAAc,GACd,gBAAgB,GAChB,kBAAkB,CAAC;AAGvB,MAAM,WAAW,UAAU;IACvB,GAAG,CAAC,EAAG,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,KAAK,CAAC,aAAa,GAAC,MAAM,CAAC,CAAC;IACnC,IAAI,CAAC,EAAE,UAAU,CAAC;CACrB;AAED,MAAM,WAAW,cAAmB,SAAQ,UAAU;IAClD,IAAI,EAAE,OAAO,CAAC;IAEd;;;;;;;OAOG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAmB,SAAQ,UAAU;IAClD,IAAI,EAAE,SAAS,CAAC;CACnB;AAED,MAAM,WAAW,kBAAmB,SAAQ,UAAU;IAClD,IAAI,EAAE,WAAW,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC1B,GAAG,EAAoB,MAAM,CAAC;IAC9B,QAAQ,CAAC,EAAc,MAAM,CAAC;IAC9B,MAAM,CAAC,EAAgB,MAAM,CAAC;CACjC;AAED,iDAAiD;AACjD,MAAM,WAAW,UAAU;IACvB,mBAAmB,EAAI,MAAM,CAAC;IAC9B,QAAQ,EAAe,MAAM,CAAC;CACjC"}
|
package/dist/node/index.js
CHANGED
|
@@ -6447,6 +6447,25 @@ var OCMF = class {
|
|
|
6447
6447
|
)
|
|
6448
6448
|
);
|
|
6449
6449
|
}
|
|
6450
|
+
//#region (private) validateOCMFSignatureWithAnyOf(OCMFJSONDocument, PublicKeys, PublicKeyEncoding?)
|
|
6451
|
+
// Tries the document against every candidate key and keeps the first
|
|
6452
|
+
// signature that verifies. Without this a session whose start and end
|
|
6453
|
+
// values are signed by a different key than its intermediate values could
|
|
6454
|
+
// never validate as a whole.
|
|
6455
|
+
async validateOCMFSignatureWithAnyOf(OCMFJSONDocument, PublicKeys, PublicKeyEncoding) {
|
|
6456
|
+
const candidates = Array.isArray(PublicKeys) ? PublicKeys : [PublicKeys];
|
|
6457
|
+
let lastResult = "Unvalidated" /* Unvalidated */;
|
|
6458
|
+
for (const publicKey of candidates) {
|
|
6459
|
+
OCMFJSONDocument.validationStatus = "Unvalidated" /* Unvalidated */;
|
|
6460
|
+
OCMFJSONDocument.validationErrors = void 0;
|
|
6461
|
+
OCMFJSONDocument.publicKey = void 0;
|
|
6462
|
+
lastResult = await this.validateOCMFSignature(OCMFJSONDocument, publicKey, PublicKeyEncoding);
|
|
6463
|
+
if (lastResult === "ValidSignature" /* ValidSignature */)
|
|
6464
|
+
return lastResult;
|
|
6465
|
+
}
|
|
6466
|
+
return lastResult;
|
|
6467
|
+
}
|
|
6468
|
+
//#endregion
|
|
6450
6469
|
//#region (private) validateOCMFSignature(OCMFJSONDocument, PublicKey, PublicKeyEncoding?)
|
|
6451
6470
|
async validateOCMFSignature(OCMFJSONDocument, PublicKey, PublicKeyEncoding) {
|
|
6452
6471
|
try {
|
|
@@ -6759,7 +6778,9 @@ var OCMF = class {
|
|
|
6759
6778
|
signature: ocmfSignature,
|
|
6760
6779
|
hashAlgorithm,
|
|
6761
6780
|
hashValue,
|
|
6762
|
-
|
|
6781
|
+
// With several candidates the key is only known once one of
|
|
6782
|
+
// them has verified, so it is left to the validation step.
|
|
6783
|
+
publicKey: Array.isArray(PublicKey) ? void 0 : PublicKey,
|
|
6763
6784
|
publicKeyEncoding: PublicKeyEncoding,
|
|
6764
6785
|
validationStatus: validationStatus ?? (PublicKey != null ? "Unvalidated" /* Unvalidated */ : "PublicKeyNotFound" /* PublicKeyNotFound */)
|
|
6765
6786
|
};
|
|
@@ -6799,7 +6820,7 @@ var OCMF = class {
|
|
|
6799
6820
|
ocmfJSONDocument.validationStatus = "InvalidSignature" /* InvalidSignature */;
|
|
6800
6821
|
}
|
|
6801
6822
|
if (PublicKey != null && ocmfJSONDocument.validationStatus === "Unvalidated" /* Unvalidated */)
|
|
6802
|
-
await this.
|
|
6823
|
+
await this.validateOCMFSignatureWithAnyOf(
|
|
6803
6824
|
ocmfJSONDocument,
|
|
6804
6825
|
PublicKey,
|
|
6805
6826
|
PublicKeyEncoding
|
|
@@ -6869,7 +6890,7 @@ var OCMF = class {
|
|
|
6869
6890
|
if (PublicKey != null) {
|
|
6870
6891
|
for (const ocmfJSONDocument of ocmfJSONDocumentGroup)
|
|
6871
6892
|
if (ocmfJSONDocument.validationStatus === "Unvalidated" /* Unvalidated */)
|
|
6872
|
-
await this.
|
|
6893
|
+
await this.validateOCMFSignatureWithAnyOf(ocmfJSONDocument, PublicKey);
|
|
6873
6894
|
}
|
|
6874
6895
|
if (ocmfJSONDocumentGroup[0]) {
|
|
6875
6896
|
switch (ocmfJSONDocumentGroup[0].payload.FV) {
|
|
@@ -10238,7 +10259,9 @@ function toSessionVerificationResults(CTR, noRecordsMessage = { "en": "No charge
|
|
|
10238
10259
|
var IChargeTransparencyLiveLink_exports = {};
|
|
10239
10260
|
__export(IChargeTransparencyLiveLink_exports, {
|
|
10240
10261
|
ChargeTransparencyLiveLinkContext: () => ChargeTransparencyLiveLinkContext,
|
|
10241
|
-
IsAChargeTransparencyLiveLink: () => IsAChargeTransparencyLiveLink
|
|
10262
|
+
IsAChargeTransparencyLiveLink: () => IsAChargeTransparencyLiveLink,
|
|
10263
|
+
isConnector: () => isConnector,
|
|
10264
|
+
isTransport: () => isTransport
|
|
10242
10265
|
});
|
|
10243
10266
|
var ChargeTransparencyLiveLinkContext = "https://open.charging.cloud/contexts/chargeTransparency/live/link/1.0";
|
|
10244
10267
|
function isConnector(data) {
|
|
@@ -10258,12 +10281,13 @@ function isTransport(data) {
|
|
|
10258
10281
|
if (type !== "https" && type !== "httpSSE" && type !== "websocket") {
|
|
10259
10282
|
return false;
|
|
10260
10283
|
}
|
|
10284
|
+
if (type === "https" && data["refresh"] !== void 0 && typeof data["refresh"] !== "number") {
|
|
10285
|
+
return false;
|
|
10286
|
+
}
|
|
10261
10287
|
return (data["url"] === void 0 || typeof data["url"] === "string") && (data["urls"] === void 0 || Array.isArray(data["urls"]) && data["urls"].every(isTransportURL)) && (data["totp"] === void 0 || isTOTPConfig(data["totp"]));
|
|
10262
10288
|
}
|
|
10263
10289
|
function IsAChargeTransparencyLiveLink(data) {
|
|
10264
|
-
|
|
10265
|
-
return false;
|
|
10266
|
-
return data["@context"] === ChargeTransparencyLiveLinkContext && (data["timestamp"] === void 0 || data["timestamp"] === null || typeof data["timestamp"] === "string") && (data["description"] === void 0 || isI18NString(data["description"])) && (data["imageURLs"] === void 0 || Array.isArray(data["imageURLs"]) && data["imageURLs"].every((value) => typeof value === "string")) && (data["geoLocation"] === void 0 || isGeoLocation(data["geoLocation"])) && (data["connector"] === void 0 || isConnector(data["connector"])) && (data["transports"] === void 0 || Array.isArray(data["transports"]) && data["transports"].every(isTransport)) && (data["signatures"] === void 0 || Array.isArray(data["signatures"]));
|
|
10290
|
+
return isMandatoryJSONObject(data) && data["@context"] === ChargeTransparencyLiveLinkContext;
|
|
10267
10291
|
}
|
|
10268
10292
|
function isTOTPConfig(data) {
|
|
10269
10293
|
return isObject(data) && typeof data["initialSharedSecret"] === "string" && typeof data["timeStep"] === "number";
|
|
@@ -11440,7 +11464,7 @@ var Chargy = class {
|
|
|
11440
11464
|
throw new Error("Parsed JSON content is not a JSON object!");
|
|
11441
11465
|
const JSONContext = JSONContent["@context"];
|
|
11442
11466
|
if (IsAChargeTransparencyLiveLink(JSONContent)) {
|
|
11443
|
-
JSONContent.
|
|
11467
|
+
JSONContent.created ??= (/* @__PURE__ */ new Date()).toISOString();
|
|
11444
11468
|
processedFile.result = JSONContent;
|
|
11445
11469
|
} else if (JSONContent["format"] === "ptb")
|
|
11446
11470
|
processedFile.result = await new PTB(this).TryToParsePTBContainer(JSONContent);
|
|
@@ -11573,6 +11597,72 @@ var Chargy = class {
|
|
|
11573
11597
|
};
|
|
11574
11598
|
}
|
|
11575
11599
|
//#endregion
|
|
11600
|
+
//#region TryToParseLiveLinkMeterValues(LiveLink)
|
|
11601
|
+
/**
|
|
11602
|
+
* The signed meter values a live link carries, parsed and verified with the
|
|
11603
|
+
* public keys of the very same document, as an ordinary charge transparency
|
|
11604
|
+
* record.
|
|
11605
|
+
*
|
|
11606
|
+
* A live link is not turned into one: it describes a charging session that
|
|
11607
|
+
* is still running, a charge transparency record a collection of finished
|
|
11608
|
+
* ones, and an application shows the two differently. The meter values are
|
|
11609
|
+
* an optional part of the live link view, so they are only produced when
|
|
11610
|
+
* they are asked for.
|
|
11611
|
+
*
|
|
11612
|
+
* Returns undefined when the live link carries no meter values yet, or none
|
|
11613
|
+
* that are understood here.
|
|
11614
|
+
*/
|
|
11615
|
+
async TryToParseLiveLinkMeterValues(LiveLink) {
|
|
11616
|
+
const signedMeterValues = asJSONObject(LiveLink["signedMeterValues"]);
|
|
11617
|
+
if (signedMeterValues === void 0)
|
|
11618
|
+
return void 0;
|
|
11619
|
+
const encodings = signedMeterValues["encodings"];
|
|
11620
|
+
const values = signedMeterValues["values"];
|
|
11621
|
+
if (!Array.isArray(encodings) || encodings[0] !== "OCMF" || !Array.isArray(values) || values.length === 0 || !values.every((value) => typeof value === "string" && value !== "")) {
|
|
11622
|
+
return void 0;
|
|
11623
|
+
}
|
|
11624
|
+
const publicKeys = this.collectLiveLinkMeterValueKeys(LiveLink);
|
|
11625
|
+
const ctr = await new OCMF(this).TryToParseOCMFDocuments(
|
|
11626
|
+
values,
|
|
11627
|
+
publicKeys.length > 0 ? publicKeys : void 0,
|
|
11628
|
+
"hex"
|
|
11629
|
+
);
|
|
11630
|
+
if (!IsAChargeTransparencyRecord(ctr))
|
|
11631
|
+
return void 0;
|
|
11632
|
+
const verifiedCTR = await this.processChargeTransparencyRecord(ctr);
|
|
11633
|
+
return IsAChargeTransparencyRecord(verifiedCTR) ? verifiedCTR : void 0;
|
|
11634
|
+
}
|
|
11635
|
+
//#endregion
|
|
11636
|
+
//#region (private) collectLiveLinkMeterValueKeys(LiveLink)
|
|
11637
|
+
// Every public key of the document that is allowed to sign meter values.
|
|
11638
|
+
// A charging session is regularly signed by more than one of them: the
|
|
11639
|
+
// meter signs its start and end values, the operator the intermediate ones.
|
|
11640
|
+
collectLiveLinkMeterValueKeys(LiveLink) {
|
|
11641
|
+
const publicKeys = new Array();
|
|
11642
|
+
const collectFrom = (candidates) => {
|
|
11643
|
+
if (!Array.isArray(candidates))
|
|
11644
|
+
return;
|
|
11645
|
+
for (const candidate of candidates) {
|
|
11646
|
+
const entry = asJSONObject(candidate);
|
|
11647
|
+
const value = asString(entry?.["value"]);
|
|
11648
|
+
const keyUsage = entry?.["keyUsage"];
|
|
11649
|
+
const encodings = entry?.["encodings"];
|
|
11650
|
+
if (value === void 0 || value === "")
|
|
11651
|
+
continue;
|
|
11652
|
+
if (Array.isArray(encodings) && encodings[encodings.length - 1] !== "hex")
|
|
11653
|
+
continue;
|
|
11654
|
+
if (Array.isArray(keyUsage) && !keyUsage.some((usage) => usage === "signMeterValues" || usage === "signEnergyMeterValues"))
|
|
11655
|
+
continue;
|
|
11656
|
+
publicKeys.push(value);
|
|
11657
|
+
}
|
|
11658
|
+
};
|
|
11659
|
+
const chargingStation = asJSONObject(LiveLink["chargingStation"]);
|
|
11660
|
+
const evse = asJSONObject(chargingStation?.["EVSE"]);
|
|
11661
|
+
collectFrom(asJSONObject(LiveLink["chargingStationOperator"])?.["publicKeys"]);
|
|
11662
|
+
collectFrom(asJSONObject(evse?.["energyMeter"])?.["publicKeys"]);
|
|
11663
|
+
return publicKeys;
|
|
11664
|
+
}
|
|
11665
|
+
//#endregion
|
|
11576
11666
|
//#region (private) processChargeTransparencyRecord(CTR)
|
|
11577
11667
|
async processChargeTransparencyRecord(CTR) {
|
|
11578
11668
|
if (!IsAChargeTransparencyRecord(CTR))
|