alepha 0.7.0 → 0.7.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 (100) hide show
  1. package/README.md +14 -3
  2. package/assets/logo.png +0 -0
  3. package/cache.cjs +0 -1
  4. package/cache.d.ts +30 -13
  5. package/cache.js +0 -1
  6. package/core.cjs +0 -1
  7. package/core.d.ts +465 -196
  8. package/core.js +0 -1
  9. package/datetime.cjs +0 -1
  10. package/datetime.d.ts +68 -79
  11. package/datetime.js +0 -1
  12. package/lock.cjs +0 -1
  13. package/lock.d.ts +3 -14
  14. package/lock.js +0 -1
  15. package/package.json +54 -53
  16. package/postgres.cjs +0 -1
  17. package/postgres.d.ts +3250 -288
  18. package/postgres.js +0 -1
  19. package/queue.cjs +0 -1
  20. package/queue.d.ts +2 -2
  21. package/queue.js +0 -1
  22. package/react/auth.cjs +0 -1
  23. package/react/auth.d.ts +12 -5
  24. package/react/auth.js +0 -1
  25. package/react.cjs +0 -1
  26. package/react.d.ts +317 -206
  27. package/react.js +0 -1
  28. package/redis.cjs +0 -1
  29. package/redis.d.ts +10 -8
  30. package/redis.js +0 -1
  31. package/retry.cjs +12 -0
  32. package/retry.d.ts +68 -0
  33. package/retry.js +1 -0
  34. package/scheduler.cjs +0 -1
  35. package/scheduler.js +0 -1
  36. package/security.cjs +0 -1
  37. package/security.d.ts +82 -35
  38. package/security.js +0 -1
  39. package/server/cookies.cjs +0 -1
  40. package/server/cookies.d.ts +1 -1
  41. package/server/cookies.js +0 -1
  42. package/server/metrics.cjs +0 -1
  43. package/server/metrics.js +0 -1
  44. package/server/static.cjs +0 -1
  45. package/server/static.d.ts +1 -0
  46. package/server/static.js +0 -1
  47. package/server/swagger.cjs +0 -1
  48. package/server/swagger.js +0 -1
  49. package/server.cjs +0 -1
  50. package/server.d.ts +402 -327
  51. package/server.js +0 -1
  52. package/src/retry.ts +1 -0
  53. package/topic.cjs +0 -1
  54. package/topic.d.ts +3 -20
  55. package/topic.js +0 -1
  56. package/vite.cjs +0 -1
  57. package/vite.d.ts +57 -38
  58. package/vite.js +0 -1
  59. package/cache.cjs.map +0 -1
  60. package/cache.js.map +0 -1
  61. package/core.cjs.map +0 -1
  62. package/core.js.map +0 -1
  63. package/datetime.cjs.map +0 -1
  64. package/datetime.js.map +0 -1
  65. package/lock.cjs.map +0 -1
  66. package/lock.js.map +0 -1
  67. package/postgres.cjs.map +0 -1
  68. package/postgres.js.map +0 -1
  69. package/queue.cjs.map +0 -1
  70. package/queue.js.map +0 -1
  71. package/react/auth.cjs.map +0 -1
  72. package/react/auth.js.map +0 -1
  73. package/react.cjs.map +0 -1
  74. package/react.js.map +0 -1
  75. package/redis.cjs.map +0 -1
  76. package/redis.js.map +0 -1
  77. package/scheduler.cjs.map +0 -1
  78. package/scheduler.js.map +0 -1
  79. package/security.cjs.map +0 -1
  80. package/security.js.map +0 -1
  81. package/server/cookies.cjs.map +0 -1
  82. package/server/cookies.js.map +0 -1
  83. package/server/metrics.cjs.map +0 -1
  84. package/server/metrics.js.map +0 -1
  85. package/server/proxy.cjs +0 -13
  86. package/server/proxy.cjs.map +0 -1
  87. package/server/proxy.d.ts +0 -1
  88. package/server/proxy.js +0 -2
  89. package/server/proxy.js.map +0 -1
  90. package/server/static.cjs.map +0 -1
  91. package/server/static.js.map +0 -1
  92. package/server/swagger.cjs.map +0 -1
  93. package/server/swagger.js.map +0 -1
  94. package/server.cjs.map +0 -1
  95. package/server.js.map +0 -1
  96. package/src/server/proxy.ts +0 -1
  97. package/topic.cjs.map +0 -1
  98. package/topic.js.map +0 -1
  99. package/vite.cjs.map +0 -1
  100. package/vite.js.map +0 -1
