186 lines
5.7 KiB
JavaScript
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;
|
|
}
|