digipinjs
Version:
A comprehensive TypeScript library for encoding and decoding Indian geographic coordinates into DIGIPIN format (Indian Postal Digital PIN system). Features CLI tools, caching, batch processing, and Express middleware for seamless integration.
62 lines (61 loc) • 1.99 kB
JavaScript
import { getLatLngFromDigiPin } from './core';
import { normalizeDigiPin } from './util';
let registeredResolver;
function isPromise(value) {
return (!!value &&
typeof value === 'object' &&
typeof value.then === 'function');
}
export function setReverseGeocodeResolver(resolver) {
registeredResolver = resolver;
}
export function clearReverseGeocodeResolver() {
registeredResolver = undefined;
}
function buildFallbackResult(pin) {
const coords = getLatLngFromDigiPin(pin);
return {
pin,
latitude: coords.latitude,
longitude: coords.longitude,
};
}
export function reverseGeocode(pin, options = {}) {
const normalized = normalizeDigiPin(pin);
const resolver = options.resolver ?? registeredResolver;
const fallbackToDecode = options.fallbackToDecode ?? true;
if (resolver) {
const result = resolver(normalized);
if (isPromise(result)) {
throw new TypeError('Reverse geocode resolver returned a Promise. Use reverseGeocodeAsync instead.');
}
if (result) {
return result;
}
}
if (!fallbackToDecode) {
throw new Error('No reverse geocode result available for the provided DIGIPIN');
}
return buildFallbackResult(normalized);
}
export async function reverseGeocodeAsync(pin, options = {}) {
const normalized = normalizeDigiPin(pin);
const resolver = options.resolver ?? registeredResolver;
const fallbackToDecode = options.fallbackToDecode ?? true;
if (resolver) {
const result = resolver(normalized);
if (isPromise(result)) {
const resolved = await result;
if (resolved) {
return resolved;
}
}
else if (result) {
return result;
}
}
if (!fallbackToDecode) {
throw new Error('No reverse geocode result available for the provided DIGIPIN');
}
return buildFallbackResult(normalized);
}