NODEDC_PLATFORM/packages/external-provider-contract/providers/gelios/v3/package.mjs

186 lines
5.7 KiB
JavaScript

import { geliosProviderPackageV1 } from "../v1/package.mjs";
export const GELIOS_PROVIDER_PACKAGE_ID = "gelios.provider.v3";
export const GELIOS_PROVIDER_PACKAGE_VERSION = "3.0.0";
export const GELIOS_POSITIONS_DATA_PRODUCT_ID = "fleet.positions.current.v2";
export const GELIOS_POSITIONS_DATA_PRODUCT_VERSION = "2.0.0";
export const GELIOS_POSITIONS_ONTOLOGY_REVISION = "ontology.map.moving_object.v2";
export const GELIOS_UNIT_SOURCE_ID_PREFIX = "gelios-unit-";
const FIELD_POLICY_ID = "gelios.positions.current.fields.v2";
const AUTH_MODE_ID = "gelios.rest-rotating-bearer.v3";
const REALTIME_PROFILE_ID = "gelios.positions.current.realtime.v3";
const MANUAL_PROFILE_ID = "gelios.positions.current.manual.v3";
const MAPPING_ID = "gelios.units.to.fleet.positions.current.v3";
const TEMPLATE_ID = "gelios.positions.current.l2.v3";
const STATE_POLICY_VERSION = "map-moving-object-state/v1";
const targetFields = Object.freeze([
"availability_state",
"course_degrees",
"display_name",
"elevation_meters",
"freshness_state",
"geometry",
"hdop",
"horizontal_accuracy_meters",
"motion_state",
"object_kind",
"operational_status",
"position_source",
"position_state",
"position_valid",
"quality_flags",
"satellite_count",
"speed_kph",
"state_policy_version",
]);
const value = structuredClone(geliosProviderPackageV1);
value.id = GELIOS_PROVIDER_PACKAGE_ID;
value.version = GELIOS_PROVIDER_PACKAGE_VERSION;
value.manifest = {
...value.manifest,
id: "gelios.provider.manifest.v3",
version: GELIOS_PROVIDER_PACKAGE_VERSION,
authModeIds: [AUTH_MODE_ID],
fieldPolicyIds: [FIELD_POLICY_ID],
collectionProfileIds: [REALTIME_PROFILE_ID, MANUAL_PROFILE_ID],
dataProductIds: [GELIOS_POSITIONS_DATA_PRODUCT_ID],
mappingContractIds: [MAPPING_ID],
l2TemplateIds: [TEMPLATE_ID],
};
value.authModes = [{
...value.authModes[0],
id: AUTH_MODE_ID,
tokenLifecycle: {
artifacts: ["access", "refresh"],
requestArtifact: "access",
refreshMode: "runtime_managed",
},
}];
value.capabilities = [{
...value.capabilities[0],
authModeId: AUTH_MODE_ID,
}];
value.fieldPolicies = [{
...value.fieldPolicies[0],
id: FIELD_POLICY_ID,
version: GELIOS_POSITIONS_DATA_PRODUCT_VERSION,
dataProductId: GELIOS_POSITIONS_DATA_PRODUCT_ID,
targetFields: [...targetFields],
}];
value.collectionProfiles = value.collectionProfiles.map((profile, index) => ({
...profile,
id: index === 0 ? REALTIME_PROFILE_ID : MANUAL_PROFILE_ID,
version: GELIOS_PROVIDER_PACKAGE_VERSION,
dataProductId: GELIOS_POSITIONS_DATA_PRODUCT_ID,
mappingContractId: MAPPING_ID,
fieldPolicyId: FIELD_POLICY_ID,
l2TemplateId: TEMPLATE_ID,
}));
value.dataProducts = [{
id: GELIOS_POSITIONS_DATA_PRODUCT_ID,
version: GELIOS_POSITIONS_DATA_PRODUCT_VERSION,
ontologyRevision: GELIOS_POSITIONS_ONTOLOGY_REVISION,
deliveryMode: "snapshot+patch",
semanticTypes: ["map.moving_object"],
fields: [...targetFields],
history: {
mode: "sampled",
intervalMs: 60000,
strategy: "latest-per-entity-per-bucket",
retentionDays: 90,
},
}];
value.mappingContracts = [{
...value.mappingContracts[0],
id: MAPPING_ID,
version: GELIOS_PROVIDER_PACKAGE_VERSION,
fieldPolicyId: FIELD_POLICY_ID,
target: {
...value.mappingContracts[0].target,
dataProductId: GELIOS_POSITIONS_DATA_PRODUCT_ID,
version: GELIOS_POSITIONS_DATA_PRODUCT_VERSION,
ontologyRevision: GELIOS_POSITIONS_ONTOLOGY_REVISION,
},
derivations: {
...value.mappingContracts[0].derivations,
availability_state: {
kind: "ordered_rules",
rules: [
"observed_age_gt_limit.offline",
"otherwise.online",
],
default: "unknown",
parameters: { staleAfterMs: 60000 },
},
freshness_state: {
kind: "ordered_rules",
rules: [
"observed_age_gt_limit.stale",
"otherwise.fresh",
],
default: "stale",
parameters: { staleAfterMs: 60000 },
},
motion_state: {
kind: "ordered_rules",
rules: [
"speed_kph_gte_threshold.moving",
"speed_kph_lt_threshold.stationary",
"otherwise.unknown",
],
default: "unknown",
parameters: { movingThresholdKph: 1 },
},
position_state: {
kind: "ordered_rules",
rules: [
"position_invalid.missing",
"position_quality_below_threshold.low_quality",
"otherwise.valid",
],
default: "missing",
parameters: {
minSatelliteCount: 4,
maxHdop: 5,
maxHorizontalAccuracyMeters: 100,
},
},
},
fact: {
...value.mappingContracts[0].fact,
attributes: {
...value.mappingContracts[0].fact.attributes,
availability_state: { derive: "availability_state" },
freshness_state: { derive: "freshness_state" },
motion_state: { derive: "motion_state" },
position_state: { derive: "position_state" },
state_policy_version: { constant: STATE_POLICY_VERSION },
},
},
}];
value.l2Templates = [{
...value.l2Templates[0],
id: TEMPLATE_ID,
version: GELIOS_PROVIDER_PACKAGE_VERSION,
credentialBindings: value.l2Templates[0].credentialBindings.map((binding) => (
binding.role === "provider" ? { ...binding, authModeId: AUTH_MODE_ID } : binding
)),
steps: value.l2Templates[0].steps.map((step) => {
if (step.kind === "semantic_mapping") return { ...step, mappingContractId: MAPPING_ID };
if (step.kind === "data_product_publish") return { ...step, dataProductId: GELIOS_POSITIONS_DATA_PRODUCT_ID };
return step;
}),
}];
export const geliosProviderPackageV3 = deepFreeze(value);
function deepFreeze(input) {
if (!input || typeof input !== "object" || Object.isFrozen(input)) return input;
Object.freeze(input);
for (const child of Object.values(input)) deepFreeze(child);
return input;
}