package/redis.cjs CHANGED
@@ -10,4 +10,3 @@ Object.keys(redis).forEach(function (k) {
10
10
  get: function () { return redis[k]; }
11
11
  });
12
12
  });
13
- //# sourceMappingURL=redis.cjs.map
package/redis.d.ts CHANGED
@@ -1,7 +1,7 @@
1
+ import * as _redis_client from '@redis/client';
2
+ import { createClient, SetOptions } from '@redis/client';
1
3
  import * as _alepha_core from '@alepha/core';
2
4
  import { Static, Alepha } from '@alepha/core';
3
- import * as Redis from 'ioredis';
4
- import Redis__default, { RedisOptions } from 'ioredis';
5
5
 
6
6
  /** Symbol key applied to readonly types */
7
7
  declare const ReadonlyKind: unique symbol;
@@ -89,7 +89,9 @@ declare module "alepha" {
89
89
  interface Env extends Partial<Static<typeof envSchema>> {
90
90
  }
91
91
  }
92
- type RedisClient = Redis__default;
92
+ type RedisClient = ReturnType<typeof createClient>;
93
+ type RedisClientOptions = Parameters<typeof createClient>[0];
94
+ type RedisSetOptions = SetOptions;
93
95
  declare class RedisProvider {
94
96
  protected readonly log: _alepha_core.Logger;
95
97
  protected readonly alepha: Alepha;
@@ -98,7 +100,7 @@ declare class RedisProvider {
98
100
  REDIS_PORT: number;
99
101
  REDIS_HOST: string;
100
102
  };
101
- protected readonly client: Redis__default;
103
+ protected readonly client: _redis_client.RedisClientType<_redis_client.RedisModules, _redis_client.RedisFunctions, _redis_client.RedisScripts, _redis_client.RespVersions, _redis_client.TypeMapping>;
102
104
  get publisher(): RedisClient;
103
105
  protected readonly start: _alepha_core.HookDescriptor<"start">;
104
106
  protected readonly stop: _alepha_core.HookDescriptor<"stop">;
@@ -110,7 +112,7 @@ declare class RedisProvider {
110
112
  * Close the connection to the Redis server.
111
113
  */
112
114
  close(): Promise<void>;
113
- duplicate(options?: Partial<RedisOptions>): RedisClient;
115
+ duplicate(options?: Partial<RedisClientOptions>): RedisClient;
114
116
  /**
115
117
  * Redis subscriber client factory method.
116
118
  */
@@ -121,16 +123,16 @@ declare class RedisSubscriberProvider {
121
123
  protected readonly log: _alepha_core.Logger;
122
124
  protected readonly alepha: Alepha;
123
125
  protected readonly redisProvider: RedisProvider;
124
- protected readonly client: Redis.default;
126
+ protected readonly client: _redis_client.RedisClientType<_redis_client.RedisModules, _redis_client.RedisFunctions, _redis_client.RedisScripts, _redis_client.RespVersions, _redis_client.TypeMapping>;
125
127
  get subscriber(): RedisClient;
126
128
  protected readonly start: _alepha_core.HookDescriptor<"start">;
127
129
  protected readonly stop: _alepha_core.HookDescriptor<"stop">;
128
130
  connect(): Promise<void>;
129
- close(): void;
131
+ close(): Promise<void>;
130
132
  /**
131
133
  * Redis subscriber client factory method.
132
134
  */
133
135
  protected createClient(): RedisClient;
134
136
  }
135
137
 
136
- export { type RedisClient, RedisProvider, RedisSubscriberProvider };
138
+ export { type RedisClient, type RedisClientOptions, RedisProvider, type RedisSetOptions, RedisSubscriberProvider };
package/redis.js CHANGED
@@ -1,2 +1 @@
1
1
  export * from '@alepha/redis';
2
- //# sourceMappingURL=redis.js.map
package/retry.cjs ADDED
@@ -0,0 +1,12 @@
1
+ 'use strict';
2
+
3
+ var retry = require('@alepha/retry');
4
+
5
+
6
+
7
+ Object.keys(retry).forEach(function (k) {
8
+ if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
9
+ enumerable: true,
10
+ get: function () { return retry[k]; }
11
+ });
12
+ });
package/retry.d.ts ADDED
@@ -0,0 +1,68 @@
1
+ import { MaybePromise } from '@alepha/core';
2
+
3
+ /**
4
+ * Retry Descriptor options.
5
+ */
6
+ interface RetryDescriptorOptions<T extends (...args: any[]) => any> {
7
+ /**
8
+ * Maximum number of attempts.
9
+ *
10
+ * @default 3
11
+ */
12
+ max?: number;
13
+ /**
14
+ * Delay in milliseconds.
15
+ *
16
+ * @default 0
17
+ */
18
+ delay?: number;
19
+ /**
20
+ * Optional condition to determine when to retry.
21
+ */
22
+ when?: (error: Error) => boolean;
23
+ /**
24
+ * The function to retry.
25
+ */
26
+ handler: T;
27
+ /**
28
+ * Optional error handler.
29
+ *
30
+ * This will be called when an error occurs.
31
+ *
32
+ * @default undefined
33
+ */
34
+ onError?: (error: Error, attempt: number, ...parameters: Parameters<T>) => void;
35
+ }
36
+ type RetryDescriptor<T extends (...args: any[]) => any> = (...parameters: Parameters<T>) => MaybePromise<ReturnType<T>>;
37
+ /**
38
+ * `$retry` creates a retry descriptor.
39
+ *
40
+ * It will retry the given function up to `max` times with a delay of `delay` milliseconds between attempts.
41
+ *
42
+ * @example
43
+ * ```ts
44
+ * import { $retry } from "@alepha/core";
45
+ *
46
+ * class MyService {
47
+ * fetchData = $retry({
48
+ * max: 5, // maximum number of attempts
49
+ * delay: 1000, // ms
50
+ * when: (error) => error.message.includes("Network Error"),
51
+ * handler: async (url: string) => {
52
+ * const response = await fetch(url);
53
+ * if (!response.ok) {
54
+ * throw new Error(`Failed to fetch: ${response.statusText}`);
55
+ * }
56
+ * return response.json();
57
+ * },
58
+ * onError: (error, attempt, url) => {
59
+ * // error happened, log it or handle it
60
+ * console.error(`Attempt ${attempt} failed for ${url}:`, error);
61
+ * },
62
+ * });
63
+ * }
64
+ * ```
65
+ */
66
+ declare const $retry: <T extends (...args: any[]) => any>(opts: RetryDescriptorOptions<T>) => RetryDescriptor<T>;
67
+
68
+ export { $retry, type RetryDescriptor, type RetryDescriptorOptions };
package/retry.js ADDED
@@ -0,0 +1 @@
1
+ export * from '@alepha/retry';
package/scheduler.cjs CHANGED
@@ -10,4 +10,3 @@ Object.keys(scheduler).forEach(function (k) {
10
10
  get: function () { return scheduler[k]; }
11
11
  });
