import type {
LocationProofPlugin,
Runtime,
CollectOptions,
RawSignals,
UnsignedLocationStamp,
LocationStamp,
StampSigner,
StampVerificationResult
} from '@decentralized-geo/astral-sdk';
export class MyLocationPlugin implements LocationProofPlugin {
readonly name = 'my-location-service';
readonly version = '0.1.0';
readonly runtimes: Runtime[] = ['node', 'browser'];
readonly requiredCapabilities: string[] = [];
readonly description = 'Location proofs from My Location Service';
constructor(private config: { apiUrl: string; apiKey: string }) {}
async collect(options?: CollectOptions): Promise<RawSignals> {
const response = await fetch(`${this.config.apiUrl}/evidence`, {
headers: { Authorization: `Bearer ${this.config.apiKey}` }
});
const data = await response.json();
return {
plugin: this.name,
timestamp: Math.floor(Date.now() / 1000),
data
};
}
async create(signals: RawSignals): Promise<UnsignedLocationStamp> {
return {
lpVersion: '0.2',
locationType: 'geojson-point',
location: {
type: 'Point',
coordinates: [signals.data.longitude, signals.data.latitude]
},
srs: 'EPSG:4326',
temporalFootprint: {
start: signals.timestamp,
end: signals.timestamp + 60
},
plugin: this.name,
pluginVersion: this.version,
signals: signals.data
};
}
async verify(stamp: LocationStamp): Promise<StampVerificationResult> {
const structureValid =
stamp.lpVersion === '0.2' &&
stamp.plugin === this.name &&
stamp.location != null &&
stamp.temporalFootprint != null;
const signaturesValid =
stamp.signatures.length > 0 &&
stamp.signatures.every(s => s.value && s.signer);
// Add your own signal consistency checks
const signalsConsistent = validateMySignals(stamp.signals);
return {
valid: structureValid && signaturesValid && signalsConsistent,
structureValid,
signaturesValid,
signalsConsistent,
details: {}
};
}
}