@rpcbase/server 0.600.0 → 0.601.0

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.
package/dist/email.d.ts CHANGED
@@ -19,10 +19,19 @@ export type SendEmailResult = {
19
19
  skippedReason: "missing_transport";
20
20
  error?: undefined;
21
21
  };
22
+ export type EmailTransport = {
23
+ send(params: SendEmailParams): Promise<SendEmailResult>;
24
+ };
25
+ export type ResendEmailTransportOptions = {
26
+ apiKey: string;
27
+ defaultFrom?: string;
28
+ };
22
29
  export type EmailDeliveryErrorCode = "missing_transport" | "provider_rejected" | "provider_unconfirmed" | "transport_error";
23
30
  export declare class EmailDeliveryError extends Error {
24
31
  readonly code: EmailDeliveryErrorCode;
25
32
  constructor(code: EmailDeliveryErrorCode, message: string, cause?: unknown);
26
33
  }
34
+ export declare const configureEmailTransport: (transport?: EmailTransport | null) => void;
35
+ export declare const createResendEmailTransport: ({ apiKey, defaultFrom, }: ResendEmailTransportOptions) => EmailTransport;
27
36
  export declare const sendEmail: (params: SendEmailParams, options?: SendEmailOptions) => Promise<SendEmailResult>;
28
37
  //# sourceMappingURL=email.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"email.d.ts","sourceRoot":"","sources":["../src/email.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,eAAe,GAAG;IAC5B,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CAC7B,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,gBAAgB,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;CACrC,CAAA;AAED,MAAM,MAAM,eAAe,GACvB;IACA,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,KAAK,CAAC;IACf,KAAK,CAAC,EAAE,SAAS,CAAC;CACnB,GACC;IACA,EAAE,EAAE,SAAS,CAAC;IACd,OAAO,EAAE,IAAI,CAAC;IACd,aAAa,EAAE,mBAAmB,CAAC;IACnC,KAAK,CAAC,EAAE,SAAS,CAAC;CACnB,CAAA;AAEH,MAAM,MAAM,sBAAsB,GAC9B,mBAAmB,GACnB,mBAAmB,GACnB,sBAAsB,GACtB,iBAAiB,CAAA;AAErB,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,QAAQ,CAAC,IAAI,EAAE,sBAAsB,CAAA;gBAEzB,IAAI,EAAE,sBAAsB,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;CAM3E;AAID,eAAO,MAAM,SAAS,GACpB,QAAQ,eAAe,EACvB,UAAS,gBAAqB,KAC7B,OAAO,CAAC,eAAe,CAuDzB,CAAA"}
1
+ {"version":3,"file":"email.d.ts","sourceRoot":"","sources":["../src/email.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,eAAe,GAAG;IAC5B,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CAC7B,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,gBAAgB,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;CACrC,CAAA;AAED,MAAM,MAAM,eAAe,GACvB;IACA,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,KAAK,CAAC;IACf,KAAK,CAAC,EAAE,SAAS,CAAC;CACnB,GACC;IACA,EAAE,EAAE,SAAS,CAAC;IACd,OAAO,EAAE,IAAI,CAAC;IACd,aAAa,EAAE,mBAAmB,CAAC;IACnC,KAAK,CAAC,EAAE,SAAS,CAAC;CACnB,CAAA;AAEH,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;CACzD,CAAA;AAED,MAAM,MAAM,2BAA2B,GAAG;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAA;AAED,MAAM,MAAM,sBAAsB,GAC9B,mBAAmB,GACnB,mBAAmB,GACnB,sBAAsB,GACtB,iBAAiB,CAAA;AAErB,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,QAAQ,CAAC,IAAI,EAAE,sBAAsB,CAAA;gBAEzB,IAAI,EAAE,sBAAsB,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;CAM3E;AAsBD,eAAO,MAAM,uBAAuB,GAAI,YAAY,cAAc,GAAG,IAAI,KAAG,IAG3E,CAAA;AAED,eAAO,MAAM,0BAA0B,GAAI,0BAGxC,2BAA2B,KAAG,cAqDhC,CAAA;AAED,eAAO,MAAM,SAAS,GACpB,QAAQ,eAAe,EACvB,UAAS,gBAAqB,KAC7B,OAAO,CAAC,eAAe,CAuBzB,CAAA"}
package/dist/index.d.ts CHANGED
@@ -6,4 +6,5 @@ export * from './passwordHashStorage';
6
6
  export * from './ssrMiddleware';
7
7
  export type { HtmlOutlets } from './htmlTemplate';
8
8
  export * from './email';
9
+ export * from './serviceWorker';
9
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAA;AAC5B,cAAc,YAAY,CAAA;AAC1B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,uBAAuB,CAAA;AACrC,cAAc,iBAAiB,CAAA;AAC/B,YAAY,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AACjD,cAAc,SAAS,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAA;AAC5B,cAAc,YAAY,CAAA;AAC1B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,uBAAuB,CAAA;AACrC,cAAc,iBAAiB,CAAA;AAC/B,YAAY,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AACjD,cAAc,SAAS,CAAA;AACvB,cAAc,iBAAiB,CAAA"}
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { i as __toESM, n as sendEmail, r as __commonJSMin, t as EmailDeliveryError } from "./email-Co1GNjlT.js";
1
+ import { a as __commonJSMin, i as sendEmail, n as configureEmailTransport, o as __toESM, r as createResendEmailTransport, t as EmailDeliveryError } from "./email-CK8NNDQY.js";
2
2
  import { c as runRtsQuery, d as getDerivedKey, i as normalizeRtsQueryOptions, n as buildRtsAbilityFromRequest, o as resolveRtsRequestTenantId, r as isRtsRequestAuthorized, s as runRtsCount, t as RTS_QUERY_WINDOW_MAX_COUNT, u as syncAuthenticatedSessionMiddleware } from "./queryWindow-DP8zD0lb.js";
3
3
  import session from "express-session";
4
4
  import { RedisStore } from "connect-redis";
@@ -4152,6 +4152,149 @@ var developmentSessionMiddleware = (sessionMiddleware) => {
4152
4152
  };
4153
4153
  };
