@oneuptime/common 8.0.5386 → 8.0.5403

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 (85) hide show
  1. package/Models/AnalyticsModels/Index.ts +0 -2
  2. package/Models/DatabaseModels/TelemetryException.ts +0 -7
  3. package/Server/API/MicrosoftTeamsAPI.ts +5 -4
  4. package/Server/API/UserOnCallLogTimelineAPI.ts +21 -17
  5. package/Server/DatabaseConfig.ts +7 -2
  6. package/Server/EnvironmentConfig.ts +20 -7
  7. package/Server/Images/MicrosoftTeams/outline.png +0 -0
  8. package/Server/Infrastructure/GlobalCache.ts +12 -5
  9. package/Server/Services/AlertService.ts +0 -10
  10. package/Server/Services/AnalyticsDatabaseService.ts +5 -0
  11. package/Server/Services/IncidentService.ts +0 -10
  12. package/Server/Services/Index.ts +0 -2
  13. package/Server/Services/TeamMemberService.ts +11 -2
  14. package/Server/Services/TelemetryAttributeService.ts +261 -48
  15. package/Server/Utils/Monitor/MonitorResource.ts +0 -16
  16. package/Server/Utils/Telemetry/Telemetry.ts +0 -61
  17. package/Types/Permission.ts +0 -3
  18. package/UI/Components/Filters/FilterViewer.tsx +5 -1
  19. package/UI/Components/Filters/FiltersForm.tsx +8 -1
  20. package/UI/Components/List/List.tsx +4 -0
  21. package/UI/Components/LogsViewer/LogsViewer.tsx +102 -55
  22. package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +1 -1
  23. package/UI/Components/ModelTable/BaseModelTable.tsx +6 -0
  24. package/UI/Components/Table/Table.tsx +4 -0
  25. package/UI/Config.ts +28 -19
  26. package/UI/Utils/API/ApiDocsAPI.ts +6 -1
  27. package/UI/Utils/API/DashboardAPI.ts +2 -1
  28. package/UI/Utils/API/IdentityAPI.ts +6 -1
  29. package/build/dist/Models/AnalyticsModels/Index.js +0 -2
  30. package/build/dist/Models/AnalyticsModels/Index.js.map +1 -1
  31. package/build/dist/Models/DatabaseModels/TelemetryException.js +0 -7
  32. package/build/dist/Models/DatabaseModels/TelemetryException.js.map +1 -1
  33. package/build/dist/Server/API/MicrosoftTeamsAPI.js +5 -4
  34. package/build/dist/Server/API/MicrosoftTeamsAPI.js.map +1 -1
  35. package/build/dist/Server/API/UserOnCallLogTimelineAPI.js +6 -3
  36. package/build/dist/Server/API/UserOnCallLogTimelineAPI.js.map +1 -1
  37. package/build/dist/Server/DatabaseConfig.js +3 -2
  38. package/build/dist/Server/DatabaseConfig.js.map +1 -1
  39. package/build/dist/Server/EnvironmentConfig.js +8 -7
  40. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  41. package/build/dist/Server/Infrastructure/GlobalCache.js +11 -9
  42. package/build/dist/Server/Infrastructure/GlobalCache.js.map +1 -1
  43. package/build/dist/Server/Services/AlertService.js +0 -9
  44. package/build/dist/Server/Services/AlertService.js.map +1 -1
  45. package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
  46. package/build/dist/Server/Services/IncidentService.js +0 -9
  47. package/build/dist/Server/Services/IncidentService.js.map +1 -1
  48. package/build/dist/Server/Services/Index.js +0 -2
  49. package/build/dist/Server/Services/Index.js.map +1 -1
  50. package/build/dist/Server/Services/TeamMemberService.js +3 -2
  51. package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
  52. package/build/dist/Server/Services/TelemetryAttributeService.js +165 -46
  53. package/build/dist/Server/Services/TelemetryAttributeService.js.map +1 -1
  54. package/build/dist/Server/Utils/Monitor/MonitorResource.js +0 -15
  55. package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
  56. package/build/dist/Server/Utils/Telemetry/Telemetry.js +0 -41
  57. package/build/dist/Server/Utils/Telemetry/Telemetry.js.map +1 -1
  58. package/build/dist/Types/Permission.js +0 -2
  59. package/build/dist/Types/Permission.js.map +1 -1
  60. package/build/dist/UI/Components/Filters/FilterViewer.js +2 -2
  61. package/build/dist/UI/Components/Filters/FilterViewer.js.map +1 -1
  62. package/build/dist/UI/Components/Filters/FiltersForm.js +6 -1
  63. package/build/dist/UI/Components/Filters/FiltersForm.js.map +1 -1
  64. package/build/dist/UI/Components/List/List.js +1 -1
  65. package/build/dist/UI/Components/List/List.js.map +1 -1
  66. package/build/dist/UI/Components/LogsViewer/LogsViewer.js +43 -16
  67. package/build/dist/UI/Components/LogsViewer/LogsViewer.js.map +1 -1
  68. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js +1 -1
  69. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js.map +1 -1
  70. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +2 -2
  71. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  72. package/build/dist/UI/Components/Table/Table.js +1 -1
  73. package/build/dist/UI/Components/Table/Table.js.map +1 -1
  74. package/build/dist/UI/Config.js +20 -19
  75. package/build/dist/UI/Config.js.map +1 -1
  76. package/build/dist/UI/Utils/API/ApiDocsAPI.js +2 -1
  77. package/build/dist/UI/Utils/API/ApiDocsAPI.js.map +1 -1
  78. package/build/dist/UI/Utils/API/DashboardAPI.js +2 -1
  79. package/build/dist/UI/Utils/API/DashboardAPI.js.map +1 -1
  80. package/build/dist/UI/Utils/API/IdentityAPI.js +2 -1
  81. package/build/dist/UI/Utils/API/IdentityAPI.js.map +1 -1
  82. package/package.json +1 -1
  83. package/Models/AnalyticsModels/TelemetryAttribute.ts +0 -164
  84. package/build/dist/Models/AnalyticsModels/TelemetryAttribute.js +0 -154
  85. package/build/dist/Models/AnalyticsModels/TelemetryAttribute.js.map +0 -1