12
12
  });
13
- //# sourceMappingURL=scheduler.cjs.map
package/scheduler.js CHANGED
@@ -1,2 +1 @@
1
1
  export * from '@alepha/scheduler';
2
- //# sourceMappingURL=scheduler.js.map
package/security.cjs CHANGED
@@ -10,4 +10,3 @@ Object.keys(security).forEach(function (k) {
10
10
  get: function () { return security[k]; }
11
11
  });
12
12
  });
13
- //# sourceMappingURL=security.cjs.map
package/security.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import * as _alepha_core from '@alepha/core';
2
2
  import { Static as Static$1, KIND, OPTIONS, Alepha } from '@alepha/core';
3
- import { JWSHeaderParameters, FlattenedJWSInput, CryptoKey, KeyObject, JSONWebKeySet, JWTVerifyResult, JWTPayload, JWTHeaderParameters } from 'jose';
3
+ import { JWTHeaderParameters, JWSHeaderParameters, FlattenedJWSInput, CryptoKey, KeyObject, JSONWebKeySet, JWTVerifyResult, JWTPayload } from 'jose';
4
+ import { DateTimeProvider } from '@alepha/datetime';
4
5
 
5
6
  /**
6
7
  * Represents a User Account extracted from JWT.
@@ -18,6 +19,14 @@ interface UserAccountInfo {
18
19
  * User full name, if available.
19
20
  */
