@ecosplay/e-brocante 1.0.2

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.
Files changed (110) hide show
  1. package/AGENTS.md +141 -0
  2. package/CHANGELOG.md +76 -0
  3. package/LICENSE +64 -0
  4. package/README.md +246 -0
  5. package/dist/EBrocanteClient.d.ts +38 -0
  6. package/dist/EBrocanteClient.d.ts.map +1 -0
  7. package/dist/EBrocanteClient.js +99 -0
  8. package/dist/EBrocanteClient.js.map +1 -0
  9. package/dist/cache/CacheBackend.d.ts +20 -0
  10. package/dist/cache/CacheBackend.d.ts.map +1 -0
  11. package/dist/cache/CacheBackend.js +6 -0
  12. package/dist/cache/CacheBackend.js.map +1 -0
  13. package/dist/cache/LocalCache.d.ts +22 -0
  14. package/dist/cache/LocalCache.d.ts.map +1 -0
  15. package/dist/cache/LocalCache.js +53 -0
  16. package/dist/cache/LocalCache.js.map +1 -0
  17. package/dist/cache/NullCache.d.ts +17 -0
  18. package/dist/cache/NullCache.d.ts.map +1 -0
  19. package/dist/cache/NullCache.js +26 -0
  20. package/dist/cache/NullCache.js.map +1 -0
  21. package/dist/cache/RedisCache.d.ts +39 -0
  22. package/dist/cache/RedisCache.d.ts.map +1 -0
  23. package/dist/cache/RedisCache.js +104 -0
  24. package/dist/cache/RedisCache.js.map +1 -0
  25. package/dist/cache/RedisConfig.d.ts +17 -0
  26. package/dist/cache/RedisConfig.d.ts.map +1 -0
  27. package/dist/cache/RedisConfig.js +13 -0
  28. package/dist/cache/RedisConfig.js.map +1 -0
  29. package/dist/cache/stableHashKey.d.ts +11 -0
  30. package/dist/cache/stableHashKey.d.ts.map +1 -0
  31. package/dist/cache/stableHashKey.js +27 -0
  32. package/dist/cache/stableHashKey.js.map +1 -0
  33. package/dist/exceptions/index.d.ts +41 -0
  34. package/dist/exceptions/index.d.ts.map +1 -0
  35. package/dist/exceptions/index.js +62 -0
  36. package/dist/exceptions/index.js.map +1 -0
  37. package/dist/http/HttpClient.d.ts +41 -0
  38. package/dist/http/HttpClient.d.ts.map +1 -0
  39. package/dist/http/HttpClient.js +222 -0
  40. package/dist/http/HttpClient.js.map +1 -0
  41. package/dist/index.d.ts +22 -0
  42. package/dist/index.d.ts.map +1 -0
  43. package/dist/index.js +17 -0
  44. package/dist/index.js.map +1 -0
  45. package/dist/internal/safeStrings.d.ts +52 -0
  46. package/dist/internal/safeStrings.d.ts.map +1 -0
  47. package/dist/internal/safeStrings.js +156 -0
  48. package/dist/internal/safeStrings.js.map +1 -0
  49. package/dist/logger/DebugWriter.d.ts +24 -0
  50. package/dist/logger/DebugWriter.d.ts.map +1 -0
  51. package/dist/logger/DebugWriter.js +62 -0
  52. package/dist/logger/DebugWriter.js.map +1 -0
  53. package/dist/logger/FileLogger.d.ts +26 -0
  54. package/dist/logger/FileLogger.d.ts.map +1 -0
  55. package/dist/logger/FileLogger.js +96 -0
  56. package/dist/logger/FileLogger.js.map +1 -0
  57. package/dist/logger/Logger.d.ts +12 -0
  58. package/dist/logger/Logger.d.ts.map +1 -0
  59. package/dist/logger/Logger.js +6 -0
  60. package/dist/logger/Logger.js.map +1 -0
  61. package/dist/logger/NullLogger.d.ts +13 -0
  62. package/dist/logger/NullLogger.d.ts.map +1 -0
  63. package/dist/logger/NullLogger.js +20 -0
  64. package/dist/logger/NullLogger.js.map +1 -0
  65. package/dist/models/Event.d.ts +37 -0
  66. package/dist/models/Event.d.ts.map +1 -0
  67. package/dist/models/Event.js +42 -0
  68. package/dist/models/Event.js.map +1 -0
  69. package/dist/models/Orga.d.ts +33 -0
  70. package/dist/models/Orga.d.ts.map +1 -0
  71. package/dist/models/Orga.js +39 -0
  72. package/dist/models/Orga.js.map +1 -0
  73. package/dist/models/PaginatedResult.d.ts +27 -0
  74. package/dist/models/PaginatedResult.d.ts.map +1 -0
  75. package/dist/models/PaginatedResult.js +46 -0
  76. package/dist/models/PaginatedResult.js.map +1 -0
  77. package/dist/resources/EventsResource.d.ts +20 -0
  78. package/dist/resources/EventsResource.d.ts.map +1 -0
  79. package/dist/resources/EventsResource.js +46 -0
  80. package/dist/resources/EventsResource.js.map +1 -0
  81. package/dist/resources/OrgaResource.d.ts +20 -0
  82. package/dist/resources/OrgaResource.d.ts.map +1 -0
  83. package/dist/resources/OrgaResource.js +51 -0
  84. package/dist/resources/OrgaResource.js.map +1 -0
  85. package/dist/types.d.ts +81 -0
  86. package/dist/types.d.ts.map +1 -0
  87. package/dist/types.js +8 -0
  88. package/dist/types.js.map +1 -0
  89. package/package.json +72 -0
  90. package/src/EBrocanteClient.ts +110 -0
  91. package/src/cache/CacheBackend.ts +20 -0
  92. package/src/cache/LocalCache.ts +64 -0
  93. package/src/cache/NullCache.ts +32 -0
  94. package/src/cache/RedisCache.ts +123 -0
  95. package/src/cache/RedisConfig.ts +23 -0
  96. package/src/cache/stableHashKey.ts +28 -0
  97. package/src/exceptions/index.ts +75 -0
  98. package/src/http/HttpClient.ts +266 -0
  99. package/src/index.ts +42 -0
  100. package/src/internal/safeStrings.ts +154 -0
  101. package/src/logger/DebugWriter.ts +61 -0
  102. package/src/logger/FileLogger.ts +106 -0
  103. package/src/logger/Logger.ts +13 -0
  104. package/src/logger/NullLogger.ts +22 -0
  105. package/src/models/Event.ts +92 -0
  106. package/src/models/Orga.ts +76 -0
  107. package/src/models/PaginatedResult.ts +62 -0
  108. package/src/resources/EventsResource.ts +48 -0
  109. package/src/resources/OrgaResource.ts +53 -0
  110. package/src/types.ts +86 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EBrocanteClient.js","sourceRoot":"","sources":["../src/EBrocanteClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * @copyright 2026 Association E-Cosplay