@@ -2,7 +2,6 @@ import AnalyticsBaseModel from "./AnalyticsBaseModel/AnalyticsBaseModel";
2
2
  import Log from "./Log";
3
3
  import Metric from "./Metric";
4
4
  import Span from "./Span";
5
- import TelemetryAttribute from "./TelemetryAttribute";
6
5
  import ExceptionInstance from "./ExceptionInstance";
7
6
  import MonitorLog from "./MonitorLog";
8
7
 
@@ -10,7 +9,6 @@ const AnalyticsModels: Array<{ new (): AnalyticsBaseModel }> = [
10
9
  Log,
11
10
  Span,
12
11
  Metric,
13
- TelemetryAttribute,
14
12
  ExceptionInstance,
15
13
  MonitorLog,
16
14
  ];
@@ -8,7 +8,6 @@ import ColumnLength from "../../Types/Database/ColumnLength";
8
8
  import ColumnType from "../../Types/Database/ColumnType";
9
9
  import CrudApiEndpoint from "../../Types/Database/CrudApiEndpoint";
10
10
  import EnableDocumentation from "../../Types/Database/EnableDocumentation";
11
- import EnableWorkflow from "../../Types/Database/EnableWorkflow";
12
11
  import TableColumn from "../../Types/Database/TableColumn";
13
12
  import TableColumnType from "../../Types/Database/TableColumnType";
14
13
  import TableMetadata from "../../Types/Database/TableMetadata";
@@ -45,12 +44,6 @@ import TelemetryService from "./TelemetryService";
45
44
  Permission.EditTelemetryException,
46
45
  ],
47
46
  })
48
- @EnableWorkflow({
49
- create: true,
50
- delete: true,
51
- update: true,
52
- read: true,
53
- })
54
47
  @CrudApiEndpoint(new Route("/telemetry-exception-status"))