4154
4154
  //#endregion
4155
+ //#region src/serviceWorker.ts
4156
+ var RPCBASE_SERVICE_WORKER_PATH = "/rpcbase-service-worker.js";
4157
+ var RPCBASE_SERVICE_WORKER_MESSAGE_SOURCE = "@rpcbase/service-worker";
4158
+ var rpcbaseServiceWorkerSource = `
4159
+ const MESSAGE_SOURCE = ${JSON.stringify(RPCBASE_SERVICE_WORKER_MESSAGE_SOURCE)}
4160
+
4161
+ const getSameOriginWindowClients = async () => {
4162
+ const windowClients = await self.clients.matchAll({ type: "window", includeUncontrolled: true })
4163
+ return windowClients.filter((client) => {
4164
+ try {
4165
+ return new URL(client.url).origin === self.location.origin
4166
+ } catch {
4167
+ return false
4168
+ }
4169
+ })
4170
+ }
4171
+
4172
+ const normalizeMessage = (value) => {
4173
+ if (!value || typeof value !== "object") return null
4174
+ if (value.source !== MESSAGE_SOURCE || typeof value.type !== "string" || !value.type.trim()) return null
4175
+ return {
4176
+ source: MESSAGE_SOURCE,
4177
+ type: value.type.trim(),
4178
+ ...(value.payload === undefined ? {} : { payload: value.payload }),
4179
+ }
4180
+ }
4181
+
4182
+ const broadcastMessage = async (message, excludedClientId) => {
4183
+ const windowClients = await getSameOriginWindowClients()
4184
+ for (const client of windowClients) {
4185
+ if (client.id === excludedClientId) continue
4186
+ client.postMessage(message)
4187
+ }
4188
+ }
4189
+
4190
+ const showNotificationFromMessage = async (message) => {
4191
+ if (message.type !== "notifications.show") return false
4192
+ const payload = message.payload
4193
+ if (!payload || typeof payload !== "object") return false
4194
+ const title = typeof payload.title === "string" ? payload.title.trim() : ""
4195
+ if (!title) return false
4196
+ const options = payload.options && typeof payload.options === "object" ? payload.options : undefined
4197
+ await self.registration.showNotification(title, options)
4198
+ return true
4199
+ }
4200
+
4201
+ const getTargetUrl = (link, linkMode, client) => {
4202
+ try {
4203
+ if (linkMode === "merge_current_search" && client) {
4204
+ const currentUrl = new URL(client.url)
4205
+ const actionUrl = new URL(link, currentUrl)
4206
+ actionUrl.searchParams.forEach((value, key) => currentUrl.searchParams.set(key, value))
4207
+ if (actionUrl.hash) currentUrl.hash = actionUrl.hash
4208
+ return currentUrl.origin === self.location.origin ? currentUrl.href : null
4209
+ }
4210
+
4211
+ const targetUrl = new URL(link, self.location.origin)
4212
+ return targetUrl.origin === self.location.origin ? targetUrl.href : null
4213
+ } catch {
4214
+ return null
4215
+ }
4216
+ }
4217
+
4218
+ self.addEventListener("install", (event) => event.waitUntil(self.skipWaiting()))
4219
+
4220
+ self.addEventListener("activate", (event) => {
4221
+ event.waitUntil((async () => {
4222
+ await self.clients.claim()
4223
+ await broadcastMessage({ source: MESSAGE_SOURCE, type: "worker.ready" })
4224
+ })())
4225
+ })
4226
+
4227
+ self.addEventListener("message", (event) => {
4228
+ const message = normalizeMessage(event.data)
4229
+ if (!message) return
4230
+
4231
+ event.waitUntil((async () => {
4232
+ if (await showNotificationFromMessage(message)) return
4233
+ const sourceClientId = event.source && typeof event.source.id === "string"
4234
+ ? event.source.id
4235
+ : undefined
4236
+ await broadcastMessage(message, sourceClientId)
4237
+ })())
4238
+ })
4239
+
4240
+ self.addEventListener("push", (event) => {
4241
+ let message = null
4242
+ try {
4243
+ message = normalizeMessage(event.data ? event.data.json() : null)
4244
+ } catch {
4245
+ return
4246
+ }
4247
+ if (!message || message.type !== "notifications.show") return
4248
+ event.waitUntil(showNotificationFromMessage(message))
4249
+ })
4250
+
4251
+ self.addEventListener("notificationclick", (event) => {
4252
+ event.notification.close()
4253
+ event.waitUntil((async () => {
4254
+ const data = event.notification.data && typeof event.notification.data === "object"
4255
+ ? event.notification.data
4256
+ : {}
4257
+ const link = typeof data.link === "string" ? data.link.trim() : ""
4258
+ const linkMode = data.linkMode === "merge_current_search" ? "merge_current_search" : "navigate"
4259
+ const windowClients = await getSameOriginWindowClients()
4260
+ const client = windowClients.find((candidate) => candidate.focused) ?? windowClients[0]
4261
+
4262
+ if (!link) {
4263
+ if (client) await client.focus()
4264
+ return
4265
+ }
4266
+
4267
+ const targetUrl = getTargetUrl(link, linkMode, client)
4268
+ if (!targetUrl) return
4269
+
4270
+ if (client) {
4271
+ try {
4272
+ const navigatedClient = await client.navigate(targetUrl)
4273
+ await (navigatedClient ?? client).focus()
4274
+ return
4275
+ } catch {
4276
+ await self.clients.openWindow(targetUrl)
4277
+ return
4278
+ }
4279
+ }
4280
+
4281
+ await self.clients.openWindow(targetUrl)
4282
+ })())
4283
+ })
4284
+ `.trimStart();
4285
+ var rpcbaseServiceWorkerRequestHandler = (_req, res) => {
4286
+ res.set({
4287
+ "Cache-Control": "no-cache",
4288
+ "Content-Type": "application/javascript; charset=utf-8",
4289
+ "Service-Worker-Allowed": "/",
4290
+ "X-Content-Type-Options": "nosniff"
4291
+ });
4292
+ res.send(rpcbaseServiceWorkerSource);
4293
+ };
4294
+ var registerRpcbaseServiceWorkerRoute = (app) => {
4295
+ app.get(RPCBASE_SERVICE_WORKER_PATH, rpcbaseServiceWorkerRequestHandler);
4296
+ };
4297
+ //#endregion
4155
4298
  //#region src/initServer.ts
