@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 CHANGED
@@ -7,6 +7,50 @@ While the version number is below 1.0.0, breaking changes are released in minor
7
7
  versions and are always listed first below.
8
8
 
9
9
 
10
+ ## [0.13.0] - 2026-08-28
11
+
12
+ ### Breaking
13
+
14
+ - **`IChargeTransparencyLiveLink.timestamp` is now `created`, and
15
+ `transports` is now `liveTransports`.** The names now say what the properties
16
+ are: the timestamp records when the link was created rather than some
17
+ unspecified event, and the transports are the ones carrying the live data,
18
+ which distinguishes them from any other transport a document may come to
19
+ describe. `IsAChargeTransparencyLiveLink()` validates the new names, and a
20
+ live link without a `created` timestamp gets the current UTC time in that
21
+ property instead. There is no fallback to the old names: a document still
22
+ using `timestamp` or `transports` is accepted by the type guard, because both
23
+ properties are optional, but the values are ignored. Consuming code reading
24
+ either property has to be updated, and so do stored documents.
25
+
26
+ ### Added
27
+
28
+ - **`Chargy.TryToParseLiveLinkMeterValues()`** turns the `signedMeterValues` of
29
+ a charge transparency live link into a verified charge transparency record.
30
+ Until now that property was never read: the meter values were not parsed, not
31
+ verified and not displayed anywhere. They are fed through the OCMF parser
32
+ together with the public keys the very same document carries, and through the
33
+ same verification every other record goes through. The live link itself stays
34
+ a live link - it describes a session that is still running, a record a
35
+ collection of finished ones - so the meter values are produced on demand and
36
+ shown next to it rather than in its place. Returns `undefined` when a live
37
+ link carries no meter values yet, which is the normal state of the first
38
+ document of a series.
39
+
40
+ - **An https transport may say how often to ask for the document again.**
41
+ `TransportHTTPS.refresh` is a number of seconds, and
42
+ `IsAChargeTransparencyLiveLink()` validates it. It belongs to https alone: a
43
+ websocket or a server-sent event stream delivers a new document when there is
44
+ one. Its absence means: do not poll.
45
+
46
+ - **`OCMF.TryToParseOCMFDocuments()` and `TryToParseOCMFDocument()` accept an
47
+ array of public keys.** A single key stays valid and behaves as before. This
48
+ is needed because a session is regularly signed by more than one key: many
49
+ meters sign their start and end values with a different key than the
50
+ intermediate ones, and an operator may hold several keys at once while
51
+ rotating them. Each document is tried against every candidate and keeps the
52
+ first signature that verifies.
53
+
10
54
  ## [0.12.0] - 2026-08-15
11
55
 
12
56
  ### Breaking
package/README.md CHANGED
@@ -207,7 +207,7 @@ npx playwright install chromium
207
207
  ## Publishing
208
208
 