20
21
  name?: string;
22
+ /**
23
+ * User email, if available.
24
+ */
25
+ email?: string;
26
+ /**
27
+ * User profile picture URL, if available.
28
+ */
29
+ picture?: string;
21
30
  /**
22
31
  * Organization ID, if available.
23
32
  */
@@ -237,6 +246,7 @@ declare const roleSchema: TObject<{
237
246
  permissions: TArray<TObject<{
238
247
  name: TString;
239
248
  ownership: TOptional<TBoolean>;
249
+ exclude: TOptional<TArray<TString>>;
240
250
  }>>;
241
251
  }>;
242
252
  type Role = Static$1<typeof roleSchema>;
@@ -247,6 +257,7 @@ type Role = Static$1<typeof roleSchema>;
247
257
  declare class JwtProvider {
248
258
  protected readonly log: _alepha_core.Logger;
249
259
  protected readonly keystore: KeyLoaderHolder[];
260
+ protected readonly dateTimeProvider: DateTimeProvider;
250
261
  /**
251
262
  * Adds a key loader to the embedded keystore.
252
263
  *
@@ -312,7 +323,7 @@ interface KeyLoaderHolder {
312
323
  interface JwtSignOptions {
313
324
  issuedAt?: boolean;
314
325
  protectedHeader?: JWTHeaderParameters;
315
- expiresIn?: string | number;
326
+ expiresIn?: number;
316
327
  }
317
328
  interface ExtendedJWTPayload extends JWTPayload {
318
329
  name?: string;
@@ -395,11 +406,11 @@ declare class SecurityProvider {
395
406
  * Creates a user account from the provided payload.
396
407
  *
397
408
  * @param payload - The payload to create the user account from.
398
- * @param [realm] - The realm containing the roles. Default is all.
409
+ * @param [realmName] - The realm containing the roles. Default is all.
399
410
  *
400
411
  * @returns The user info created from the payload.
401
412
  */
402
- createInfoFromPayload(payload: JWTPayload, realm?: string): UserAccountInfo;
413
+ createInfoFromPayload(payload: JWTPayload, realmName?: string): UserAccountInfo;
403
414
  /**
404
415
  * Checks if the user has the specified permission.
405
416
  *
@@ -423,7 +434,11 @@ declare class SecurityProvider {
423
434
  * @param permission - The permission to check for.
424
435
  * @returns True if the user has the role, false otherwise.
425
436
  */
426
- can(role: string, permission: string | Permission): boolean;
437
+ can(roleName: string, permission: string | Permission): boolean;
438
+ /**
439
+ * Checks if a user has ownership of a specific permission.
440
+ */
441
+ ownership(roleName: string, permission: string | Permission): string | boolean | undefined;
427
442
  /**
428
443
  * Converts a permission object to a string.
429
444
  *
@@ -461,6 +476,8 @@ declare class SecurityProvider {
461
476
  * @return An array of role strings.
462
477
  */
463
478
  getRolesFromPayload(payload: Record<string, any>): string[];
479
+ getPictureFromPayload(payload: Record<string, any>): string | undefined;
480
+ getEmailFromPayload(payload: Record<string, any>): string | undefined;
464
481
  /**
465
482
  * Returns the name from the given payload.
466
483
  *
@@ -494,6 +511,7 @@ interface Realm {
494
511
  * This is useful when you want to use a custom user provider for a specific realm.
495
512
  */
496
513
  userAccountProvider?: SecurityUserAccountProvider;
514
+ onLoadUser?: (user: UserAccountInfo) => Promise<void> | void;
497
515
  }
