@volontariapp/domain-event 3.4.0-snap-d9ec8fe → 3.4.0-snap-a55d5a4

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.
@@ -1,9 +1,11 @@
1
1
  import type { IGeocodingStrategy, GeocodeRequest, GeocodeResponse } from './geocoding-strategy.interface.js';
2
2
  export declare class GoogleMapsStrategy implements IGeocodingStrategy {
3
3
  private readonly apiKey;
4
+ private readonly skipInTestEnv;
4
5
  private readonly logger;
5
6
  private readonly baseUrl;
6
- constructor(apiKey: string);
7
+ private static cache;
8
+ constructor(apiKey: string, skipInTestEnv?: boolean);
7
9
  geocode(request: GeocodeRequest): Promise<GeocodeResponse | null>;
8
10
  }
9
11
  //# sourceMappingURL=google-maps.strategy.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"google-maps.strategy.d.ts","sourceRoot":"","sources":["../../../../src/services/geocoding/strategy/google-maps.strategy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAClB,cAAc,EACd,eAAe,EAChB,MAAM,mCAAmC,CAAC;AAI3C,qBAAa,kBAAmB,YAAW,kBAAkB;IAI/C,OAAO,CAAC,QAAQ,CAAC,MAAM;IAHnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoD;IAC3E,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuD;gBAElD,MAAM,EAAE,MAAM;IAMrC,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;CAuCxE"}