4156
4299
  process.env = {
4157
4300
  ...env,
@@ -4228,6 +4371,7 @@ var initServer = async (app, serverEnv) => {
4228
4371
  }
4229
4372
  next();
4230
4373
  });
4374
+ registerRpcbaseServiceWorkerRoute(app);
4231
4375
  metricsIngestProxyMiddleware(app);
4232
4376
  const posthog = getPosthogClient(serverEnv);
4233
4377
  if (posthog) {
@@ -4615,8 +4759,6 @@ async function applyRouteLoaders(req, res, dataRoutes) {
4615
4759
  statusCode: 200
4616
4760
  };
4617
4761
  const runLoaderWithTimeout = async (route, params) => {
4618
- await resolveLazyRoute(route);
4619
- if (!route.loader) return null;
4620
4762
  let timeoutId;
4621
4763
  const timeoutPromise = new Promise((_, reject) => {
4622
4764
  timeoutId = setTimeout(() => {
@@ -4636,6 +4778,8 @@ async function applyRouteLoaders(req, res, dataRoutes) {
4636
4778
  });
4637
4779
  const loaderPromise = (async () => {
4638
4780
  try {
4781
+ await resolveLazyRoute(route);
4782
+ if (!route.loader) return null;
4639
4783
  const data = await route.loader({
4640
4784
  params,
4641
4785
  ctx: {
@@ -5374,6 +5518,6 @@ var ssrMiddleware = ({ viteInstance, dataRoutes, errorExtraComponent, getHtmlOut
5374
5518
  }
5375
5519
  };
5376
5520
  //#endregion
5377
- export { EmailDeliveryError, bindShutdownSignals, getDerivedKey, hashPassword, hashPasswordForStorage, initServer, onShutdown, sendEmail, ssrMiddleware, verifyPasswordFromStorage };
5521
+ export { EmailDeliveryError, RPCBASE_SERVICE_WORKER_MESSAGE_SOURCE, RPCBASE_SERVICE_WORKER_PATH, bindShutdownSignals, configureEmailTransport, createResendEmailTransport, getDerivedKey, hashPassword, hashPasswordForStorage, initServer, onShutdown, registerRpcbaseServiceWorkerRoute, rpcbaseServiceWorkerRequestHandler, rpcbaseServiceWorkerSource, sendEmail, ssrMiddleware, verifyPasswordFromStorage };
5378
5522
 
5379
5523
  //# sourceMappingURL=index.js.map