3
+ * @license Proprietary — see LICENSE
4
+ */
5
+ /**
6
+ * Minimal cache interface used by the SDK. Implementations are local
7
+ * (in-memory), Redis, or a no-op when caching is disabled.
8
+ */
9
+ export interface CacheBackend {
10
+ get(key: string): Promise<unknown>;
11
+ set(key: string, value: unknown, ttlSeconds?: number): Promise<void>;
12
+ delete(key: string): Promise<void>;
13
+ purge(): Promise<void>;
14
+ /**
15
+ * Bulk purge keys matching a wildcard pattern (`*` at the end). Used
16
+ * by the public `client.cache.purgeKey()` shortcut.
17
+ */
18
+ purgeKey(endpoint: string, params?: Record<string, unknown>): Promise<void>;
19
+ }
20
+ //# sourceMappingURL=CacheBackend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CacheBackend.d.ts","sourceRoot":"","sources":["../../src/cache/CacheBackend.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;GAGG;AACH,MAAM,WAAW,YAAY;IACzB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACnC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrE,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB;;;OAGG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/E"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @copyright 2026 Association E-Cosplay
3
+ * @license Proprietary — see LICENSE
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=CacheBackend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CacheBackend.js","sourceRoot":"","sources":["../../src/cache/CacheBackend.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * @copyright 2026 Association E-Cosplay
3
+ * @license Proprietary — see LICENSE
4
+ */
5
+ import type { CacheBackend } from './CacheBackend.js';
6
+ /**
7
+ * In-memory cache backend. Lives for the duration of a single Node/Bun
8
+ * process. Suitable for short scripts and single-instance apps. For
9
+ * multi-process deployments use RedisCache.
10
+ */
11
+ export declare class LocalCache implements CacheBackend {
12
+ private readonly defaultTtl;
13
+ private readonly keyPrefix;
14
+ private readonly store;
15
+ constructor(defaultTtl?: number, keyPrefix?: string);
16
+ get(key: string): Promise<unknown>;
17
+ set(key: string, value: unknown, ttlSeconds?: number): Promise<void>;
18
+ delete(key: string): Promise<void>;
19
+ purge(): Promise<void>;
20
+ purgeKey(endpoint: string, params?: Record<string, unknown>): Promise<void>;
21
+ }
22
+ //# sourceMappingURL=LocalCache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LocalCache.d.ts","sourceRoot":"","sources":["../../src/cache/LocalCache.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAQtD;;;;GAIG;AACH,qBAAa,UAAW,YAAW,YAAY;IAIvC,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAJ9B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA4B;gBAG7B,UAAU,GAAE,MAAY,EACxB,SAAS,GAAE,MAAW;IAGrC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAalC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQpE,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAQxF"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * @copyright 2026 Association E-Cosplay
3
+ * @license Proprietary — see LICENSE
4
+ */
5
+ import { stableHashKey } from './stableHashKey.js';
6
+ /**
7
+ * In-memory cache backend. Lives for the duration of a single Node/Bun
8
+ * process. Suitable for short scripts and single-instance apps. For
9
+ * multi-process deployments use RedisCache.
10
+ */
11
+ export class LocalCache {
12
+ defaultTtl;
13
+ keyPrefix;
14
+ store = new Map();
15
+ constructor(defaultTtl = 300, keyPrefix = '') {
16
+ this.defaultTtl = defaultTtl;
17
+ this.keyPrefix = keyPrefix;
18
+ }
19
+ async get(key) {
20
+ const fullKey = this.keyPrefix + key;
21
+ const entry = this.store.get(fullKey);
22
+ if (!entry) {
23
+ return null;
24
+ }
25
+ if (entry.expiresAt < Date.now()) {
26
+ this.store.delete(fullKey);
27
+ return null;
28
+ }
29
+ return entry.value;
30
+ }
31
+ async set(key, value, ttlSeconds) {
32
+ const ttl = ttlSeconds ?? this.defaultTtl;
33
+ this.store.set(this.keyPrefix + key, {
34
+ value,
35
+ expiresAt: Date.now() + ttl * 1000,
36
+ });
37
+ }
38
+ async delete(key) {
39
+ this.store.delete(this.keyPrefix + key);
40
+ }
41
+ async purge() {
42
+ this.store.clear();
43
+ }
44
+ async purgeKey(endpoint, params = {}) {
45
+ const hashed = stableHashKey(endpoint, params);
46
+ for (const key of this.store.keys()) {
47
+ if (key.endsWith(hashed)) {
48
+ this.store.delete(key);
49
+ }
50
+ }
51
+ }
52
+ }
53
+ //# sourceMappingURL=LocalCache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LocalCache.js","sourceRoot":"","sources":["../../src/cache/LocalCache.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAOnD;;;;GAIG;AACH,MAAM,OAAO,UAAU;IAIE;IACA;IAJJ,KAAK,GAAG,IAAI,GAAG,EAAiB,CAAC;IAElD,YACqB,aAAqB,GAAG,EACxB,YAAoB,EAAE;QADtB,eAAU,GAAV,UAAU,CAAc;QACxB,cAAS,GAAT,SAAS,CAAa;IACxC,CAAC;IAEJ,KAAK,CAAC,GAAG,CAAC,GAAW;QACjB,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC;QACrC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACtC,IAAI,CAAC,KAAK,EAAE,CAAC;YACT,OAAO,IAAI,CAAC;QAChB,CAAC;QACD,IAAI,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;YAC/B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC3B,OAAO,IAAI,CAAC;QAChB,CAAC;QACD,OAAO,KAAK,CAAC,KAAK,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,KAAc,EAAE,UAAmB;QACtD,MAAM,GAAG,GAAG,UAAU,IAAI,IAAI,CAAC,UAAU,CAAC;QAC1C,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,GAAG,GAAG,EAAE;YACjC,KAAK;YACL,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,IAAI;SACrC,CAAC,CAAC;IACP,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW;QACpB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,KAAK;QACP,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,QAAgB,EAAE,SAAkC,EAAE;QACjE,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC/C,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;YAClC,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBACvB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC3B,CAAC;QACL,CAAC;IACL,CAAC;CACJ"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * @copyright 2026 Association E-Cosplay
3
+ * @license Proprietary — see LICENSE
4
+ */
5
+ import type { CacheBackend } from './CacheBackend.js';
6
+ /**
7
+ * No-op cache used when the SDK is constructed with `cache: false`.
8
+ * Every request hits the network; nothing is stored.
9
+ */
10
+ export declare class NullCache implements CacheBackend {
11
+ get(_key: string): Promise<null>;
12
+ set(_key: string, _value: unknown, _ttlSeconds?: number): Promise<void>;
13
+ delete(_key: string): Promise<void>;
14
+ purge(): Promise<void>;
15
+ purgeKey(_endpoint: string, _params?: Record<string, unknown>): Promise<void>;
16
+ }
17
+ //# sourceMappingURL=NullCache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NullCache.d.ts","sourceRoot":"","sources":["../../src/cache/NullCache.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD;;;GAGG;AACH,qBAAa,SAAU,YAAW,YAAY;IACpC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhC,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvE,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAInC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;CAGtF"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * @copyright 2026 Association E-Cosplay
3
+ * @license Proprietary — see LICENSE
4
+ */
5
+ /**
6
+ * No-op cache used when the SDK is constructed with `cache: false`.
7
+ * Every request hits the network; nothing is stored.
8
+ */
9
+ export class NullCache {
10
+ async get(_key) {
11
+ return null;
12
+ }
13
+ async set(_key, _value, _ttlSeconds) {
14
+ /* intentional no-op */
15
+ }
16
+ async delete(_key) {
17
+ /* intentional no-op */
18
+ }
19
+ async purge() {
20
+ /* intentional no-op */
21
+ }
22
+ async purgeKey(_endpoint, _params) {
23
+ /* intentional no-op */
24
+ }
25
+ }
26
+ //# sourceMappingURL=NullCache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NullCache.js","sourceRoot":"","sources":["../../src/cache/NullCache.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;;GAGG;AACH,MAAM,OAAO,SAAS;IAClB,KAAK,CAAC,GAAG,CAAC,IAAY;QAClB,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,IAAY,EAAE,MAAe,EAAE,WAAoB;QACzD,uBAAuB;IAC3B,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,IAAY;QACrB,uBAAuB;IAC3B,CAAC;IAED,KAAK,CAAC,KAAK;QACP,uBAAuB;IAC3B,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,SAAiB,EAAE,OAAiC;QAC/D,uBAAuB;IAC3B,CAAC;CACJ"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * @copyright 2026 Association E-Cosplay
3
+ * @license Proprietary — see LICENSE
4
+ */
5
+ import type { CacheBackend } from './CacheBackend.js';
6
+ import { type RedisConfig } from './RedisConfig.js';
7
+ /**
8
+ * Lightweight Redis client surface required by RedisCache. Compatible
9
+ * with `ioredis`'s public API (and any equivalent client).
10
+ */
11
+ export interface RedisLikeClient {
12
+ get(key: string): Promise<string | null>;
13
+ set(key: string, value: string, mode: 'EX', seconds: number): Promise<unknown>;
14
+ del(...keys: string[]): Promise<number>;
15
+ scan(cursor: string | number, ...args: unknown[]): Promise<[string, string[]]>;
16
+ quit(): Promise<unknown>;
17
+ }
18
+ /**
19
+ * Redis cache backend. Uses `ioredis` by default. The connection is
20
+ * lazily established on the first get/set and reused for the lifetime
21
+ * of the cache instance.
22
+ */
23
+ export declare class RedisCache implements CacheBackend {
24
+ private readonly config;
25
+ private readonly defaultTtl;
26
+ private readonly keyPrefix;
27
+ private readonly clientFactory?;
28
+ private client;
29
+ constructor(config: RedisConfig, defaultTtl?: number, keyPrefix?: string, clientFactory?: (() => Promise<RedisLikeClient>) | undefined);
30
+ get(key: string): Promise<unknown>;
31
+ set(key: string, value: unknown, ttlSeconds?: number): Promise<void>;
32
+ delete(key: string): Promise<void>;
33
+ purge(): Promise<void>;
34
+ purgeKey(endpoint: string, params?: Record<string, unknown>): Promise<void>;
35
+ private connect;
36
+ private realConnect;
37
+ private fullKey;
38
+ }
39
+ //# sourceMappingURL=RedisCache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RedisCache.d.ts","sourceRoot":"","sources":["../../src/cache/RedisCache.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAwB,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAG1E;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC5B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACzC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/E,GAAG,CAAC,GAAG,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACxC,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IAC/E,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;CAC5B;AAED;;;;GAIG;AACH,qBAAa,UAAW,YAAW,YAAY;IAIvC,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC;IANnC,OAAO,CAAC,MAAM,CAAgC;gBAGzB,MAAM,EAAE,WAAW,EACnB,UAAU,GAAE,MAAY,EACxB,SAAS,GAAE,MAAW,EACtB,aAAa,CAAC,GAAE,MAAM,OAAO,CAAC,eAAe,CAAC,aAAA;IAG7D,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAUlC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKpE,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAatB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAcvE,OAAO;YAaP,WAAW;IAuBzB,OAAO,CAAC,OAAO;CAGlB"}
@@ -0,0 +1,104 @@
1
+ /**
2
+ * @copyright 2026 Association E-Cosplay
3
+ * @license Proprietary — see LICENSE
4
+ */
5
+ import { EBrocanteError } from '../exceptions/index.js';
6
+ import { DEFAULT_REDIS_CONFIG } from './RedisConfig.js';
7
+ import { stableHashKey } from './stableHashKey.js';
8
+ /**
9
+ * Redis cache backend. Uses `ioredis` by default. The connection is
10
+ * lazily established on the first get/set and reused for the lifetime
11
+ * of the cache instance.
12
+ */
13
+ export class RedisCache {
14
+ config;
15
+ defaultTtl;
16
+ keyPrefix;
17
+ clientFactory;
18
+ client = null;
19
+ constructor(config, defaultTtl = 300, keyPrefix = '', clientFactory) {
20
+ this.config = config;
21
+ this.defaultTtl = defaultTtl;
22
+ this.keyPrefix = keyPrefix;
23
+ this.clientFactory = clientFactory;
24
+ }
25
+ async get(key) {
26
+ const raw = await (await this.connect()).get(this.fullKey(key));
27
+ if (raw === null)
28
+ return null;
29
+ try {
30
+ return JSON.parse(raw);
31
+ }
32
+ catch {
33
+ return null;
34
+ }
35
+ }
36
+ async set(key, value, ttlSeconds) {
37
+ const encoded = JSON.stringify(value);
38
+ await (await this.connect()).set(this.fullKey(key), encoded, 'EX', ttlSeconds ?? this.defaultTtl);
39
+ }
40
+ async delete(key) {
41
+ await (await this.connect()).del(this.fullKey(key));
42
+ }
43
+ async purge() {
44
+ const client = await this.connect();
45
+ const pattern = this.fullKey('*');
46
+ let cursor = '0';
47
+ do {
48
+ const [next, keys] = await client.scan(cursor, 'MATCH', pattern, 'COUNT', '100');
49
+ cursor = next;
50
+ if (keys.length > 0) {
51
+ await client.del(...keys);
52
+ }
53
+ } while (cursor !== '0');
54
+ }
55
+ async purgeKey(endpoint, params = {}) {
56
+ const hashed = stableHashKey(endpoint, params);
57
+ const client = await this.connect();
58
+ const pattern = this.fullKey(`*${hashed}`);
59
+ let cursor = '0';
60
+ do {
61
+ const [next, keys] = await client.scan(cursor, 'MATCH', pattern, 'COUNT', '100');
62
+ cursor = next;
63
+ if (keys.length > 0) {
64
+ await client.del(...keys);
65
+ }
66
+ } while (cursor !== '0');
67
+ }
68
+ async connect() {
69
+ if (this.client)
70
+ return this.client;
71
+ /* v8 ignore start — live-Redis fallback path is integration-tested only */
72
+ if (!this.clientFactory) {
73
+ this.client = await this.realConnect();
74
+ return this.client;
75
+ }
76
+ /* v8 ignore stop */
77
+ this.client = await this.clientFactory();
78
+ return this.client;
79
+ }
80
+ /* v8 ignore start — exercised only against a live Redis instance */
81
+ async realConnect() {
82
+ const cfg = { ...DEFAULT_REDIS_CONFIG, ...this.config };
83
+ let Redis;
84
+ try {
85
+ ({ default: Redis } = (await import('ioredis')));
86
+ }
87
+ catch {
88
+ throw new EBrocanteError("RedisCache requires the 'ioredis' package. Install it with: bun add ioredis");
89
+ }
90
+ return new Redis({
91
+ host: cfg.host,
92
+ port: cfg.port,
93
+ password: cfg.password,
94
+ db: cfg.db,
95
+ connectTimeout: cfg.timeoutMs,
96
+ tls: cfg.tls ? {} : undefined,
97
+ });
98
+ }
99
+ /* v8 ignore stop */
100
+ fullKey(key) {
101
+ return `${this.config.prefix ?? DEFAULT_REDIS_CONFIG.prefix}${this.keyPrefix}${key}`;
102
+ }
103
+ }
104
+ //# sourceMappingURL=RedisCache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RedisCache.js","sourceRoot":"","sources":["../../src/cache/RedisCache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * @copyright 2026 Association E-Cosplay
3
+ * @license Proprietary — see LICENSE
4
+ */
5
+ export interface RedisConfig {
6
+ host?: string;
7
+ port?: number;
8
+ password?: string;
9
+ db?: number;
10
+ prefix?: string;
11
+ timeoutMs?: number;
12
+ tls?: boolean;
13
+ }
14
+ export declare const DEFAULT_REDIS_CONFIG: Required<Omit<RedisConfig, 'password'>> & {
15
+ password?: string;
16
+ };
17
+ //# sourceMappingURL=RedisConfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RedisConfig.d.ts","sourceRoot":"","sources":["../../src/cache/RedisConfig.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,WAAW;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,eAAO,MAAM,oBAAoB,EAAE,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,GAAG;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAO/F,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * @copyright 2026 Association E-Cosplay
3
+ * @license Proprietary — see LICENSE
4
+ */
5
+ export const DEFAULT_REDIS_CONFIG = {
6
+ host: '127.0.0.1',
7
+ port: 6379,
8
+ db: 0,
9
+ prefix: 'ebrocante:',
10
+ timeoutMs: 1500,
11
+ tls: false,
12
+ };
13
+ //# sourceMappingURL=RedisConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RedisConfig.js","sourceRoot":"","sources":["../../src/cache/RedisConfig.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAYH,MAAM,CAAC,MAAM,oBAAoB,GAAoE;IACjG,IAAI,EAAE,WAAW;IACjB,IAAI,EAAE,IAAI;IACV,EAAE,EAAE,CAAC;IACL,MAAM,EAAE,YAAY;IACpB,SAAS,EAAE,IAAI;IACf,GAAG,EAAE,KAAK;CACb,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * @copyright 2026 Association E-Cosplay
3
+ * @license Proprietary — see LICENSE
4
+ */
5
+ /**
6
+ * Deterministic, key-order-independent hash for cache lookups.
7
+ * Mirrors the PHP SDK's makeCacheKey() so both clients can share
8
+ * a Redis instance without collisions.
9
+ */
10
+ export declare function stableHashKey(endpoint: string, params: Record<string, unknown>): string;
11
+ //# sourceMappingURL=stableHashKey.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stableHashKey.d.ts","sourceRoot":"","sources":["../../src/cache/stableHashKey.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAcvF"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * @copyright 2026 Association E-Cosplay
3
+ * @license Proprietary — see LICENSE
4
+ */
5
+ import { createHash } from 'node:crypto';
6
+ import { slashesToDots, stringifyPrimitive, trimSlashes } from '../internal/safeStrings.js';
7
+ /**
8
+ * Deterministic, key-order-independent hash for cache lookups.
9
+ * Mirrors the PHP SDK's makeCacheKey() so both clients can share
10
+ * a Redis instance without collisions.
11
+ */
12
+ export function stableHashKey(endpoint, params) {
13
+ const sortedKeys = Object.keys(params).sort((a, b) => a.localeCompare(b, 'en'));
14
+ const queryString = sortedKeys
15
+ .map((k) => {
16
+ const v = params[k];
17
+ if (v === undefined || v === null || v === '')
18
+ return null;
19
+ return `${encodeURIComponent(k)}=${encodeURIComponent(stringifyPrimitive(v))}`;
20
+ })
21
+ .filter((s) => s !== null)
22
+ .join('&');
23
+ const cleanEndpoint = slashesToDots(trimSlashes(endpoint));
24
+ const digest = createHash('sha256').update(queryString).digest('hex').slice(0, 32);
25
+ return `${cleanEndpoint}:${digest}`;
26
+ }
27
+ //# sourceMappingURL=stableHashKey.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stableHashKey.js","sourceRoot":"","sources":["../../src/cache/stableHashKey.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAE5F;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,QAAgB,EAAE,MAA+B;IAC3E,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;IAChF,MAAM,WAAW,GAAG,UAAU;SACzB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACP,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,EAAE;YAAE,OAAO,IAAI,CAAC;QAC3D,OAAO,GAAG,kBAAkB,CAAC,CAAC,CAAC,IAAI,kBAAkB,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACnF,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC;SACtC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEf,MAAM,aAAa,GAAG,aAAa,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACnF,OAAO,GAAG,aAAa,IAAI,MAAM,EAAE,CAAC;AACxC,CAAC"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * @copyright 2026 Association E-Cosplay
3
+ * @license Proprietary — see LICENSE
4
+ *
5
+ * Typed exception hierarchy. Catch `EBrocanteError` to handle any SDK
6
+ * failure, or a more specific subclass for finer control.
7
+ */
8
+ export declare class EBrocanteError extends Error {
9
+ constructor(message: string, options?: ErrorOptions);
10
+ }
11
+ /** HTTP 401 / 403 — invalid key, wrong scope, or mode mismatch. */
12
+ export declare class AuthenticationError extends EBrocanteError {
13
+ readonly status: number;
14
+ constructor(message: string, status: number, options?: ErrorOptions);
15
+ }
16
+ /** HTTP 404 / 410 — resource missing or gone. */
17
+ export declare class NotFoundError extends EBrocanteError {
18
+ readonly status: number;
19
+ constructor(message: string, status: number, options?: ErrorOptions);
20
+ }
21
+ /** HTTP 422 — request schema rejected. Carries the raw error body. */
22
+ export declare class ValidationError extends EBrocanteError {
23
+ readonly status: number;
24
+ readonly body: string;
25
+ constructor(message: string, status: number, body: string, options?: ErrorOptions);
26
+ }
27
+ /** HTTP 429 — rate limit exhausted. `retryAfter` in seconds. */
28
+ export declare class RateLimitError extends EBrocanteError {
29
+ readonly status: number;
30
+ readonly retryAfter: number;
31
+ constructor(message: string, status: number, retryAfter: number, options?: ErrorOptions);
32
+ }
33
+ /** HTTP 5xx (or any unmapped status) once retries have been exhausted. */
34
+ export declare class ServerError extends EBrocanteError {
35
+ readonly status: number;
36
+ constructor(message: string, status: number, options?: ErrorOptions);
37
+ }
38
+ /** Transport-level failure (DNS, TCP timeout, broken pipe, abort, …). */
39
+ export declare class NetworkError extends EBrocanteError {
40
+ }
41
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/exceptions/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,qBAAa,cAAe,SAAQ,KAAK;gBACzB,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY;CAKtD;AAED,mEAAmE;AACnE,qBAAa,mBAAoB,SAAQ,cAAc;IAG/C,QAAQ,CAAC,MAAM,EAAE,MAAM;gBADvB,OAAO,EAAE,MAAM,EACN,MAAM,EAAE,MAAM,EACvB,OAAO,CAAC,EAAE,YAAY;CAI7B;AAED,iDAAiD;AACjD,qBAAa,aAAc,SAAQ,cAAc;IAGzC,QAAQ,CAAC,MAAM,EAAE,MAAM;gBADvB,OAAO,EAAE,MAAM,EACN,MAAM,EAAE,MAAM,EACvB,OAAO,CAAC,EAAE,YAAY;CAI7B;AAED,sEAAsE;AACtE,qBAAa,eAAgB,SAAQ,cAAc;IAG3C,QAAQ,CAAC,MAAM,EAAE,MAAM;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM;gBAFrB,OAAO,EAAE,MAAM,EACN,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACrB,OAAO,CAAC,EAAE,YAAY;CAI7B;AAED,gEAAgE;AAChE,qBAAa,cAAe,SAAQ,cAAc;IAG1C,QAAQ,CAAC,MAAM,EAAE,MAAM;IACvB,QAAQ,CAAC,UAAU,EAAE,MAAM;gBAF3B,OAAO,EAAE,MAAM,EACN,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAC3B,OAAO,CAAC,EAAE,YAAY;CAI7B;AAED,0EAA0E;AAC1E,qBAAa,WAAY,SAAQ,cAAc;IAGvC,QAAQ,CAAC,MAAM,EAAE,MAAM;gBADvB,OAAO,EAAE,MAAM,EACN,MAAM,EAAE,MAAM,EACvB,OAAO,CAAC,EAAE,YAAY;CAI7B;AAED,yEAAyE;AACzE,qBAAa,YAAa,SAAQ,cAAc;CAAG"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * @copyright 2026 Association E-Cosplay
3
+ * @license Proprietary — see LICENSE
4
+ *
5
+ * Typed exception hierarchy. Catch `EBrocanteError` to handle any SDK
6
+ * failure, or a more specific subclass for finer control.
7
+ */
8
+ export class EBrocanteError extends Error {
9
+ constructor(message, options) {
10
+ super(message, options);
11
+ this.name = this.constructor.name;
12
+ Object.setPrototypeOf(this, new.target.prototype);
13
+ }
14
+ }
15
+ /** HTTP 401 / 403 — invalid key, wrong scope, or mode mismatch. */
16
+ export class AuthenticationError extends EBrocanteError {
17
+ status;
18
+ constructor(message, status, options) {
19
+ super(message, options);
20
+ this.status = status;
21
+ }
22
+ }
23
+ /** HTTP 404 / 410 — resource missing or gone. */
24
+ export class NotFoundError extends EBrocanteError {
25
+ status;
26
+ constructor(message, status, options) {
27
+ super(message, options);
28
+ this.status = status;
29
+ }
30
+ }
31
+ /** HTTP 422 — request schema rejected. Carries the raw error body. */
32
+ export class ValidationError extends EBrocanteError {
33
+ status;
34
+ body;
35
+ constructor(message, status, body, options) {
36
+ super(message, options);
37
+ this.status = status;
38
+ this.body = body;
39
+ }
40
+ }
41
+ /** HTTP 429 — rate limit exhausted. `retryAfter` in seconds. */
42
+ export class RateLimitError extends EBrocanteError {
43
+ status;
44
+ retryAfter;
45
+ constructor(message, status, retryAfter, options) {
46
+ super(message, options);
47
+ this.status = status;
48
+ this.retryAfter = retryAfter;
49
+ }
50
+ }
51
+ /** HTTP 5xx (or any unmapped status) once retries have been exhausted. */
52
+ export class ServerError extends EBrocanteError {
53
+ status;
54
+ constructor(message, status, options) {
55
+ super(message, options);
56
+ this.status = status;
57
+ }
58
+ }
59
+ /** Transport-level failure (DNS, TCP timeout, broken pipe, abort, …). */
60
+ export class NetworkError extends EBrocanteError {
61
+ }
62
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/exceptions/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,OAAO,cAAe,SAAQ,KAAK;IACrC,YAAY,OAAe,EAAE,OAAsB;QAC/C,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;QAClC,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACtD,CAAC;CACJ;AAED,mEAAmE;AACnE,MAAM,OAAO,mBAAoB,SAAQ,cAAc;IAGtC;IAFb,YACI,OAAe,EACN,MAAc,EACvB,OAAsB;QAEtB,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAHf,WAAM,GAAN,MAAM,CAAQ;IAI3B,CAAC;CACJ;AAED,iDAAiD;AACjD,MAAM,OAAO,aAAc,SAAQ,cAAc;IAGhC;IAFb,YACI,OAAe,EACN,MAAc,EACvB,OAAsB;QAEtB,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAHf,WAAM,GAAN,MAAM,CAAQ;IAI3B,CAAC;CACJ;AAED,sEAAsE;AACtE,MAAM,OAAO,eAAgB,SAAQ,cAAc;IAGlC;IACA;IAHb,YACI,OAAe,EACN,MAAc,EACd,IAAY,EACrB,OAAsB;QAEtB,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAJf,WAAM,GAAN,MAAM,CAAQ;QACd,SAAI,GAAJ,IAAI,CAAQ;IAIzB,CAAC;CACJ;AAED,gEAAgE;AAChE,MAAM,OAAO,cAAe,SAAQ,cAAc;IAGjC;IACA;IAHb,YACI,OAAe,EACN,MAAc,EACd,UAAkB,EAC3B,OAAsB;QAEtB,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAJf,WAAM,GAAN,MAAM,CAAQ;QACd,eAAU,GAAV,UAAU,CAAQ;IAI/B,CAAC;CACJ;AAED,0EAA0E;AAC1E,MAAM,OAAO,WAAY,SAAQ,cAAc;IAG9B;IAFb,YACI,OAAe,EACN,MAAc,EACvB,OAAsB;QAEtB,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAHf,WAAM,GAAN,MAAM,CAAQ;IAI3B,CAAC;CACJ;AAED,yEAAyE;AACzE,MAAM,OAAO,YAAa,SAAQ,cAAc;CAAG"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * @copyright 2026 Association E-Cosplay
3
+ * @license Proprietary — see LICENSE
4
+ */
5
+ import type { CacheBackend } from '../cache/CacheBackend.js';
6
+ import type { DebugWriter } from '../logger/DebugWriter.js';
7
+ import type { Logger } from '../logger/Logger.js';
8
+ import type { Mode, RequestOptions } from '../types.js';
9
+ export declare const SDK_VERSION = "1.0.2";
10
+ export interface HttpClientDeps {
11
+ apiKey: string;
12
+ brocEmail: string;
13
+ mode: Mode;
14
+ baseUrl: string;
15
+ timeoutMs: number;
16
+ cache: CacheBackend;
17
+ logger: Logger;
18
+ debugWriter: DebugWriter | null;
19
+ maxRetries: number;
20
+ fetchImpl: typeof fetch;
21
+ }
22
+ /** @internal */
23
+ export declare class HttpClient {
24
+ private readonly deps;
25
+ constructor(deps: HttpClientDeps);
26
+ get cache(): CacheBackend;
27
+ get(endpoint: string, query?: Record<string, unknown>, opts?: RequestOptions): Promise<Record<string, unknown>>;
28
+ makeCacheKey(endpoint: string, query: Record<string, unknown>): string;
29
+ private buildPath;
30
+ private encodeQuery;
31
+ private sendWithRetry;
32
+ private attemptOrRetryConnect;
33
+ private handleConnectError;
34
+ private shouldRetryStatus;
35
+ private applyRetryDelay;
36
+ private buildHttpError;
37
+ private sleepBackoff;
38
+ private decode;
39
+ private extractErrorMessage;
40
+ }
41
+ //# sourceMappingURL=HttpClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HttpClient.d.ts","sourceRoot":"","sources":["../../src/http/HttpClient.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAW7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAExD,eAAO,MAAM,WAAW,UAAU,CAAC;AAEnC,MAAM,WAAW,cAAc;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,IAAI,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,YAAY,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,WAAW,GAAG,IAAI,CAAC;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,OAAO,KAAK,CAAC;CAC3B;AAED,gBAAgB;AAChB,qBAAa,UAAU;IACP,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,cAAc;IAEjD,IAAI,KAAK,IAAI,YAAY,CAExB;IAEK,GAAG,CACL,QAAQ,EAAE,MAAM,EAChB,KAAK,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EACnC,IAAI,GAAE,cAAmB,GAC1B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IA8CnC,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM;IAItE,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,WAAW;YAUL,aAAa;YAoBb,qBAAqB;YAuBrB,kBAAkB;IAahC,OAAO,CAAC,iBAAiB;YAIX,eAAe;YAef,cAAc;YAiBd,YAAY;IAO1B,OAAO,CAAC,MAAM;IAcd,OAAO,CAAC,mBAAmB;CAuB9B"}