@volontariapp/domain-event 3.4.0-snap-8e8a8e3 → 3.4.0-snap-d42e2cf

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.
@@ -0,0 +1,3 @@
1
+ export * from './geocoding.service.js';
2
+ export * from './strategy/index.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/geocoding/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from './geocoding.service.js';
2
+ export * from './strategy/index.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/services/geocoding/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export * from './geocoding-strategy.interface.js';
2
+ export * from './google-maps.strategy.js';
3
+ export * from './open-street-map.strategy.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/services/geocoding/strategy/index.ts"],"names":[],"mappings":"AAAA,cAAc,mCAAmC,CAAC;AAClD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,+BAA+B,CAAC"}
@@ -0,0 +1,4 @@
1
+ export * from './geocoding-strategy.interface.js';
2
+ export * from './google-maps.strategy.js';
3
+ export * from './open-street-map.strategy.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/services/geocoding/strategy/index.ts"],"names":[],"mappings":"AAAA,cAAc,mCAAmC,CAAC;AAClD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,+BAA+B,CAAC"}
@@ -6,12 +6,14 @@ export interface NominatimResult {
6
6
  }
7
7
  export declare class OpenStreetMapStrategy implements IGeocodingStrategy {
8
8
  private readonly userAgent;
9
+ private readonly skipInTestEnv;
9
10
  private readonly logger;
10
11
  private readonly baseUrl;
11
12
  private static rateLimitPromise;
12
13
  private readonly rateLimitMs;
13
- constructor(userAgent: string);
14
+ constructor(userAgent: string, skipInTestEnv?: boolean);
14
15
  private delayIfNeeded;
16
+ private static cache;
15
17
  geocode(request: GeocodeRequest): Promise<GeocodeResponse | null>;
16
18
  }
17
19
  //# sourceMappingURL=open-street-map.strategy.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"open-street-map.strategy.d.ts","sourceRoot":"","sources":["../../../../src/services/geocoding/strategy/open-street-map.strategy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAClB,cAAc,EACd,eAAe,EAChB,MAAM,mCAAmC,CAAC;AAI3C,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,qBAAa,qBAAsB,YAAW,kBAAkB;IAOlD,OAAO,CAAC,QAAQ,CAAC,SAAS;IANtC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuD;IAC9E,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgD;IAExE,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAoC;IACnE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAQ;gBAEP,SAAS,EAAE,MAAM;YAMhC,aAAa;IAQrB,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;CA6CxE"}