498
516
  interface SecurityUserAccountProvider {
499
517
  jwks: string | undefined;
@@ -532,7 +550,7 @@ interface RealmDescriptorOptions {
532
550
  *
533
551
  * Note: You can skip this if you are using a user account provider with JWKS.
534
552
  */
535
- secret?: string | JSONWebKeySet;
553
+ secret?: string | JSONWebKeySet | (() => string);
536
554
  /**
537
555
  * Attach a user account provider to the realm to manage roles.
538
556
  * For example, you can use a KeycloakUserProvider to automatically create realm roles inside Keycloak.
@@ -596,41 +614,62 @@ declare const $role: {
596
614
  };
597
615
 
598
616
  /**
599
- * Create a service account that can be used to authenticate with a OAUTH2 server.
617
+ * Allow to get an access token for a service account.
618
+ *
619
+ * You have some options to configure the service account:
620
+ * - a OAUTH2 URL using client credentials grant type
621
+ * - a JWT secret shared between the services
622
+ *
623
+ * @example
624
+ * ```ts
625
+ * import { $serviceAccount } from "@alepha/security";
600
626
  *
601
- * @param options
627
+ * class MyService {
628
+ * serviceAccount = $serviceAccount({
629
+ * oauth2: {
630
+ * url: "https://example.com/oauth2/token",
631
+ * clientId: "your-client-id",
632
+ * clientSecret: "your-client-secret",
633
+ * }
634
+ * });
635
+ *
636
+ * async fetchData() {
637
+ * const token = await this.serviceAccount.token();
638
+ * // or
639
+ * const response = await this.serviceAccount.fetch("https://api.example.com/data");
640
+ * }
641
+ * }
642
+ * ```
602
643
  */
603
644
  declare const $serviceAccount: (options: ServiceAccountDescriptorOptions) => ServiceAccountDescriptor;
604
645
  type ServiceAccountDescriptorOptions = {
605
- oauth2: {
606
- /**
607
- * Get Token URL.
608
- */
609
- url: string;
610
- /**
611
- * Client ID.
612
- */
613
- clientId: string;
614
- /**
615
- * Client Secret.
616
- */
617
- clientSecret: string;
618
- /**
619
- * Scopes to request.
620
- */
621
- scope?: string;
622
- };
646
+ gracePeriod?: number;
647
+ } & ({
648
+ oauth2: Oauth2ServiceAccountDescriptorOptions;
623
649
  } | {
624
- jwt: {
625
- secret: string;
626
- roles?: string[];
627
- };
628
- };
650
+ jwt: JwtServiceAccountDescriptorOptions;
651
+ });
652
+ interface JwtServiceAccountDescriptorOptions {
653
+ secret: string;
654
+ roles?: string[];
655
+ signOptions?: JwtSignOptions;
656
+ }
657
+ interface Oauth2ServiceAccountDescriptorOptions {
658
+ /**
659
+ * Get Token URL.
660
+ */
661
+ url: string;
662
+ /**
663
+ * Client ID.
664
+ */
665
+ clientId: string;
666
+ /**
667
+ * Client Secret.
668
+ */
669
+ clientSecret: string;
670
+ }
629
671
  interface ServiceAccountDescriptor {
630
- options: ServiceAccountDescriptorOptions;
631
- store: ServiceAccountStore;
632
672
  token: () => Promise<string>;
633
- fetch(url: string, options?: RequestInit): Promise<Response>;
634
673
  }
635
674
  interface AccessTokenResponse {
636
675
  access_token: string;
@@ -650,9 +689,17 @@ declare class SecurityError extends Error {
650
689
  readonly code = "ERR_SECURITY";
651
690
  }
652
691
 
692
+ declare module "alepha/core" {
693
+ interface Hooks {
694
+ "security:user:created": {
695
+ realm: string;
696
+ user: UserAccountInfo;
697
+ };
698
+ }
699
+ }
653
700
  declare class SecurityModule {
654
701
  protected readonly alepha: Alepha;
655
702
  constructor();
656
703
  }
657
704
 
658
- export { $permission, $realm, $role, $serviceAccount, type AccessTokenResponse, type ExtendedJWTPayload, InvalidPermissionError, type JwtParseResult, JwtProvider, type JwtSignOptions, type KeyLoader, type KeyLoaderHolder, type Permission, type PermissionDescriptor, type PermissionDescriptorOptions, type Realm, type RealmConfig, type RealmDescriptor, type RealmDescriptorOptions, type Role, type RoleDescriptor, type RoleDescriptorOptions, type SecurityCheckResult, SecurityError, SecurityModule, SecurityProvider, type SecurityUserAccountProvider, type ServiceAccountDescriptor, type ServiceAccountDescriptorOptions, type ServiceAccountStore, type UserAccountInfo, type UserAccountToken, permissionSchema, roleSchema };
705
+ export { $permission, $realm, $role, $serviceAccount, type AccessTokenResponse, type ExtendedJWTPayload, InvalidPermissionError, type JwtParseResult, JwtProvider, type JwtServiceAccountDescriptorOptions, type JwtSignOptions, type KeyLoader, type KeyLoaderHolder, type Oauth2ServiceAccountDescriptorOptions, type Permission, type PermissionDescriptor, type PermissionDescriptorOptions, type Realm, type RealmConfig, type RealmDescriptor, type RealmDescriptorOptions, type Role, type RoleDescriptor, type RoleDescriptorOptions, type SecurityCheckResult, SecurityError, SecurityModule, SecurityProvider, type SecurityUserAccountProvider, type ServiceAccountDescriptor, type ServiceAccountDescriptorOptions, type ServiceAccountStore, type UserAccountInfo, type UserAccountToken, permissionSchema, roleSchema };
package/security.js CHANGED
@@ -1,2 +1 @@
1
1
  export * from '@alepha/security';
2
- //# sourceMappingURL=security.js.map
@@ -10,4 +10,3 @@ Object.keys(serverCookies).forEach(function (k) {
10
10
  get: function () { return serverCookies[k]; }
11
11
  });
12
12
  });