209
209
  ```bash
210
- npm version 0.12.1 --no-git-tag-version
210
+ npm version 0.13.1 --no-git-tag-version
211
211
  npm run verify
212
212
  npm pack --dry-run
213
213
  npm pack
package/dist/OCMF.d.ts CHANGED
@@ -191,15 +191,17 @@ export interface IOCMFChargeTransparencyRecord extends chargeTransparencyRecord.
191
191
  ocmf?: IOCMFCTRExtensions | undefined;
192
192
  chargingSessions?: Array<IOCMFChargingSession> | undefined;
193
193
  }
194
+ export type OCMFPublicKeys = string | publicKeyInfoType.IPublicKeyXY | Array<string | publicKeyInfoType.IPublicKeyXY>;
194
195
  export declare class OCMF {
195
196
  private readonly chargy;
196
197
  constructor(chargy: Chargy);
197
198
  private tryToParseOCMFv1_0;
198
199
  private AddValidationError;
200
+ private validateOCMFSignatureWithAnyOf;
199
201
  private validateOCMFSignature;
200
202
  private parseOCMFJSONDocuments;
201
- TryToParseOCMFDocument(OCMFDocument: string, PublicKey?: string | publicKeyInfoType.IPublicKeyXY, PublicKeyEncoding?: string, ContainerInfos?: chargyInterfaces.IContainerInfos): Promise<chargeTransparencyRecord.IChargeTransparencyRecord | chargyInterfaces.ISessionCryptoResult>;
202
- TryToParseOCMFDocuments(OCMFDocuments: string[], PublicKey?: string | publicKeyInfoType.IPublicKeyXY, PublicKeyEncoding?: string, ContainerInfos?: chargyInterfaces.IContainerInfos): Promise<chargeTransparencyRecord.IChargeTransparencyRecord | chargyInterfaces.ISessionCryptoResult>;
203
+ TryToParseOCMFDocument(OCMFDocument: string, PublicKey?: OCMFPublicKeys, PublicKeyEncoding?: string, ContainerInfos?: chargyInterfaces.IContainerInfos): Promise<chargeTransparencyRecord.IChargeTransparencyRecord | chargyInterfaces.ISessionCryptoResult>;
204
+ TryToParseOCMFDocuments(OCMFDocuments: string[], PublicKey?: OCMFPublicKeys, PublicKeyEncoding?: string, ContainerInfos?: chargyInterfaces.IContainerInfos): Promise<chargeTransparencyRecord.IChargeTransparencyRecord | chargyInterfaces.ISessionCryptoResult>;
203
205
  private convertToISO8601;
204
206
  }
205
207
  //# sourceMappingURL=OCMF.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"OCMF.d.ts","sourceRoot":"","sources":["../src/OCMF.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"OCMF.d.ts","sourceRoot":"","sources":["../src/OCMF.ts"],"names":[],"mappings":"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"}
@@ -8242,6 +8242,25 @@ var OCMF = class {
8242
8242
  )
8243
8243
  );
8244
8244
  }
8245
+ //#region (private) validateOCMFSignatureWithAnyOf(OCMFJSONDocument, PublicKeys, PublicKeyEncoding?)
8246
+ // Tries the document against every candidate key and keeps the first
8247
+ // signature that verifies. Without this a session whose start and end
8248
+ // values are signed by a different key than its intermediate values could
8249
+ // never validate as a whole.
8250
+ async validateOCMFSignatureWithAnyOf(OCMFJSONDocument, PublicKeys, PublicKeyEncoding) {
8251
+ const candidates = Array.isArray(PublicKeys) ? PublicKeys : [PublicKeys];
8252
+ let lastResult = "Unvalidated" /* Unvalidated */;
8253
+ for (const publicKey of candidates) {
8254
+ OCMFJSONDocument.validationStatus = "Unvalidated" /* Unvalidated */;
8255
+ OCMFJSONDocument.validationErrors = void 0;
8256
+ OCMFJSONDocument.publicKey = void 0;
8257
+ lastResult = await this.validateOCMFSignature(OCMFJSONDocument, publicKey, PublicKeyEncoding);
8258
+ if (lastResult === "ValidSignature" /* ValidSignature */)
8259
+ return lastResult;
8260
+ }
8261
+ return lastResult;
8262
+ }
8263
+ //#endregion
8245
8264
  //#region (private) validateOCMFSignature(OCMFJSONDocument, PublicKey, PublicKeyEncoding?)
8246
8265
  async validateOCMFSignature(OCMFJSONDocument, PublicKey, PublicKeyEncoding) {
8247
8266
  try {
@@ -8554,7 +8573,9 @@ var OCMF = class {
8554
8573
  signature: ocmfSignature,
8555
8574
  hashAlgorithm,
8556
8575
  hashValue,
8557
- publicKey: PublicKey,
8576
+ // With several candidates the key is only known once one of
8577
+ // them has verified, so it is left to the validation step.
8578
+ publicKey: Array.isArray(PublicKey) ? void 0 : PublicKey,
8558
8579
  publicKeyEncoding: PublicKeyEncoding,
8559
8580
  validationStatus: validationStatus ?? (PublicKey != null ? "Unvalidated" /* Unvalidated */ : "PublicKeyNotFound" /* PublicKeyNotFound */)
8560
8581
  };
@@ -8594,7 +8615,7 @@ var OCMF = class {
8594
8615
  ocmfJSONDocument.validationStatus = "InvalidSignature" /* InvalidSignature */;
8595
8616
  }
8596
8617
  if (PublicKey != null && ocmfJSONDocument.validationStatus === "Unvalidated" /* Unvalidated */)
8597
- await this.validateOCMFSignature(
8618
+ await this.validateOCMFSignatureWithAnyOf(
8598
8619
  ocmfJSONDocument,
8599
8620
  PublicKey,
8600
8621
  PublicKeyEncoding
@@ -8664,7 +8685,7 @@ var OCMF = class {
8664
8685
  if (PublicKey != null) {
8665
8686
  for (const ocmfJSONDocument of ocmfJSONDocumentGroup)
8666
8687
  if (ocmfJSONDocument.validationStatus === "Unvalidated" /* Unvalidated */)
8667
- await this.validateOCMFSignature(ocmfJSONDocument, PublicKey);
8688
+ await this.validateOCMFSignatureWithAnyOf(ocmfJSONDocument, PublicKey);
8668
8689
  }
8669
8690
  if (ocmfJSONDocumentGroup[0]) {
8670
8691
  switch (ocmfJSONDocumentGroup[0].payload.FV) {
@@ -12036,7 +12057,9 @@ function toSessionVerificationResults(CTR, noRecordsMessage = { "en": "No charge
12036
12057
  var IChargeTransparencyLiveLink_exports = {};
12037
12058
  __export(IChargeTransparencyLiveLink_exports, {
12038
12059
  ChargeTransparencyLiveLinkContext: () => ChargeTransparencyLiveLinkContext,
12039
- IsAChargeTransparencyLiveLink: () => IsAChargeTransparencyLiveLink
12060
+ IsAChargeTransparencyLiveLink: () => IsAChargeTransparencyLiveLink,
12061
+ isConnector: () => isConnector,
12062
+ isTransport: () => isTransport
12040
12063
  });
12041
12064
  var ChargeTransparencyLiveLinkContext = "https://open.charging.cloud/contexts/chargeTransparency/live/link/1.0";
12042
12065
  function isConnector(data) {
@@ -12056,12 +12079,13 @@ function isTransport(data) {
12056
12079
  if (type !== "https" && type !== "httpSSE" && type !== "websocket") {
12057
12080
  return false;
12058
12081
  }
12082
+ if (type === "https" && data["refresh"] !== void 0 && typeof data["refresh"] !== "number") {
12083
+ return false;
12084
+ }
12059
12085
  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"]));
12060
12086
  }
12061
12087
  function IsAChargeTransparencyLiveLink(data) {
12062
- if (!isMandatoryJSONObject(data))
12063
- return false;
12064
- 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"]));
12088
+ return isMandatoryJSONObject(data) && data["@context"] === ChargeTransparencyLiveLinkContext;
12065
12089
  }
12066
12090
  function isTOTPConfig(data) {
12067
12091
  return isObject(data) && typeof data["initialSharedSecret"] === "string" && typeof data["timeStep"] === "number";
@@ -13241,7 +13265,7 @@ var Chargy = class {
13241
13265
  throw new Error("Parsed JSON content is not a JSON object!");
13242
13266
  const JSONContext = JSONContent["@context"];
13243
13267
  if (IsAChargeTransparencyLiveLink(JSONContent)) {
13244
- JSONContent.timestamp ??= (/* @__PURE__ */ new Date()).toISOString();
13268
+ JSONContent.created ??= (/* @__PURE__ */ new Date()).toISOString();
13245
13269
  processedFile.result = JSONContent;
13246
13270
  } else if (JSONContent["format"] === "ptb")
13247
13271
  processedFile.result = await new PTB(this).TryToParsePTBContainer(JSONContent);
@@ -13374,6 +13398,72 @@ var Chargy = class {
13374
13398
  };
13375
13399
  }
13376
13400
  //#endregion
13401
+ //#region TryToParseLiveLinkMeterValues(LiveLink)
13402
+ /**
13403
+ * The signed meter values a live link carries, parsed and verified with the
13404
+ * public keys of the very same document, as an ordinary charge transparency
13405
+ * record.
13406
+ *
13407
+ * A live link is not turned into one: it describes a charging session that
13408
+ * is still running, a charge transparency record a collection of finished
13409
+ * ones, and an application shows the two differently. The meter values are
13410
+ * an optional part of the live link view, so they are only produced when
13411
+ * they are asked for.
13412
+ *
13413
+ * Returns undefined when the live link carries no meter values yet, or none
13414
+ * that are understood here.
13415
+ */
13416
+ async TryToParseLiveLinkMeterValues(LiveLink) {
13417
+ const signedMeterValues = asJSONObject(LiveLink["signedMeterValues"]);
13418
+ if (signedMeterValues === void 0)
13419
+ return void 0;
13420
+ const encodings = signedMeterValues["encodings"];
13421
+ const values = signedMeterValues["values"];
13422
+ if (!Array.isArray(encodings) || encodings[0] !== "OCMF" || !Array.isArray(values) || values.length === 0 || !values.every((value) => typeof value === "string" && value !== "")) {
13423
+ return void 0;
13424
+ }
13425
+ const publicKeys = this.collectLiveLinkMeterValueKeys(LiveLink);
13426
+ const ctr = await new OCMF(this).TryToParseOCMFDocuments(
13427
+ values,
13428
+ publicKeys.length > 0 ? publicKeys : void 0,
13429
+ "hex"
13430
+ );
13431
+ if (!IsAChargeTransparencyRecord(ctr))
13432
+ return void 0;
13433
+ const verifiedCTR = await this.processChargeTransparencyRecord(ctr);
13434
+ return IsAChargeTransparencyRecord(verifiedCTR) ? verifiedCTR : void 0;
13435
+ }
13436
+ //#endregion
13437
+ //#region (private) collectLiveLinkMeterValueKeys(LiveLink)
13438
+ // Every public key of the document that is allowed to sign meter values.
13439
+ // A charging session is regularly signed by more than one of them: the
13440
+ // meter signs its start and end values, the operator the intermediate ones.
13441
+ collectLiveLinkMeterValueKeys(LiveLink) {
13442
+ const publicKeys = new Array();
13443
+ const collectFrom = (candidates) => {
13444
+ if (!Array.isArray(candidates))
13445
+ return;
13446
+ for (const candidate of candidates) {
13447
+ const entry = asJSONObject(candidate);
13448
+ const value = asString(entry?.["value"]);
13449
+ const keyUsage = entry?.["keyUsage"];
13450
+ const encodings = entry?.["encodings"];
13451
+ if (value === void 0 || value === "")
13452
+ continue;
13453
+ if (Array.isArray(encodings) && encodings[encodings.length - 1] !== "hex")
13454
+ continue;
13455
+ if (Array.isArray(keyUsage) && !keyUsage.some((usage) => usage === "signMeterValues" || usage === "signEnergyMeterValues"))
13456
+ continue;
13457
+ publicKeys.push(value);
13458
+ }
13459
+ };
13460
+ const chargingStation = asJSONObject(LiveLink["chargingStation"]);
13461
+ const evse = asJSONObject(chargingStation?.["EVSE"]);
13462
+ collectFrom(asJSONObject(LiveLink["chargingStationOperator"])?.["publicKeys"]);
13463
+ collectFrom(asJSONObject(evse?.["energyMeter"])?.["publicKeys"]);
13464
+ return publicKeys;
13465
+ }
13466
+ //#endregion
13377
13467
  //#region (private) processChargeTransparencyRecord(CTR)
13378
13468
  async processChargeTransparencyRecord(CTR) {
13379
13469
  if (!IsAChargeTransparencyRecord(CTR))