1
+ {"version":3,"file":"open-street-map.strategy.d.ts","sourceRoot":"","sources":["../../../../src/services/geocoding/strategy/open-street-map.strategy.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,kBAAkB,EAClB,cAAc,EACd,eAAe,EAChB,MAAM,mCAAmC,CAAC;AAI3C,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,qBAAa,qBAAsB,YAAW,kBAAkB;IAQ5D,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,aAAa;IARhC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuD;IAC9E,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgD;IAExE,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAoC;IACnE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAQ;gBAGjB,SAAS,EAAE,MAAM,EACjB,aAAa,GAAE,OAAe;YAOnC,aAAa;IAQ3B,OAAO,CAAC,MAAM,CAAC,KAAK,CAA6C;IAE3D,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;CAiDxE"}
@@ -1,13 +1,16 @@
1
+ import axios from 'axios';
1
2
  import { Logger } from '@volontariapp/logger';
2
3
  import { GEOCODING_FAILED } from '@volontariapp/errors-nest';
3
4
  export class OpenStreetMapStrategy {
4
5
  userAgent;
6
+ skipInTestEnv;
5
7
  logger = new Logger({ context: OpenStreetMapStrategy.name });
6
8
  baseUrl = 'https://nominatim.openstreetmap.org/search';
7
9
  static rateLimitPromise = Promise.resolve();
8
10
  rateLimitMs = 1100;
9
- constructor(userAgent) {
11
+ constructor(userAgent, skipInTestEnv = false) {
10
12
  this.userAgent = userAgent;
13
+ this.skipInTestEnv = skipInTestEnv;
11
14
  if (!this.userAgent) {
12
15
  throw new Error('OpenStreetMapStrategy requires a valid userAgent.');
13
16
  }
@@ -19,39 +22,45 @@ export class OpenStreetMapStrategy {
19
22
  OpenStreetMapStrategy.rateLimitPromise = nextPromise.catch(() => { });
20
23
  await nextPromise;
21
24
  }
25
+ static cache = new Map();
22
26
  async geocode(request) {
27
+ if (this.skipInTestEnv) {
28
+ return { lat: 48.8566, lng: 2.3522 };
29
+ }
23
30
  try {
31
+ if (OpenStreetMapStrategy.cache.has(request.address)) {
32
+ return OpenStreetMapStrategy.cache.get(request.address);
33
+ }
24
34
  await this.delayIfNeeded();
25
- const url = new URL(this.baseUrl);
26
- url.searchParams.append('q', request.address);
27
- url.searchParams.append('format', 'json');
28
- url.searchParams.append('limit', '1');
29
- const controller = new AbortController();
30
- const timeoutId = setTimeout(() => {
31
- controller.abort();
32
- }, 5000);
33
- const response = await fetch(url.toString(), {
35
+ const response = await axios.get(this.baseUrl, {
36
+ params: {
37
+ q: request.address,
38
+ format: 'json',
39
+ limit: '1',
40
+ },
34
41
  headers: {
35
42
  'User-Agent': this.userAgent,
36
43
  },
37
- signal: controller.signal,
44
+ timeout: 5000,
38
45
  });
39
- clearTimeout(timeoutId);
40
- if (!response.ok) {
41
- this.logger.error('OSM API responded with status:', String(response.status));
42
- throw GEOCODING_FAILED('OSM', response.status);
43
- }
44
- const data = (await response.json());
46
+ const data = response.data;
45
47
  if (data.length > 0) {
46
48
  const { lat, lon } = data[0];
47
- return {
49
+ const result = {
48
50
  lat: parseFloat(lat),
49
51
  lng: parseFloat(lon),
50
52
  };
53
+ OpenStreetMapStrategy.cache.set(request.address, result);
54
+ return result;
51
55
  }
56
+ OpenStreetMapStrategy.cache.set(request.address, null);
52
57
  return null;
53
58
  }
54
59
  catch (error) {
60
+ if (axios.isAxiosError(error) && error.response) {
61
+ this.logger.error('OSM API responded with status:', String(error.response.status));
62
+ throw GEOCODING_FAILED('OSM', error.response.status);
63
+ }
55
64
  if (error instanceof Error && error.name === 'BadRequestError')
56
65
  throw error;
57
66
  const err = error;
@@ -1 +1 @@
1
- {"version":3,"file":"open-street-map.strategy.js","sourceRoot":"","sources":["../../../../src/services/geocoding/strategy/open-street-map.strategy.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"open-street-map.strategy.js","sourceRoot":"","sources":["../../../../src/services/geocoding/strategy/open-street-map.strategy.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  export * from './event.service.js';
2
2
  export * from './tag.service.js';
3
3
  export * from './requirement.service.js';
4
+ export * from './geocoding/index.js';
4
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,0BAA0B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC"}
@@ -1,4 +1,5 @@
1
1
  export * from './event.service.js';
2
2
  export * from './tag.service.js';
3
3
  export * from './requirement.service.js';
4
+ export * from './geocoding/index.js';
4
5
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,0BAA0B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=open-street-map.strategy.unit.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"open-street-map.strategy.unit.spec.d.ts","sourceRoot":"","sources":["../../../../../../src/test/unit/services/geocoding/strategy/open-street-map.strategy.unit.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,72 @@
1
+ import { jest, expect, describe, it, beforeEach, afterEach } from '@jest/globals';
2
+ import axios from 'axios';
3
+ import { OpenStreetMapStrategy } from '../../../../../services/geocoding/strategy/open-street-map.strategy.js';
4
+ describe('OpenStreetMapStrategy', () => {
5
+ let strategy;
6
+ beforeEach(() => {
7
+ strategy = new OpenStreetMapStrategy('TestUserAgent/1.0', false);
8
+ });
9
+ afterEach(() => {
10
+ jest.restoreAllMocks();
11
+ jest.useRealTimers();
12
+ });
13
+ it('should rate limit 10 requests to ~1.1s each sequentially', async () => {
14
+ jest.useFakeTimers();
15
+ let activeRequests = 0;
16
+ const axiosSpy = jest
17
+ .spyOn(axios, 'get')
18
+ .mockImplementation(async () => {
19
+ await Promise.resolve();
20
+ activeRequests++;
21
+ return {
22
+ data: [{ lat: '48.8566', lon: '2.3522' }],
23
+ status: 200,
24
+ statusText: 'OK',
25
+ headers: {},
26
+ config: { headers: new axios.AxiosHeaders() },
27
+ };
28
+ });
29
+ const promises = Array.from({ length: 10 }).map((_, i) => strategy.geocode({ address: `Address ${String(i)}` }));
30
+ await Promise.resolve();
31
+ expect(activeRequests).toBe(0);
32
+ for (let i = 1; i <= 10; i++) {
33
+ jest.advanceTimersByTime(1100);
34
+ for (let j = 0; j < 5; j++) {
35
+ await Promise.resolve();
36
+ }
37
+ expect(activeRequests).toBe(i);
38
+ }
39
+ const results = await Promise.all(promises);
40
+ expect(axiosSpy).toHaveBeenCalledTimes(10);
41
+ expect(results).toHaveLength(10);
42
+ results.forEach((result) => {
43
+ expect(result).toEqual({ lat: 48.8566, lng: 2.3522 });
44
+ });
45
+ });
46
+ it('should hit the cache instantly for the same address', async () => {
47
+ jest.useFakeTimers();
48
+ const axiosSpy = jest
49
+ .spyOn(axios, 'get')
50
+ .mockImplementation(async () => {
51
+ await Promise.resolve();
52
+ return {
53
+ data: [{ lat: '48.8566', lon: '2.3522' }],
54
+ status: 200,
55
+ statusText: 'OK',
56
+ headers: {},
57
+ config: { headers: new axios.AxiosHeaders() },
58
+ };
59
+ });
60
+ const promise1 = strategy.geocode({ address: 'Cached Address' });
61
+ await Promise.resolve();
62
+ jest.advanceTimersByTime(1100);
63
+ for (let j = 0; j < 5; j++) {
64
+ await Promise.resolve();
65
+ }
66
+ const res1 = await promise1;
67
+ const res2 = await strategy.geocode({ address: 'Cached Address' });
68
+ expect(axiosSpy).toHaveBeenCalledTimes(1);
69
+ expect(res1).toEqual(res2);
70
+ });
71
+ });
72
+ //# sourceMappingURL=open-street-map.strategy.unit.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"open-street-map.strategy.unit.spec.js","sourceRoot":"","sources":["../../../../../../src/test/unit/services/geocoding/strategy/open-street-map.strategy.unit.spec.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@volontariapp/domain-event",
3
- "version": "3.4.0-snap-8e8a8e3",
3
+ "version": "3.4.0-snap-d42e2cf",
4
4
  "publishConfig": {
5
5
  "access": "public",
6
6
  "provenance": true
@@ -56,13 +56,13 @@
56
56
  "dependencies": {
57
57
  "@nestjs/common": "^11.0.1",
58
58
  "@volontariapp/contracts": "4.0.14",
59
- "@volontariapp/database": "3.3.1-snap-8e8a8e3",
59
+ "@volontariapp/database": "3.3.1-snap-d42e2cf",
60
60
  "@volontariapp/errors": "0.6.0",
61
- "@volontariapp/errors-nest": "0.13.0-snap-8e8a8e3",
61
+ "@volontariapp/errors-nest": "0.13.0-snap-d42e2cf",
62
62
  "@volontariapp/logger": "0.2.5",
63
- "@volontariapp/messaging": "2.7.0-snap-8e8a8e3",
64
- "@volontariapp/outbox": "0.9.19-snap-8e8a8e3",
65
- "@volontariapp/shared": "0.6.1-snap-8e8a8e3",
63
+ "@volontariapp/messaging": "2.7.0-snap-d42e2cf",
64
+ "@volontariapp/outbox": "0.9.19-snap-d42e2cf",
65
+ "@volontariapp/shared": "0.6.1-snap-d42e2cf",
66
66
  "class-transformer": "^0.5.1"
67
67
  }
68
68
  }