13
- //# sourceMappingURL=cookies.cjs.map
@@ -44,7 +44,7 @@ declare class ServerCookiesProvider {
44
44
  readonly onRequest: _alepha_core.HookDescriptor<"server:onRequest">;
45
45
  readonly onSend: _alepha_core.HookDescriptor<"server:onSend">;
46
46
  fromHeader(header: string): Record<string, string>;
47
- toHeader(cookies: Record<string, Cookie | null>): string[];
47
+ toHeader(cookies: Record<string, Cookie | null>, isHttps?: boolean): string[];
48
48
  }
49
49
 
50
50
  declare module "alepha/server" {
package/server/cookies.js CHANGED
@@ -1,2 +1 @@
1
1
  export * from '@alepha/server-cookies';
2
- //# sourceMappingURL=cookies.js.map
@@ -10,4 +10,3 @@ Object.keys(serverMetrics).forEach(function (k) {
10
10
  get: function () { return serverMetrics[k]; }
11
11
  });
12
12
  });
13
- //# sourceMappingURL=metrics.cjs.map
package/server/metrics.js CHANGED
@@ -1,2 +1 @@
1
1
  export * from '@alepha/server-metrics';
2
- //# sourceMappingURL=metrics.js.map
package/server/static.cjs CHANGED
@@ -10,4 +10,3 @@ Object.keys(serverStatic).forEach(function (k) {
10
10
  get: function () { return serverStatic[k]; }
11
11
  });
12
12
  });
13
- //# sourceMappingURL=static.cjs.map
@@ -94,6 +94,7 @@ declare class ServerStaticProvider {
94
94
  list(name: string): string[];
95
95
  serve(options: ServeDescriptorOptions): Promise<void>;
96
96
  createFileHandler(filepath: string, options: ServeDescriptorOptions): Promise<ServerHandler>;
97
+ protected getCacheFileTypes(): string[];
97
98
  protected getCacheControl(filename: string, options: ServeDescriptorOptions): {
98
99
  maxAge: number;
99
100
  immutable: boolean;
package/server/static.js CHANGED
@@ -1,2 +1 @@
1
1
  export * from '@alepha/server-static';
2
- //# sourceMappingURL=static.js.map
@@ -10,4 +10,3 @@ Object.keys(serverSwagger).forEach(function (k) {
10
10
  get: function () { return serverSwagger[k]; }
11
11
  });
12
12
  });
13
- //# sourceMappingURL=swagger.cjs.map
package/server/swagger.js CHANGED
@@ -1,2 +1 @@
1
1
  export * from '@alepha/server-swagger';
2
- //# sourceMappingURL=swagger.js.map
package/server.cjs CHANGED
@@ -10,4 +10,3 @@ Object.keys(server).forEach(function (k) {
10
10
  get: function () { return server[k]; }
11
11
  });
12
12
  });
13
- //# sourceMappingURL=server.cjs.map