1
+ {"version":3,"file":"google-maps.strategy.d.ts","sourceRoot":"","sources":["../../../../src/services/geocoding/strategy/google-maps.strategy.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,kBAAkB,EAClB,cAAc,EACd,eAAe,EAChB,MAAM,mCAAmC,CAAC;AAI3C,qBAAa,kBAAmB,YAAW,kBAAkB;IAMzD,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,aAAa;IANhC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoD;IAC3E,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuD;IAC/E,OAAO,CAAC,MAAM,CAAC,KAAK,CAA6C;gBAG9C,MAAM,EAAE,MAAM,EACd,aAAa,GAAE,OAAe;IAO3C,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;CAqDxE"}
@@ -1,33 +1,49 @@
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 GoogleMapsStrategy {
4
5
  apiKey;
6
+ skipInTestEnv;
5
7
  logger = new Logger({ context: GoogleMapsStrategy.name });
6
8
  baseUrl = 'https://maps.googleapis.com/maps/api/geocode/json';
7
- constructor(apiKey) {
9
+ static cache = new Map();
10
+ constructor(apiKey, skipInTestEnv = false) {
8
11
  this.apiKey = apiKey;
12
+ this.skipInTestEnv = skipInTestEnv;
9
13
  if (!this.apiKey) {
10
14
  throw new Error('GoogleMapsStrategy requires a valid API key.');
11
15
  }
12
16
  }
13
17
  async geocode(request) {
18
+ if (this.skipInTestEnv) {
19
+ return { lat: 48.8566, lng: 2.3522 };
20
+ }
14
21
  try {
15
- const url = new URL(this.baseUrl);
16
- url.searchParams.append('address', request.address);
17
- url.searchParams.append('key', this.apiKey);
18
- const response = await fetch(url.toString());
19
- if (!response.ok) {
20
- this.logger.error(`Google Maps API responded with status: ${String(response.status)}`);
21
- throw GEOCODING_FAILED('Google Maps', response.status);
22
+ if (GoogleMapsStrategy.cache.has(request.address)) {
23
+ return GoogleMapsStrategy.cache.get(request.address);
22
24
  }
23
- const data = (await response.json());
25
+ const response = await axios.get(this.baseUrl, {
26
+ params: {
27
+ address: request.address,
28
+ key: this.apiKey,
29
+ },
30
+ timeout: 5000,
31
+ });
32
+ const data = response.data;
24
33
  if (data.status === 'OK' && data.results.length > 0) {
25
34
  const { lat, lng } = data.results[0].geometry.location;
26
- return { lat, lng };
35
+ const result = { lat, lng };
36
+ GoogleMapsStrategy.cache.set(request.address, result);
37
+ return result;
27
38
  }
39
+ GoogleMapsStrategy.cache.set(request.address, null);
28
40
  return null;
29
41
  }
30
42
  catch (error) {
43
+ if (axios.isAxiosError(error) && error.response) {
44
+ this.logger.error(`Google Maps API responded with status: ${String(error.response.status)}`);
45
+ throw GEOCODING_FAILED('Google Maps', error.response.status);
46
+ }
31
47
  if (error instanceof Error && error.name === 'BadRequestError')
32
48
  throw error;
33
49
  const err = error;
@@ -1 +1 @@
1
- {"version":3,"file":"google-maps.strategy.js","sourceRoot":"","sources":["../../../../src/services/geocoding/strategy/google-maps.strategy.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAE7D,MAAM,OAAO,kBAAkB;IAIA;IAHZ,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,OAAO,EAAE,kBAAkB,CAAC,IAAI,EAAE,CAAC,CAAC;IAC1D,OAAO,GAAG,mDAAmD,CAAC;IAE/E,YAA6B,MAAc;QAAd,WAAM,GAAN,MAAM,CAAQ;QACzC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAAuB;QACnC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAClC,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;YACpD,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YAE5C,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;YAE7C,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,0CAA0C,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBACvF,MAAM,gBAAgB,CAAC,aAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;YACzD,CAAC;YAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAUlC,CAAC;YAEF,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACpD,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBACvD,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;YACtB,CAAC;YAED,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,iBAAiB;gBAAE,MAAM,KAAK,CAAC;YAE5E,MAAM,GAAG,GAAG,KAAc,CAAC;YAC3B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,8BAA8B,EAAE,GAAG,CAAC,CAAC;YACvD,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"google-maps.strategy.js","sourceRoot":"","sources":["../../../../src/services/geocoding/strategy/google-maps.strategy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAM1B,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAE7D,MAAM,OAAO,kBAAkB;IAMV;IACA;IANF,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,OAAO,EAAE,kBAAkB,CAAC,IAAI,EAAE,CAAC,CAAC;IAC1D,OAAO,GAAG,mDAAmD,CAAC;IACvE,MAAM,CAAC,KAAK,GAAG,IAAI,GAAG,EAAkC,CAAC;IAEjE,YACmB,MAAc,EACd,gBAAyB,KAAK;QAD9B,WAAM,GAAN,MAAM,CAAQ;QACd,kBAAa,GAAb,aAAa,CAAiB;QAE/C,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAAuB;QACnC,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC;QACvC,CAAC;QAED,IAAI,CAAC;YACH,IAAI,kBAAkB,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBAClD,OAAO,kBAAkB,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAA2B,CAAC;YACjF,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE;gBAC7C,MAAM,EAAE;oBACN,OAAO,EAAE,OAAO,CAAC,OAAO;oBACxB,GAAG,EAAE,IAAI,CAAC,MAAM;iBACjB;gBACD,OAAO,EAAE,IAAI;aACd,CAAC,CAAC;YAEH,MAAM,IAAI,GAAG,QAAQ,CAAC,IAUrB,CAAC;YAEF,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACpD,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBACvD,MAAM,MAAM,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;gBAC5B,kBAAkB,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;gBACtD,OAAO,MAAM,CAAC;YAChB,CAAC;YAED,kBAAkB,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YACpD,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;gBAChD,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,0CAA0C,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAC1E,CAAC;gBACF,MAAM,gBAAgB,CAAC,aAAa,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAC/D,CAAC;YACD,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,iBAAiB;gBAAE,MAAM,KAAK,CAAC;YAE5E,MAAM,GAAG,GAAG,KAAc,CAAC;YAC3B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,8BAA8B,EAAE,GAAG,CAAC,CAAC;YACvD,OAAO,IAAI,CAAC;QACd,CAAC;IACH,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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"}
@@ -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":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAClF,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,qBAAqB,EAAE,MAAM,wEAAwE,CAAC;AAE/G,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,IAAI,QAA+B,CAAC;IAEpC,UAAU,CAAC,GAAG,EAAE;QACd,QAAQ,GAAG,IAAI,qBAAqB,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QACxE,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,IAAI,cAAc,GAAG,CAAC,CAAC;QAEvB,MAAM,QAAQ,GAAG,IAAI;aAClB,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC;aACnB,kBAAkB,CAAC,KAAK,IAA4B,EAAE;YACrD,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;YACxB,cAAc,EAAE,CAAC;YACjB,OAAO;gBACL,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;gBACzC,MAAM,EAAE,GAAG;gBACX,UAAU,EAAE,IAAI;gBAChB,OAAO,EAAE,EAAE;gBACX,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,KAAK,CAAC,YAAY,EAAE,EAAgC;aAC3D,CAAC;QACrB,CAAC,CAAC,CAAC;QAEL,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACvD,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,WAAW,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CACtD,CAAC;QAEF,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QAExB,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAE/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7B,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;YAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC3B,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;YAC1B,CAAC;YACD,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjC,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAE5C,MAAM,CAAC,QAAQ,CAAC,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC;QAC3C,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QACjC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;YACzB,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACnE,IAAI,CAAC,aAAa,EAAE,CAAC;QAErB,MAAM,QAAQ,GAAG,IAAI;aAClB,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC;aACnB,kBAAkB,CAAC,KAAK,IAA4B,EAAE;YACrD,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;YACxB,OAAO;gBACL,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;gBACzC,MAAM,EAAE,GAAG;gBACX,UAAU,EAAE,IAAI;gBAChB,OAAO,EAAE,EAAE;gBACX,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,KAAK,CAAC,YAAY,EAAE,EAAgC;aAC3D,CAAC;QACrB,CAAC,CAAC,CAAC;QAEL,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC,CAAC;QAEjE,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;QAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QAC1B,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC;QAC5B,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC,CAAC;QAEnE,MAAM,CAAC,QAAQ,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAC1C,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@volontariapp/domain-event",
3
- "version": "3.4.0-snap-d9ec8fe",
3
+ "version": "3.4.0-snap-a55d5a4",
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-d9ec8fe",
59
+ "@volontariapp/database": "3.3.1-snap-a55d5a4",
60
60
  "@volontariapp/errors": "0.6.0",
61
- "@volontariapp/errors-nest": "0.13.0-snap-d9ec8fe",
61
+ "@volontariapp/errors-nest": "0.13.0-snap-a55d5a4",
62
62
  "@volontariapp/logger": "0.2.5",
63
- "@volontariapp/messaging": "2.7.0-snap-d9ec8fe",
64
- "@volontariapp/outbox": "0.9.19-snap-d9ec8fe",
65
- "@volontariapp/shared": "0.6.1-snap-d9ec8fe",
63
+ "@volontariapp/messaging": "2.7.0-snap-a55d5a4",
64
+ "@volontariapp/outbox": "0.9.19-snap-a55d5a4",
65
+ "@volontariapp/shared": "0.6.1-snap-a55d5a4",
66
66
  "class-transformer": "^0.5.1"
67
67
  }
68
68
  }