55
48
  @TableMetadata({
56
49
  tableName: "TelemetryException",
@@ -75,12 +75,13 @@ export default class MicrosoftTeamsAPI {
75
75
  },
76
76
  description: {
77
77
  short: "Complete open-source monitoring and observability platform. ",
78
- full: `OneUptime is a comprehensive solution for monitoring and managing your online services. Whether you need to check the availability of your website, dashboard, API, or any other online resource, OneUptime can alert your team when downtime happens and keep your customers informed with a status page. OneUptime also helps you handle incidents, set up on-call rotations, run tests, secure your services, analyze logs, track performance, and debug errors.
78
+ full: `<p>OneUptime is a comprehensive solution for monitoring and managing your online services. Whether you need to check the availability of your website, dashboard, API, or any other online resource, OneUptime can alert your team when downtime happens and keep your customers informed with a status page. OneUptime also helps you handle incidents, set up on-call rotations, run tests, secure your services, analyze logs, track performance, and debug errors.</p>
79
79
 
80
- In order to use the app, you need to have an active account with OneUptime at https://oneuptime.com. Please send an email to support@oneupitme.com if you need more details.
80
+ <p>In order to use the app, you need to have an active account with <a href="https://oneuptime.com" target="_blank">OneUptime</a>. Please send an email to <a href="mailto:support@oneuptime.com">support@oneuptime.com</a> if you need more details.</p>
81
81
 
82
- Create a new OneUptime Account: If you wish to sign up for a new account, you can do so at https://oneuptime.com and click on Sign up.
83
- Help and Support: You can reach out to help and support here: https://oneuptime.com/support or contact support@oneuptime.com
82
+ <p><strong>Create a new OneUptime Account:</strong> If you wish to sign up for a new account, you can do so by visiting <a href="https://oneuptime.com" target="_blank">OneUptime Sign Up</a>.</p>
83
+
84
+ <p><strong>Help and Support:</strong> You can reach out to help and support via <a href="https://oneuptime.com/support" target="_blank">Support Page</a> or contact <a href="mailto:support@oneuptime.com">support@oneuptime.com</a>.</p>
84
85
  `,
85
86
  },
86
87
  // Default to size-specific names; route will adjust if fallbacks are used
@@ -236,12 +236,16 @@ export default class UserNotificationLogTimelineAPI extends BaseAPI<
236
236
  if (timelineItem.isAcknowledged) {
237
237
  // already acknowledged. Then show already acknowledged page with view details button.
238
238
 
239
+ const viewDetailsRoute: Route = new Route(
240
+ DashboardRoute.toString(),
241
+ ).addRoute(
242
+ `/${timelineItem.projectId?.toString()}/${timelineItem.triggeredByIncidentId ? "incidents" : "alerts"}/${timelineItem.triggeredByIncidentId ? timelineItem.triggeredByIncidentId!.toString() : timelineItem.triggeredByAlertId!.toString()}`,
243
+ );
244
+
239
245
  const viewDetailsUrl: URL = new URL(
240
246
  httpProtocol,
241
247
  host,
242
- DashboardRoute.addRoute(
243
- `/${timelineItem.projectId?.toString()}/${timelineItem.triggeredByIncidentId ? "incidents" : "alerts"}/${timelineItem.triggeredByIncidentId ? timelineItem.triggeredByIncidentId!.toString() : timelineItem.triggeredByAlertId!.toString()}`,
244
- ),
248
+ viewDetailsRoute,
245
249
  );
246
250
 
247
251
  return Response.render(
@@ -273,30 +277,30 @@ export default class UserNotificationLogTimelineAPI extends BaseAPI<
273
277
  // redirect to dashboard to incidents page.
274
278
 
275
279
  if (timelineItem.triggeredByIncidentId) {
280
+ const incidentRoute: Route = new Route(
281
+ DashboardRoute.toString(),
282
+ ).addRoute(
283
+ `/${timelineItem.projectId?.toString()}/incidents/${timelineItem.triggeredByIncidentId!.toString()}`,
284
+ );
285
+
276
286
  return Response.redirect(
277
287
  req,
278
288
  res,
279
- new URL(
280
- httpProtocol,
281
- host,
282
- DashboardRoute.addRoute(
283
- `/${timelineItem.projectId?.toString()}/incidents/${timelineItem.triggeredByIncidentId!.toString()}`,
284
- ),
285
- ),
289
+ new URL(httpProtocol, host, incidentRoute),
286
290
  );
287
291
  }
288
292
 
289
293
  if (timelineItem.triggeredByAlertId) {
294
+ const alertRoute: Route = new Route(
295
+ DashboardRoute.toString(),
296
+ ).addRoute(
297
+ `/${timelineItem.projectId?.toString()}/alerts/${timelineItem.triggeredByAlertId!.toString()}`,
298
+ );
299
+
290
300
  return Response.redirect(
291
301
  req,
292
302
  res,
293
- new URL(
294
- httpProtocol,
295
- host,
296
- DashboardRoute.addRoute(
297
- `/${timelineItem.projectId?.toString()}/alerts/${timelineItem.triggeredByAlertId!.toString()}`,
298
- ),
299
- ),
303
+ new URL(httpProtocol, host, alertRoute),
300
304
  );
301
305
  }
302
306
 
@@ -3,6 +3,7 @@ import { AccountsRoute, DashboardRoute } from "../ServiceRoute";
3
3
  import Hostname from "../Types/API/Hostname";
4
4
  import Protocol from "../Types/API/Protocol";
5
5
  import URL from "../Types/API/URL";
6
+ import Route from "../Types/API/Route";
6
7
  import BadDataException from "../Types/Exception/BadDataException";
7
8
  import { JSONValue } from "../Types/JSON";
8
9
  import GlobalConfig from "../Models/DatabaseModels/GlobalConfig";
@@ -56,7 +57,11 @@ export default class DatabaseConfig {
56
57
  @CaptureSpan()
57
58
  public static async getAccountsUrl(): Promise<URL> {
58
59
  const host: Hostname = await DatabaseConfig.getHost();
59
- return new URL(await DatabaseConfig.getHttpProtocol(), host, AccountsRoute);
60
+ return new URL(
61
+ await DatabaseConfig.getHttpProtocol(),
62
+ host,
63
+ new Route(AccountsRoute.toString()),
64
+ );
60
65
  }
61
66
 
62
67
  @CaptureSpan()
@@ -65,7 +70,7 @@ export default class DatabaseConfig {
65
70
  return new URL(
66
71
  await DatabaseConfig.getHttpProtocol(),
67
72
  host,
68
- DashboardRoute,
73
+ new Route(DashboardRoute.toString()),
69
74
  );
70
75
  }
71
76
 
@@ -10,6 +10,7 @@ import {
10
10
  import BillingConfig from "./BillingConfig";
11
11
  import Protocol from "../Types/API/Protocol";
12
12
  import URL from "../Types/API/URL";
13
+ import Route from "../Types/API/Route";
13
14
  import SubscriptionPlan from "../Types/Billing/SubscriptionPlan";
14
15
  import Email from "../Types/Email";
15
16
  import { JSONObject } from "../Types/JSON";
@@ -303,32 +304,44 @@ export const NotificationSlackWebhookOnSubscriptionUpdate: string =
303
304
  export const AdminDashboardClientURL: URL = new URL(
304
305
  HttpProtocol,
305
306
  Host,
306
- AdminDashboardRoute,
307
+ new Route(AdminDashboardRoute.toString()),
307
308
  );
308
309
 
309
- export const AppApiClientUrl: URL = new URL(HttpProtocol, Host, AppApiRoute);
310
+ export const AppApiClientUrl: URL = new URL(
311
+ HttpProtocol,
312
+ Host,
313
+ new Route(AppApiRoute.toString()),
314
+ );
310
315
 
311
316
  export const StatusPageApiClientUrl: URL = new URL(
312
317
  HttpProtocol,
313
318
  Host,
314
- StatusPageApiRoute,
319
+ new Route(StatusPageApiRoute.toString()),
315
320
  );
316
321
 
317
322
  export const DashboardClientUrl: URL = new URL(
318
323
  HttpProtocol,
319
324
  Host,
320
- DashboardRoute,
325
+ new Route(DashboardRoute.toString()),
321
326
  );
322
327
 
323
328
  export const AccountsClientUrl: URL = new URL(
324
329
  HttpProtocol,
325
330
  Host,
326
- AccountsRoute,
331
+ new Route(AccountsRoute.toString()),
327
332
  );
328
333
 
329
- export const HomeClientUrl: URL = new URL(HttpProtocol, Host, HomeRoute);
334
+ export const HomeClientUrl: URL = new URL(
335
+ HttpProtocol,
336
+ Host,
337
+ new Route(HomeRoute.toString()),
338
+ );
330
339
 
331
- export const DocsClientUrl: URL = new URL(HttpProtocol, Host, DocsRoute);
340
+ export const DocsClientUrl: URL = new URL(
341
+ HttpProtocol,
342
+ Host,
343
+ new Route(DocsRoute.toString()),
344
+ );
332
345
 
333
346
  export const DisableTelemetry: boolean =
334
347
  process.env["DISABLE_TELEMETRY"] === "true";
@@ -7,6 +7,10 @@ import { JSONArray, JSONObject } from "../../Types/JSON";
7
7
  import JSONFunctions from "../../Types/JSONFunctions";
8
8
  import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
9
9
 
10
+ type CacheSetOptions = {
11
+ expiresInSeconds: number;
12
+ };
13
+
10
14
  export default abstract class GlobalCache {
11
15
  @CaptureSpan()
12
16
  public static async getJSONObject(
@@ -56,8 +60,9 @@ export default abstract class GlobalCache {
56
60
  namespace: string,
57
61
  key: string,
58
62
  value: string[],
63
+ options?: CacheSetOptions,
59
64
  ): Promise<void> {
60
- await this.setString(namespace, key, JSON.stringify(value));
65
+ await this.setString(namespace, key, JSON.stringify(value), options);
61
66
  }
62
67
 
63
68
  @CaptureSpan()
@@ -136,11 +141,13 @@ export default abstract class GlobalCache {
136
141
  namespace: string,
137
142
  key: string,
138
143
  value: JSONObject,
144
+ options?: CacheSetOptions,
139
145
  ): Promise<void> {
140
146
  await this.setString(
141
147
  namespace,
142
148
  key,
143
149
  JSON.stringify(JSONFunctions.serialize(value)),
150
+ options,
144
151
  );
145
152
  }
146
153
 
@@ -149,6 +156,7 @@ export default abstract class GlobalCache {
149
156
  namespace: string,
150
157
  key: string,
151
158
  value: string,
159
+ options?: CacheSetOptions,
152
160
  ): Promise<void> {
153
161
  const client: ClientType | null = Redis.getClient();
154
162
 
@@ -157,9 +165,8 @@ export default abstract class GlobalCache {
157
165
  }
158
166
 
159
167
  await client.set(`${namespace}-${key}`, value);
160
- await client.expire(
161
- `${namespace}-${key}`,
162
- OneUptimeDate.getSecondsInDays(30),
163
- );
168
+ const expiresInSeconds: number =
169
+ options?.expiresInSeconds ?? OneUptimeDate.getSecondsInDays(30);
170
+ await client.expire(`${namespace}-${key}`, expiresInSeconds);
164
171
  }
165
172
  }
@@ -28,7 +28,6 @@ import AlertState from "../../Models/DatabaseModels/AlertState";
28
28
  import AlertStateTimeline from "../../Models/DatabaseModels/AlertStateTimeline";
29
29
  import User from "../../Models/DatabaseModels/User";
30
30
  import { IsBillingEnabled } from "../EnvironmentConfig";
31
- import TelemetryType from "../../Types/Telemetry/TelemetryType";
32
31
  import logger from "../Utils/Logger";
33
32
  import TelemetryUtil from "../Utils/Telemetry/Telemetry";
34
33
  import MetricService from "./MetricService";
@@ -1329,15 +1328,6 @@ ${alertSeverity.name}
1329
1328
  },
1330
1329
  });
1331
1330
 
1332
- // index attributes
1333
- TelemetryUtil.indexAttributes({
1334
- attributes: ["monitorId", "projectId", "alertId", "monitorName"],
1335
- projectId: alert.projectId,
1336
- telemetryType: TelemetryType.Metric,
1337
- }).catch((err: Error) => {
1338
- logger.error(err);
1339
- });
1340
-
1341
1331
  TelemetryUtil.indexMetricNameServiceNameMap({
1342
1332
  metricNameServiceNameMap: metricTypesMap,
1343
1333
  projectId: alert.projectId,
@@ -55,6 +55,11 @@ import Sort from "../Types/AnalyticsDatabase/Sort";
55
55
  import AggregatedModel from "../../Types/BaseDatabase/AggregatedModel";
56
56
  import ModelEventType from "../../Types/Realtime/ModelEventType";
57
57
 
58
+ export type Results = ResultSet<"JSON">;
59
+ export type DbJSONResponse = ResponseJSON<{
60
+ data?: Array<JSONObject>;
61
+ }>;
62
+
58
63
  export default class AnalyticsDatabaseService<
59
64
  TBaseModel extends AnalyticsBaseModel,
60
65
  > extends BaseService {
@@ -43,7 +43,6 @@ import Metric, {
43
43
  } from "../../Models/AnalyticsModels/Metric";
44
44
  import OneUptimeDate from "../../Types/Date";
45
45
  import TelemetryUtil from "../Utils/Telemetry/Telemetry";
46
- import TelemetryType from "../../Types/Telemetry/TelemetryType";
47
46
  import logger from "../Utils/Logger";
48
47
  import Semaphore, {
49
48
  SemaphoreMutex,
@@ -2162,15 +2161,6 @@ ${incidentSeverity.name}
2162
2161
  },
2163
2162
  });
2164
2163
 
2165
- // index attributes.
2166
- TelemetryUtil.indexAttributes({
2167
- attributes: ["monitorIds", "projectId", "incidentId", "monitorNames"],
2168
- projectId: incident.projectId,
2169
- telemetryType: TelemetryType.Metric,
2170
- }).catch((err: Error) => {
2171
- logger.error(err);
2172
- });
2173
-
2174
2164
  TelemetryUtil.indexMetricNameServiceNameMap({
2175
2165
  metricNameServiceNameMap: metricTypesMap,
2176
2166
  projectId: incident.projectId,
@@ -135,7 +135,6 @@ import WorkflowVariablesService from "./WorkflowVariableService";
135
135
  import AnalyticsBaseModel from "../../Models/AnalyticsModels/AnalyticsBaseModel/AnalyticsBaseModel";
136
136
  import CopilotPullRequestService from "./CopilotPullRequestService";
137
137
  import ServiceCatalogDependencyService from "./ServiceCatalogDependencyService";
138
- import TelemetryAttributeService from "./TelemetryAttributeService";
139
138
  import TelemetryExceptionService from "./TelemetryExceptionService";
140
139
  import ExceptionInstanceService from "./ExceptionInstanceService";
141
140
  import CopilotActionTypePriorityService from "./CopilotActionTypePriorityService";
@@ -356,7 +355,6 @@ export const AnalyticsServices: Array<
356
355
  LogService,
357
356
  SpanService,
358
357
  MetricService,
359
- TelemetryAttributeService,
360
358
  ExceptionInstanceService,
361
359
  MonitorLogService,
362
360
  ];
@@ -21,6 +21,7 @@ import { AccountsRoute } from "../../ServiceRoute";
21
21
  import Hostname from "../../Types/API/Hostname";
22
22
  import Protocol from "../../Types/API/Protocol";
23
23
  import URL from "../../Types/API/URL";
24
+ import Route from "../../Types/API/Route";
24
25
  import SubscriptionPlan, {
25
26
  PlanType,
26
27
  } from "../../Types/Billing/SubscriptionPlan";
@@ -151,10 +152,18 @@ export class TeamMemberService extends DatabaseService<TeamMember> {
151
152
  templateType: EmailTemplateType.InviteMember,
152
153
  vars: {
153
154
  signInLink: URL.fromString(
154
- new URL(httpProtocol, host, AccountsRoute).toString(),
155
+ new URL(
156
+ httpProtocol,
157
+ host,
158
+ new Route(AccountsRoute.toString()),
159
+ ).toString(),
155
160
  ).toString(),
156
161
  registerLink: URL.fromString(
157
- new URL(httpProtocol, host, AccountsRoute).toString(),
162
+ new URL(
163
+ httpProtocol,
164
+ host,
165
+ new Route(AccountsRoute.toString()),
166
+ ).toString(),
158
167
  )
159
168
  .addRoute("/register")
160
169
  .addQueryParam("email", email.toString(), true)