xquik-convex 0.2.0 → 0.2.1

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 (98) hide show
  1. package/README.md +1 -1
  2. package/dist/client.d.ts +103 -0
  3. package/dist/client.d.ts.map +1 -0
  4. package/dist/client.js +73 -0
  5. package/dist/client.js.map +1 -0
  6. package/dist/component/_generated/api.d.ts +4 -0
  7. package/dist/component/_generated/api.d.ts.map +1 -1
  8. package/dist/component/_generated/api.js.map +1 -1
  9. package/dist/component/access.d.ts +1 -1
  10. package/dist/component/access.d.ts.map +1 -1
  11. package/dist/component/access.js +3 -3
  12. package/dist/component/access.js.map +1 -1
  13. package/dist/component/crons.d.ts +3 -2
  14. package/dist/component/crons.d.ts.map +1 -1
  15. package/dist/component/crons.js +6 -3
  16. package/dist/component/crons.js.map +1 -1
  17. package/dist/component/delivery.d.ts +51 -16
  18. package/dist/component/delivery.d.ts.map +1 -1
  19. package/dist/component/delivery.js +71 -41
  20. package/dist/component/delivery.js.map +1 -1
  21. package/dist/component/events.d.ts +3 -19
  22. package/dist/component/events.d.ts.map +1 -1
  23. package/dist/component/events.js +21 -17
  24. package/dist/component/events.js.map +1 -1
  25. package/dist/component/http.d.ts +3 -3
  26. package/dist/component/http.d.ts.map +1 -1
  27. package/dist/component/http.js +46 -23
  28. package/dist/component/http.js.map +1 -1
  29. package/dist/component/job.d.ts +101 -0
  30. package/dist/component/job.d.ts.map +1 -0
  31. package/dist/component/job.js +102 -0
  32. package/dist/component/job.js.map +1 -0
  33. package/dist/component/jobs.d.ts +36 -107
  34. package/dist/component/jobs.d.ts.map +1 -1
  35. package/dist/component/jobs.js +109 -121
  36. package/dist/component/jobs.js.map +1 -1
  37. package/dist/component/operation.d.ts +6 -3
  38. package/dist/component/operation.d.ts.map +1 -1
  39. package/dist/component/operation.js +8 -3
  40. package/dist/component/operation.js.map +1 -1
  41. package/dist/component/operations.d.ts +1331 -190
  42. package/dist/component/operations.d.ts.map +1 -1
  43. package/dist/component/operations.js +2 -191
  44. package/dist/component/operations.js.map +1 -1
  45. package/dist/component/registry.d.ts +14 -0
  46. package/dist/component/registry.d.ts.map +1 -0
  47. package/dist/component/registry.js +154 -0
  48. package/dist/component/registry.js.map +1 -0
  49. package/dist/component/registry.json +14402 -46998
  50. package/dist/component/request.d.ts +12 -18
  51. package/dist/component/request.d.ts.map +1 -1
  52. package/dist/component/request.js +94 -169
  53. package/dist/component/request.js.map +1 -1
  54. package/dist/component/schema.d.ts +37 -36
  55. package/dist/component/schema.d.ts.map +1 -1
  56. package/dist/component/schema.js +30 -29
  57. package/dist/component/schema.js.map +1 -1
  58. package/dist/component/shape.d.ts +12 -10
  59. package/dist/component/shape.d.ts.map +1 -1
  60. package/dist/component/shape.js +30 -18
  61. package/dist/component/shape.js.map +1 -1
  62. package/dist/component/values.d.ts +10 -8
  63. package/dist/component/values.d.ts.map +1 -1
  64. package/dist/component/values.js +15 -10
  65. package/dist/component/values.js.map +1 -1
  66. package/dist/component/webhooks.d.ts +49 -39
  67. package/dist/component/webhooks.d.ts.map +1 -1
  68. package/dist/component/webhooks.js +91 -77
  69. package/dist/component/webhooks.js.map +1 -1
  70. package/dist/test.d.ts +41 -40
  71. package/dist/test.d.ts.map +1 -1
  72. package/dist/test.js +5 -3
  73. package/dist/test.js.map +1 -1
  74. package/package.json +26 -10
  75. package/src/client.ts +129 -0
  76. package/src/component/_generated/api.ts +4 -0
  77. package/src/component/access.ts +3 -3
  78. package/src/component/crons.ts +7 -4
  79. package/src/component/delivery.ts +93 -42
  80. package/src/component/events.ts +23 -18
  81. package/src/component/http.ts +59 -21
  82. package/src/component/job.ts +131 -0
  83. package/src/component/jobs.ts +131 -143
  84. package/src/component/operation.ts +16 -5
  85. package/src/component/operations.ts +193 -191
  86. package/src/component/registry.json +14402 -46998
  87. package/src/component/registry.ts +184 -0
  88. package/src/component/request.ts +121 -170
  89. package/src/component/schema.ts +33 -34
  90. package/src/component/shape.ts +49 -25
  91. package/src/component/values.ts +19 -10
  92. package/src/component/webhooks.ts +120 -78
  93. package/src/test.ts +8 -5
  94. package/dist/client/index.d.ts +0 -85
  95. package/dist/client/index.d.ts.map +0 -1
  96. package/dist/client/index.js +0 -50
  97. package/dist/client/index.js.map +0 -1
  98. package/src/client/index.ts +0 -97
@@ -1,38 +1,42 @@
1
- import { paginationOptsValidator, paginationResultValidator } from "convex/server";
2
- import { v } from "convex/values";
3
1
  import { env, query } from "./_generated/server.js";
4
- import { requireApiKey } from "./access.js";
2
+ import { paginationOptsValidator, paginationResultValidator } from "convex/server";
3
+ import requireApiKey from "./access.js";
5
4
  import schema from "./schema.js";
6
- export const eventDoc = schema.tables.events.validator.extend({
7
- _id: v.id("events"),
5
+ import { v } from "convex/values";
6
+ const eventDoc = schema.tables.events.validator.extend({
8
7
  _creationTime: v.number(),
8
+ _id: v.id("events"),
9
9
  });
10
- export const list = query({
10
+ const eventFilter = v.union(v.object({ eventType: v.string() }), v.object({ monitorId: v.string() }));
11
+ const list = query({
11
12
  args: {
13
+ filter: v.optional(eventFilter),
12
14
  paginationOpts: paginationOptsValidator,
13
- filter: v.optional(v.union(v.object({ eventType: v.string() }), v.object({ monitorId: v.string() }))),
14
15
  },
15
- returns: paginationResultValidator(eventDoc),
16
- handler: async (ctx, { paginationOpts, filter }) => {
16
+ handler: async (ctx, { filter, paginationOpts }) => {
17
17
  requireApiKey(env.XQUIK_API_KEY);
18
18
  const events = ctx.db.query("events");
19
- const ordered = filter === undefined
20
- ? events.withIndex("by_occurred")
21
- : "eventType" in filter
22
- ? events.withIndex("by_type", (q) => q.eq("eventType", filter.eventType))
23
- : events.withIndex("by_monitor", (q) => q.eq("monitorId", filter.monitorId));
19
+ let ordered = events.withIndex("by_occurred");
20
+ if (typeof filter === "object" && "eventType" in filter) {
21
+ ordered = events.withIndex("by_type", (range) => range.eq("eventType", filter.eventType));
22
+ }
23
+ if (typeof filter === "object" && "monitorId" in filter) {
24
+ ordered = events.withIndex("by_monitor", (range) => range.eq("monitorId", filter.monitorId));
25
+ }
24
26
  return await ordered.order("desc").paginate(paginationOpts);
25
27
  },
28
+ returns: paginationResultValidator(eventDoc),
26
29
  });
27
- export const get = query({
30
+ const get = query({
28
31
  args: { streamEventId: v.string() },
29
- returns: v.union(v.null(), eventDoc),
30
32
  handler: async (ctx, { streamEventId }) => {
31
33
  requireApiKey(env.XQUIK_API_KEY);
32
34
  return await ctx.db
33
35
  .query("events")
34
- .withIndex("by_stream_event", (q) => q.eq("streamEventId", streamEventId))
36
+ .withIndex("by_stream_event", (range) => range.eq("streamEventId", streamEventId))
35
37
  .unique();
36
38
  },
39
+ returns: v.union(v.null(), eventDoc),
37
40
  });
41
+ export { get, list };
38
42
  //# sourceMappingURL=events.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/component/events.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AACnF,OAAO,EAAE,CAAC,EAAE,MAAM,eAAe,CAAC;AAClC,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,MAAM,MAAM,aAAa,CAAC;AAEjC,MAAM,CAAC,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC;IAC5D,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC;IACnB,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE;CAC1B,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,IAAI,GAAG,KAAK,CAAC;IACxB,IAAI,EAAE;QACJ,cAAc,EAAE,uBAAuB;QACvC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;KACtG;IACD,OAAO,EAAE,yBAAyB,CAAC,QAAQ,CAAC;IAC5C,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,cAAc,EAAE,MAAM,EAAE,EAAE,EAAE;QACjD,aAAa,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QACjC,MAAM,MAAM,GAAG,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACtC,MAAM,OAAO,GACX,MAAM,KAAK,SAAS;YAClB,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,aAAa,CAAC;YACjC,CAAC,CAAC,WAAW,IAAI,MAAM;gBACrB,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;gBACzE,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,YAAY,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;QACnF,OAAO,MAAM,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;IAC9D,CAAC;CACF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,GAAG,GAAG,KAAK,CAAC;IACvB,IAAI,EAAE,EAAE,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE;IACnC,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,QAAQ,CAAC;IACpC,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE;QACxC,aAAa,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QACjC,OAAO,MAAM,GAAG,CAAC,EAAE;aAChB,KAAK,CAAC,QAAQ,CAAC;aACf,SAAS,CAAC,iBAAiB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,eAAe,EAAE,aAAa,CAAC,CAAC;aACzE,MAAM,EAAE,CAAC;IACd,CAAC;CACF,CAAC,CAAC"}
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/component/events.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,uBAAuB,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AACnF,OAAO,aAAa,MAAM,aAAa,CAAC;AACxC,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,CAAC,EAAE,MAAM,eAAe,CAAC;AAElC,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC;IACrD,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE;IACzB,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC;CACpB,CAAC,CAAC;AAEH,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;AAEtG,MAAM,IAAI,GAAG,KAAK,CAAC;IACjB,IAAI,EAAE;QACJ,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC;QAC/B,cAAc,EAAE,uBAAuB;KACxC;IACD,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,EAAE,EAAE;QACjD,aAAa,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QACjC,MAAM,MAAM,GAAG,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACtC,IAAI,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QAC9C,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,WAAW,IAAI,MAAM,EAAE,CAAC;YACxD,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;QAC5F,CAAC;QACD,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,WAAW,IAAI,MAAM,EAAE,CAAC;YACxD,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,YAAY,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;QAC/F,CAAC;QACD,OAAO,MAAM,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;IAC9D,CAAC;IACD,OAAO,EAAE,yBAAyB,CAAC,QAAQ,CAAC;CAC7C,CAAC,CAAC;AAEH,MAAM,GAAG,GAAG,KAAK,CAAC;IAChB,IAAI,EAAE,EAAE,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE;IACnC,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE;QACxC,aAAa,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QACjC,OAAO,MAAM,GAAG,CAAC,EAAE;aAChB,KAAK,CAAC,QAAQ,CAAC;aACf,SAAS,CAAC,iBAAiB,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,eAAe,EAAE,aAAa,CAAC,CAAC;aACjF,MAAM,EAAE,CAAC;IACd,CAAC;IACD,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,QAAQ,CAAC;CACrC,CAAC,CAAC;AAEH,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC"}
@@ -1,4 +1,4 @@
1
- export declare const receive: import("convex/server").PublicHttpAction;
2
- declare const http: import("convex/server").HttpRouter;
3
- export default http;
1
+ import type { HttpRouter } from "convex/server";
2
+ declare const _default: HttpRouter;
3
+ export default _default;
4
4
  //# sourceMappingURL=http.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/component/http.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,OAAO,0CAelB,CAAC;AAEH,QAAA,MAAM,IAAI,oCAAe,CAAC;AAI1B,eAAe,IAAI,CAAC"}
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/component/http.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;;AA+DhD,wBAAwB"}
@@ -1,30 +1,53 @@
1
+ import { check, readDelivery } from "./delivery.js";
2
+ import { httpAction } from "./_generated/server.js";
1
3
  import { httpRouter } from "convex/server";
2
4
  import { internal } from "./_generated/api.js";
3
- import { httpAction } from "./_generated/server.js";
4
- import { check, readDelivery } from "./delivery.js";
5
+ const OK = 200;
6
+ const BAD_REQUEST = 400;
7
+ const UNAUTHORIZED = 401;
8
+ const NOT_FOUND = 404;
9
+ const SLASH = "/";
5
10
  function reply(status, text) {
6
- return new Response(text, { status, headers: { "content-type": "text/plain" } });
11
+ return new Response(text, { headers: { "content-type": "text/plain" }, status });
7
12
  }
8
- export const receive = httpAction(async (ctx, request) => {
9
- const path = new URL(request.url).pathname;
10
- const endpoint = await ctx.runQuery(internal.webhooks.endpoint, { token: path.slice(path.lastIndexOf("/") + 1) });
11
- if (endpoint === null)
12
- return reply(404, "unknown webhook URL");
13
- const body = await request.arrayBuffer();
14
- const verdict = await check(endpoint.secret, request.headers, body, Date.now());
15
- if (!verdict.ok)
16
- return reply(401, verdict.reason);
13
+ function tokenOf(url) {
14
+ const { pathname } = new URL(url);
15
+ return pathname.slice(pathname.lastIndexOf(SLASH) + SLASH.length);
16
+ }
17
+ async function admit(secret, headers, body) {
18
+ const verdict = await check(secret, headers, body, Date.now());
19
+ if (!verdict.ok) {
20
+ return { ok: false, reason: verdict.reason, status: UNAUTHORIZED };
21
+ }
17
22
  const delivery = readDelivery(new TextDecoder().decode(body));
18
- if (delivery === null)
19
- return reply(400, "not an Xquik delivery");
20
- const outcome = await ctx.runMutation(internal.webhooks.ingest, {
21
- endpointId: endpoint._id,
22
- nonce: verdict.nonce,
23
- event: delivery.kind === "test" ? null : delivery.event,
24
- });
25
- return outcome === "replay" ? reply(401, "replayed nonce") : reply(200, outcome);
23
+ if (delivery.kind === "invalid") {
24
+ return { ok: false, reason: "not an Xquik delivery", status: BAD_REQUEST };
25
+ }
26
+ return { delivery, nonce: verdict.nonce, ok: true };
27
+ }
28
+ function answer(outcome) {
29
+ if (outcome === "replay") {
30
+ return reply(UNAUTHORIZED, "replayed nonce");
31
+ }
32
+ return reply(OK, outcome);
33
+ }
34
+ const receive = httpAction(async (ctx, request) => {
35
+ const endpoint = await ctx.runQuery(internal.webhooks.endpoint, { token: tokenOf(request.url) });
36
+ if (endpoint === null) {
37
+ return reply(NOT_FOUND, "unknown webhook URL");
38
+ }
39
+ const admission = await admit(endpoint.secret, request.headers, await request.arrayBuffer());
40
+ if (!admission.ok) {
41
+ return reply(admission.status, admission.reason);
42
+ }
43
+ const { _id: endpointId } = endpoint;
44
+ const { delivery, nonce } = admission;
45
+ return answer(await ctx.runMutation(internal.webhooks.ingest, { delivery, endpointId, nonce }));
26
46
  });
27
- const http = httpRouter();
28
- http.route({ pathPrefix: "/webhooks/", method: "POST", handler: receive });
29
- export default http;
47
+ function router() {
48
+ const http = httpRouter();
49
+ http.route({ handler: receive, method: "POST", pathPrefix: "/webhooks/" });
50
+ return http;
51
+ }
52
+ export default router();
30
53
  //# sourceMappingURL=http.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/component/http.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAkB,MAAM,wBAAwB,CAAC;AACpE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAEpD,SAAS,KAAK,CAAC,MAAc,EAAE,IAAY;IACzC,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE,EAAE,CAAC,CAAC;AACnF,CAAC;AAED,MAAM,CAAC,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,EAAE,GAAc,EAAE,OAAgB,EAAqB,EAAE;IAC9F,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC;IAC3C,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;IAClH,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC,GAAG,EAAE,qBAAqB,CAAC,CAAC;IAChE,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,WAAW,EAAE,CAAC;IACzC,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAChF,IAAI,CAAC,OAAO,CAAC,EAAE;QAAE,OAAO,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IACnD,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9D,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC,GAAG,EAAE,uBAAuB,CAAC,CAAC;IAClE,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE;QAC9D,UAAU,EAAE,QAAQ,CAAC,GAAG;QACxB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,KAAK,EAAE,QAAQ,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK;KACxD,CAAC,CAAC;IACH,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;AACnF,CAAC,CAAC,CAAC;AAEH,MAAM,IAAI,GAAG,UAAU,EAAE,CAAC;AAE1B,IAAI,CAAC,KAAK,CAAC,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;AAE3E,eAAe,IAAI,CAAC"}
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/component/http.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,101 @@
1
+ import type { Infer, Value } from "convex/values";
2
+ import type { jobStatus } from "./schema.js";
3
+ import type { Operation } from "./shape.js";
4
+ declare const jobDoc: import("convex/values").VObject<{
5
+ key?: string;
6
+ error?: Value;
7
+ everyMs?: number;
8
+ result?: Value;
9
+ scheduledId?: import("convex/values").GenericId<"_scheduled_functions">;
10
+ status: "failed" | "succeeded" | "canceled" | "scheduled";
11
+ args: Record<string, Value>;
12
+ operation: string;
13
+ attempts: number;
14
+ runs: number;
15
+ _creationTime: number;
16
+ _id: import("convex/values").GenericId<"jobs">;
17
+ }, {
18
+ args: import("convex/values").VRecord<Record<string, Value>, import("convex/values").VString<string, "required">, import("convex/values").Validator<Value, "required", string>, "required", string>;
19
+ attempts: import("convex/values").VFloat64<number, "required">;
20
+ error: import("convex/values").VId<Value | undefined, "optional"> | import("convex/values").VString<Value | undefined, "optional"> | import("convex/values").VFloat64<Value | undefined, "optional"> | import("convex/values").VInt64<Value | undefined, "optional"> | import("convex/values").VCommitTs<Value | undefined, "optional"> | import("convex/values").VBoolean<Value | undefined, "optional"> | import("convex/values").VNull<Value | undefined, "optional"> | import("convex/values").VAny<Value | undefined, "optional", string> | import("convex/values").VLiteral<Value | undefined, "optional"> | import("convex/values").VBytes<Value | undefined, "optional"> | import("convex/values").VObject<Value | undefined, Record<string, import("convex/values").Validator<any, import("convex/values").OptionalProperty, any>>, "optional", string> | import("convex/values").VArray<Value | undefined, import("convex/values").Validator<any, "required", any>, "optional"> | import("convex/values").VRecord<Value | undefined, import("convex/values").Validator<string, "required", any>, import("convex/values").Validator<any, "required", any>, "optional", string> | import("convex/values").VUnion<Value | undefined, import("convex/values").Validator<any, "required", any>[], "optional", string>;
21
+ everyMs: import("convex/values").VFloat64<number | undefined, "optional">;
22
+ key: import("convex/values").VString<string | undefined, "optional">;
23
+ operation: import("convex/values").VString<string, "required">;
24
+ result: import("convex/values").VId<Value | undefined, "optional"> | import("convex/values").VString<Value | undefined, "optional"> | import("convex/values").VFloat64<Value | undefined, "optional"> | import("convex/values").VInt64<Value | undefined, "optional"> | import("convex/values").VCommitTs<Value | undefined, "optional"> | import("convex/values").VBoolean<Value | undefined, "optional"> | import("convex/values").VNull<Value | undefined, "optional"> | import("convex/values").VAny<Value | undefined, "optional", string> | import("convex/values").VLiteral<Value | undefined, "optional"> | import("convex/values").VBytes<Value | undefined, "optional"> | import("convex/values").VObject<Value | undefined, Record<string, import("convex/values").Validator<any, import("convex/values").OptionalProperty, any>>, "optional", string> | import("convex/values").VArray<Value | undefined, import("convex/values").Validator<any, "required", any>, "optional"> | import("convex/values").VRecord<Value | undefined, import("convex/values").Validator<string, "required", any>, import("convex/values").Validator<any, "required", any>, "optional", string> | import("convex/values").VUnion<Value | undefined, import("convex/values").Validator<any, "required", any>[], "optional", string>;
25
+ runs: import("convex/values").VFloat64<number, "required">;
26
+ scheduledId: import("convex/values").VId<import("convex/values").GenericId<"_scheduled_functions"> | undefined, "optional">;
27
+ status: import("convex/values").VUnion<"failed" | "succeeded" | "canceled" | "scheduled", [import("convex/values").VLiteral<"scheduled", "required">, import("convex/values").VLiteral<"succeeded", "required">, import("convex/values").VLiteral<"failed", "required">, import("convex/values").VLiteral<"canceled", "required">], "required", never>;
28
+ _creationTime: import("convex/values").VFloat64<number, "required">;
29
+ _id: import("convex/values").VId<import("convex/values").GenericId<"jobs">, "required">;
30
+ }, "required", "key" | "error" | "status" | "_creationTime" | "_id" | "args" | "everyMs" | "operation" | "result" | "attempts" | "runs" | "scheduledId" | `error.${string}` | `args.${string}` | `result.${string}`>;
31
+ declare const failure: import("convex/values").VObject<{
32
+ retryAfterMs?: number;
33
+ error: Value;
34
+ ok: false;
35
+ retryable: boolean;
36
+ }, {
37
+ error: import("convex/values").Validator<Value, "required", string>;
38
+ ok: import("convex/values").VLiteral<false, "required">;
39
+ retryAfterMs: import("convex/values").VFloat64<number | undefined, "optional">;
40
+ retryable: import("convex/values").VBoolean<boolean, "required">;
41
+ }, "required", "error" | "ok" | `error.${string}` | "retryAfterMs" | "retryable">;
42
+ declare const outcome: import("convex/values").VUnion<{
43
+ ok: true;
44
+ result: Value;
45
+ } | {
46
+ retryAfterMs?: number;
47
+ error: Value;
48
+ ok: false;
49
+ retryable: boolean;
50
+ }, [import("convex/values").VObject<{
51
+ ok: true;
52
+ result: Value;
53
+ }, {
54
+ ok: import("convex/values").VLiteral<true, "required">;
55
+ result: import("convex/values").Validator<Value, "required", string>;
56
+ }, "required", "ok" | "result" | `result.${string}`>, import("convex/values").VObject<{
57
+ retryAfterMs?: number;
58
+ error: Value;
59
+ ok: false;
60
+ retryable: boolean;
61
+ }, {
62
+ error: import("convex/values").Validator<Value, "required", string>;
63
+ ok: import("convex/values").VLiteral<false, "required">;
64
+ retryAfterMs: import("convex/values").VFloat64<number | undefined, "optional">;
65
+ retryable: import("convex/values").VBoolean<boolean, "required">;
66
+ }, "required", "error" | "ok" | `error.${string}` | "retryAfterMs" | "retryable">], "required", "error" | "ok" | "result" | `error.${string}` | `result.${string}` | "retryAfterMs" | "retryable">;
67
+ type Outcome = Infer<typeof outcome>;
68
+ type Failure = Infer<typeof failure>;
69
+ type Attempt = {
70
+ readonly ok: true;
71
+ } | {
72
+ readonly ok: false;
73
+ readonly retryAfterMs?: number;
74
+ readonly retryable: boolean;
75
+ };
76
+ interface Plan {
77
+ readonly status: Infer<typeof jobStatus>;
78
+ readonly delayMs?: number;
79
+ readonly attempts: number;
80
+ }
81
+ declare function plan(job: {
82
+ readonly attempts: number;
83
+ readonly everyMs?: number;
84
+ }, result: Attempt): Plan;
85
+ declare function runsAfter(runs: number, next: Plan): number;
86
+ declare function isScheduled(job: {
87
+ readonly status: string;
88
+ } | null): job is {
89
+ readonly status: "scheduled";
90
+ };
91
+ declare function isLive(scheduled: {
92
+ readonly state: {
93
+ readonly kind: string;
94
+ };
95
+ } | null): boolean;
96
+ declare function requireInterval(everyMs: number | undefined): void;
97
+ declare function unexpected(id: string): Failure;
98
+ declare function failed(definition: Operation, error: unknown): Failure;
99
+ export { failed, isLive, isScheduled, jobDoc, outcome, plan, requireInterval, runsAfter, unexpected };
100
+ export type { Attempt, Failure, Outcome, Plan };
101
+ //# sourceMappingURL=job.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"job.d.ts","sourceRoot":"","sources":["../../src/component/job.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAElD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAe5C,QAAA,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;oNAAwF,CAAC;AAGrG,QAAA,MAAM,OAAO;;;;;;;;;;iFAKX,CAAC;AACH,QAAA,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;kMAA4B,CAAC;AAE1C,KAAK,OAAO,GAAG,KAAK,CAAC,OAAO,OAAO,CAAC,CAAC;AACrC,KAAK,OAAO,GAAG,KAAK,CAAC,OAAO,OAAO,CAAC,CAAC;AACrC,KAAK,OAAO,GACV;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAAC;AAE9G,UAAU,IAAI;IACZ,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,OAAO,SAAS,CAAC,CAAC;IACzC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,iBAAS,IAAI,CAAC,GAAG,EAAE;IAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI,CAelG;AAED,iBAAS,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,MAAM,CAKnD;AAED,iBAAS,WAAW,CAAC,GAAG,EAAE;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,GAAG,GAAG,IAAI;IAAE,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAA;CAAE,CAKrG;AAED,iBAAS,MAAM,CAAC,SAAS,EAAE;IAAE,QAAQ,CAAC,KAAK,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GAAG,IAAI,GAAG,OAAO,CAKxF;AAED,iBAAS,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAQ1D;AAwBD,iBAAS,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAGvC;AAED,iBAAS,MAAM,CAAC,UAAU,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAU9D;AAED,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC;AACtG,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC"}
@@ -0,0 +1,102 @@
1
+ import { ConvexError, v } from "convex/values";
2
+ import { isRecord } from "./shape.js";
3
+ import { json } from "./values.js";
4
+ import schema from "./schema.js";
5
+ const MAX_ATTEMPTS = 5;
6
+ const MIN_EVERY_MS = 60_000;
7
+ const ONE_ATTEMPT = 1;
8
+ const ONE_RUN = 1;
9
+ const NO_RETRIES = 0;
10
+ const FIRST_DELAY_MS = 1000;
11
+ const BACKOFF = 2;
12
+ const MS_PER_SECOND = 1000;
13
+ const TOO_MANY_REQUESTS = 429;
14
+ const SERVER_ERROR = 500;
15
+ const LIVE = new Set(["inProgress", "pending"]);
16
+ const jobDoc = schema.tables.jobs.validator.extend({ _creationTime: v.number(), _id: v.id("jobs") });
17
+ const success = v.object({ ok: v.literal(true), result: json });
18
+ const failure = v.object({
19
+ error: json,
20
+ ok: v.literal(false),
21
+ retryAfterMs: v.optional(v.number()),
22
+ retryable: v.boolean(),
23
+ });
24
+ const outcome = v.union(success, failure);
25
+ function plan(job, result) {
26
+ if (!result.ok && result.retryable && job.attempts + ONE_ATTEMPT < MAX_ATTEMPTS) {
27
+ return {
28
+ attempts: job.attempts + ONE_ATTEMPT,
29
+ delayMs: result.retryAfterMs ?? FIRST_DELAY_MS * BACKOFF ** job.attempts,
30
+ status: "scheduled",
31
+ };
32
+ }
33
+ if (typeof job.everyMs === "number") {
34
+ return { attempts: 0, delayMs: job.everyMs, status: "scheduled" };
35
+ }
36
+ if (result.ok) {
37
+ return { attempts: 0, status: "succeeded" };
38
+ }
39
+ return { attempts: 0, status: "failed" };
40
+ }
41
+ function runsAfter(runs, next) {
42
+ if (next.attempts === NO_RETRIES) {
43
+ return runs + ONE_RUN;
44
+ }
45
+ return runs;
46
+ }
47
+ function isScheduled(job) {
48
+ if (job === null) {
49
+ return false;
50
+ }
51
+ return job.status === "scheduled";
52
+ }
53
+ function isLive(scheduled) {
54
+ if (scheduled === null) {
55
+ return false;
56
+ }
57
+ return LIVE.has(scheduled.state.kind);
58
+ }
59
+ function requireInterval(everyMs) {
60
+ if ((everyMs ?? MIN_EVERY_MS) < MIN_EVERY_MS) {
61
+ throw new ConvexError({
62
+ error: "interval_too_short",
63
+ message: `Set everyMs to ${String(MIN_EVERY_MS)} or more.`,
64
+ status: 400,
65
+ });
66
+ }
67
+ }
68
+ function keyed(definition) {
69
+ return definition.params.some((param) => param.name === "idempotencyKey");
70
+ }
71
+ function isConvexError(error) {
72
+ return error instanceof ConvexError;
73
+ }
74
+ function errorData(error) {
75
+ if (isConvexError(error)) {
76
+ return error.data;
77
+ }
78
+ return { message: String(error) };
79
+ }
80
+ function asRecord(data) {
81
+ if (isRecord(data)) {
82
+ return data;
83
+ }
84
+ return {};
85
+ }
86
+ function unexpected(id) {
87
+ const message = `Xquik answered ${id} with a result its schema does not allow.`;
88
+ return { error: { error: "unexpected_result", message, status: 502 }, ok: false, retryable: false };
89
+ }
90
+ function failed(definition, error) {
91
+ const data = errorData(error);
92
+ const { retryAfter, status } = asRecord(data);
93
+ const safe = definition.method === "GET" || keyed(definition);
94
+ const transient = typeof status !== "number" || status === TOO_MANY_REQUESTS || status >= SERVER_ERROR;
95
+ const retryable = safe && transient;
96
+ if (typeof retryAfter === "number") {
97
+ return { error: data, ok: false, retryAfterMs: retryAfter * MS_PER_SECOND, retryable };
98
+ }
99
+ return { error: data, ok: false, retryable };
100
+ }
101
+ export { failed, isLive, isScheduled, jobDoc, outcome, plan, requireInterval, runsAfter, unexpected };
102
+ //# sourceMappingURL=job.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"job.js","sourceRoot":"","sources":["../../src/component/job.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,CAAC,EAAE,MAAM,eAAe,CAAC;AAE/C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAEnC,OAAO,MAAM,MAAM,aAAa,CAAC;AAEjC,MAAM,YAAY,GAAG,CAAC,CAAC;AACvB,MAAM,YAAY,GAAG,MAAM,CAAC;AAC5B,MAAM,WAAW,GAAG,CAAC,CAAC;AACtB,MAAM,OAAO,GAAG,CAAC,CAAC;AAClB,MAAM,UAAU,GAAG,CAAC,CAAC;AACrB,MAAM,cAAc,GAAG,IAAI,CAAC;AAC5B,MAAM,OAAO,GAAG,CAAC,CAAC;AAClB,MAAM,aAAa,GAAG,IAAI,CAAC;AAC3B,MAAM,iBAAiB,GAAG,GAAG,CAAC;AAC9B,MAAM,YAAY,GAAG,GAAG,CAAC;AACzB,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC,CAAC;AAEhD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAErG,MAAM,OAAO,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;AAChE,MAAM,OAAO,GAAG,CAAC,CAAC,MAAM,CAAC;IACvB,KAAK,EAAE,IAAI;IACX,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;IACpB,YAAY,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IACpC,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE;CACvB,CAAC,CAAC;AACH,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AAa1C,SAAS,IAAI,CAAC,GAA6D,EAAE,MAAe;IAC1F,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,MAAM,CAAC,SAAS,IAAI,GAAG,CAAC,QAAQ,GAAG,WAAW,GAAG,YAAY,EAAE,CAAC;QAChF,OAAO;YACL,QAAQ,EAAE,GAAG,CAAC,QAAQ,GAAG,WAAW;YACpC,OAAO,EAAE,MAAM,CAAC,YAAY,IAAI,cAAc,GAAG,OAAO,IAAI,GAAG,CAAC,QAAQ;YACxE,MAAM,EAAE,WAAW;SACpB,CAAC;IACJ,CAAC;IACD,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QACpC,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IACpE,CAAC;IACD,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;QACd,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IAC9C,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AAC3C,CAAC;AAED,SAAS,SAAS,CAAC,IAAY,EAAE,IAAU;IACzC,IAAI,IAAI,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC;QACjC,OAAO,IAAI,GAAG,OAAO,CAAC;IACxB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,WAAW,CAAC,GAAuC;IAC1D,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QACjB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,GAAG,CAAC,MAAM,KAAK,WAAW,CAAC;AACpC,CAAC;AAED,SAAS,MAAM,CAAC,SAA+D;IAC7E,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;QACvB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AACxC,CAAC;AAED,SAAS,eAAe,CAAC,OAA2B;IAClD,IAAI,CAAC,OAAO,IAAI,YAAY,CAAC,GAAG,YAAY,EAAE,CAAC;QAC7C,MAAM,IAAI,WAAW,CAAC;YACpB,KAAK,EAAE,oBAAoB;YAC3B,OAAO,EAAE,kBAAkB,MAAM,CAAC,YAAY,CAAC,WAAW;YAC1D,MAAM,EAAE,GAAG;SACZ,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,SAAS,KAAK,CAAC,UAAqB;IAClC,OAAO,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,gBAAgB,CAAC,CAAC;AAC5E,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,OAAO,KAAK,YAAY,WAAW,CAAC;AACtC,CAAC;AAED,SAAS,SAAS,CAAC,KAAc;IAC/B,IAAI,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,IAAI,CAAC;IACpB,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;AACpC,CAAC;AAED,SAAS,QAAQ,CAAC,IAAa;IAC7B,IAAI,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,UAAU,CAAC,EAAU;IAC5B,MAAM,OAAO,GAAG,kBAAkB,EAAE,2CAA2C,CAAC;IAChF,OAAO,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,mBAAmB,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AACtG,CAAC;AAED,SAAS,MAAM,CAAC,UAAqB,EAAE,KAAc;IACnD,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IAC9B,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC9C,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,KAAK,KAAK,IAAI,KAAK,CAAC,UAAU,CAAC,CAAC;IAC9D,MAAM,SAAS,GAAG,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,iBAAiB,IAAI,MAAM,IAAI,YAAY,CAAC;IACvG,MAAM,SAAS,GAAG,IAAI,IAAI,SAAS,CAAC;IACpC,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;QACnC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,UAAU,GAAG,aAAa,EAAE,SAAS,EAAE,CAAC;IACzF,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;AAC/C,CAAC;AAED,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC"}
@@ -1,133 +1,62 @@
1
- import { type Infer, type Value } from "convex/values";
2
- import type { Id } from "./_generated/dataModel.js";
3
- import { jobStatus } from "./schema.js";
4
- import { type Operation } from "./shape.js";
5
- export declare const MAX_ATTEMPTS = 5;
6
- export declare const MIN_EVERY_MS = 60000;
7
- export declare const jobDoc: import("convex/values").VObject<{
8
- key?: string;
9
- error?: Value;
10
- everyMs?: number;
11
- result?: Value;
12
- scheduledId?: import("convex/values").GenericId<"_scheduled_functions">;
13
- status: "failed" | "succeeded" | "canceled" | "scheduled";
14
- args: Record<string, Value>;
15
- operation: string;
16
- attempts: number;
17
- runs: number;
18
- _creationTime: number;
19
- _id: import("convex/values").GenericId<"jobs">;
20
- }, {
21
- key: import("convex/values").VString<string | undefined, "optional">;
22
- operation: import("convex/values").VString<string, "required">;
23
- args: import("convex/values").VRecord<Record<string, Value>, import("convex/values").VString<string, "required">, import("convex/values").Validator<Value, "required", string>, "required", string>;
24
- everyMs: import("convex/values").VFloat64<number | undefined, "optional">;
25
- status: import("convex/values").VUnion<"failed" | "succeeded" | "canceled" | "scheduled", [import("convex/values").VLiteral<"scheduled", "required">, import("convex/values").VLiteral<"succeeded", "required">, import("convex/values").VLiteral<"failed", "required">, import("convex/values").VLiteral<"canceled", "required">], "required", never>;
26
- attempts: import("convex/values").VFloat64<number, "required">;
27
- runs: import("convex/values").VFloat64<number, "required">;
28
- scheduledId: import("convex/values").VId<import("convex/values").GenericId<"_scheduled_functions"> | undefined, "optional">;
29
- result: import("convex/values").VId<Value | undefined, "optional"> | import("convex/values").VString<Value | undefined, "optional"> | import("convex/values").VFloat64<Value | undefined, "optional"> | import("convex/values").VInt64<Value | undefined, "optional"> | import("convex/values").VCommitTs<Value | undefined, "optional"> | import("convex/values").VBoolean<Value | undefined, "optional"> | import("convex/values").VNull<Value | undefined, "optional"> | import("convex/values").VAny<Value | undefined, "optional", string> | import("convex/values").VLiteral<Value | undefined, "optional"> | import("convex/values").VBytes<Value | undefined, "optional"> | import("convex/values").VObject<Value | undefined, Record<string, import("convex/values").Validator<any, import("convex/values").OptionalProperty, any>>, "optional", string> | import("convex/values").VArray<Value | undefined, import("convex/values").Validator<any, "required", any>, "optional"> | import("convex/values").VRecord<Value | undefined, import("convex/values").Validator<string, "required", any>, import("convex/values").Validator<any, "required", any>, "optional", string> | import("convex/values").VUnion<Value | undefined, import("convex/values").Validator<any, "required", any>[], "optional", string>;
30
- error: import("convex/values").VId<Value | undefined, "optional"> | import("convex/values").VString<Value | undefined, "optional"> | import("convex/values").VFloat64<Value | undefined, "optional"> | import("convex/values").VInt64<Value | undefined, "optional"> | import("convex/values").VCommitTs<Value | undefined, "optional"> | import("convex/values").VBoolean<Value | undefined, "optional"> | import("convex/values").VNull<Value | undefined, "optional"> | import("convex/values").VAny<Value | undefined, "optional", string> | import("convex/values").VLiteral<Value | undefined, "optional"> | import("convex/values").VBytes<Value | undefined, "optional"> | import("convex/values").VObject<Value | undefined, Record<string, import("convex/values").Validator<any, import("convex/values").OptionalProperty, any>>, "optional", string> | import("convex/values").VArray<Value | undefined, import("convex/values").Validator<any, "required", any>, "optional"> | import("convex/values").VRecord<Value | undefined, import("convex/values").Validator<string, "required", any>, import("convex/values").Validator<any, "required", any>, "optional", string> | import("convex/values").VUnion<Value | undefined, import("convex/values").Validator<any, "required", any>[], "optional", string>;
31
- _id: import("convex/values").VId<import("convex/values").GenericId<"jobs">, "required">;
32
- _creationTime: import("convex/values").VFloat64<number, "required">;
33
- }, "required", "key" | "error" | "status" | "_creationTime" | "_id" | "args" | "everyMs" | "operation" | "result" | "attempts" | "runs" | "scheduledId" | `error.${string}` | `args.${string}` | `result.${string}`>;
34
- declare const outcome: import("convex/values").VUnion<{
35
- ok: true;
36
- result: Value;
37
- } | {
38
- retryAfterMs?: number;
39
- error: Value;
40
- ok: false;
41
- retryable: boolean;
42
- }, [import("convex/values").VObject<{
43
- ok: true;
44
- result: Value;
45
- }, {
46
- ok: import("convex/values").VLiteral<true, "required">;
47
- result: import("convex/values").Validator<Value, "required", string>;
48
- }, "required", "ok" | "result" | `result.${string}`>, import("convex/values").VObject<{
49
- retryAfterMs?: number;
50
- error: Value;
51
- ok: false;
52
- retryable: boolean;
53
- }, {
54
- ok: import("convex/values").VLiteral<false, "required">;
55
- error: import("convex/values").Validator<Value, "required", string>;
56
- retryable: import("convex/values").VBoolean<boolean, "required">;
57
- retryAfterMs: import("convex/values").VFloat64<number | undefined, "optional">;
58
- }, "required", "error" | "ok" | `error.${string}` | "retryable" | "retryAfterMs">], "required", "error" | "ok" | "result" | `error.${string}` | `result.${string}` | "retryable" | "retryAfterMs">;
59
- export type Outcome = Infer<typeof outcome>;
60
- export interface Plan {
61
- readonly status: Infer<typeof jobStatus>;
62
- readonly delayMs: number | null;
63
- readonly attempts: number;
64
- }
65
- export declare function plan(job: {
66
- readonly attempts: number;
67
- readonly everyMs?: number;
68
- }, result: Outcome): Plan;
69
- export declare function checked(id: string, definition: Operation, value: Value): Outcome;
70
- export declare function failed(definition: Operation, error: unknown): Extract<Outcome, {
71
- ok: false;
72
- }>;
73
- export declare const enqueue: import("convex/server").RegisteredMutation<"public", {
1
+ import type { GenericId } from "convex/values";
2
+ declare const enqueue: import("convex/server").RegisteredMutation<"public", {
74
3
  key?: string;
75
4
  delayMs?: number;
76
5
  everyMs?: number;
77
- args: Record<string, Value>;
6
+ args: Record<string, import("convex/values").Value>;
78
7
  operation: string;
79
- }, Promise<Id<"jobs">>>;
80
- export declare const load: import("convex/server").RegisteredQuery<"internal", {
81
- jobId: import("convex/values").GenericId<"jobs">;
8
+ }, Promise<GenericId<"jobs">>>;
9
+ declare const load: import("convex/server").RegisteredQuery<"internal", {
10
+ jobId: GenericId<"jobs">;
82
11
  }, Promise<{
83
- _id: import("convex/values").GenericId<"jobs">;
12
+ _id: GenericId<"jobs">;
84
13
  _creationTime: number;
85
14
  key?: string;
86
- error?: Value;
15
+ error?: import("convex/values").Value;
87
16
  everyMs?: number;
88
- result?: Value;
89
- scheduledId?: import("convex/values").GenericId<"_scheduled_functions">;
17
+ result?: import("convex/values").Value;
18
+ scheduledId?: GenericId<"_scheduled_functions">;
90
19
  status: "failed" | "succeeded" | "canceled" | "scheduled";
91
- args: Record<string, Value>;
20
+ args: Record<string, import("convex/values").Value>;
92
21
  operation: string;
93
22
  attempts: number;
94
23
  runs: number;
95
24
  } | null>>;
96
- export declare const run: import("convex/server").RegisteredAction<"internal", {
97
- jobId: import("convex/values").GenericId<"jobs">;
98
- }, Promise<null>>;
99
- export declare const finish: import("convex/server").RegisteredMutation<"internal", {
100
- jobId: import("convex/values").GenericId<"jobs">;
25
+ declare const run: import("convex/server").RegisteredAction<"internal", {
26
+ jobId: GenericId<"jobs">;
27
+ }, Promise<void>>;
28
+ declare const finish: import("convex/server").RegisteredMutation<"internal", {
29
+ jobId: GenericId<"jobs">;
101
30
  outcome: {
102
31
  ok: true;
103
- result: Value;
32
+ result: import("convex/values").Value;
104
33
  } | {
105
34
  retryAfterMs?: number;
106
- error: Value;
35
+ error: import("convex/values").Value;
107
36
  ok: false;
108
37
  retryable: boolean;
109
38
  };
110
- }, Promise<null>>;
111
- export declare const cancel: import("convex/server").RegisteredMutation<"public", {
112
- jobId: import("convex/values").GenericId<"jobs">;
113
- }, Promise<null>>;
114
- export declare const get: import("convex/server").RegisteredQuery<"public", {
115
- jobId: import("convex/values").GenericId<"jobs">;
39
+ }, Promise<void>>;
40
+ declare const cancel: import("convex/server").RegisteredMutation<"public", {
41
+ jobId: GenericId<"jobs">;
42
+ }, Promise<void>>;
43
+ declare const get: import("convex/server").RegisteredQuery<"public", {
44
+ jobId: GenericId<"jobs">;
116
45
  }, Promise<{
117
- _id: import("convex/values").GenericId<"jobs">;
46
+ _id: GenericId<"jobs">;
118
47
  _creationTime: number;
119
48
  key?: string;
120
- error?: Value;
49
+ error?: import("convex/values").Value;
121
50
  everyMs?: number;
122
- result?: Value;
123
- scheduledId?: import("convex/values").GenericId<"_scheduled_functions">;
51
+ result?: import("convex/values").Value;
52
+ scheduledId?: GenericId<"_scheduled_functions">;
124
53
  status: "failed" | "succeeded" | "canceled" | "scheduled";
125
- args: Record<string, Value>;
54
+ args: Record<string, import("convex/values").Value>;
126
55
  operation: string;
127
56
  attempts: number;
128
57
  runs: number;
129
58
  } | null>>;
130
- export declare const list: import("convex/server").RegisteredQuery<"public", {
59
+ declare const list: import("convex/server").RegisteredQuery<"public", {
131
60
  status?: "failed" | "succeeded" | "canceled" | "scheduled";
132
61
  paginationOpts: {
133
62
  id?: number;
@@ -138,18 +67,18 @@ export declare const list: import("convex/server").RegisteredQuery<"public", {
138
67
  cursor: string | null;
139
68
  };
140
69
  }, Promise<import("convex/server").PaginationResult<{
141
- _id: import("convex/values").GenericId<"jobs">;
70
+ _id: GenericId<"jobs">;
142
71
  _creationTime: number;
143
72
  key?: string;
144
- error?: Value;
73
+ error?: import("convex/values").Value;
145
74
  everyMs?: number;
146
- result?: Value;
147
- scheduledId?: import("convex/values").GenericId<"_scheduled_functions">;
75
+ result?: import("convex/values").Value;
76
+ scheduledId?: GenericId<"_scheduled_functions">;
148
77
  status: "failed" | "succeeded" | "canceled" | "scheduled";
149
- args: Record<string, Value>;
78
+ args: Record<string, import("convex/values").Value>;
150
79
  operation: string;
151
80
  attempts: number;
152
81
  runs: number;
153
82
  }>>>;
154
- export {};
83
+ export { cancel, enqueue, finish, get, list, load, run };
155
84
  //# sourceMappingURL=jobs.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"jobs.d.ts","sourceRoot":"","sources":["../../src/component/jobs.ts"],"names":[],"mappings":"AACA,OAAO,EAAkB,KAAK,KAAK,EAAE,KAAK,KAAK,EAAE,MAAM,eAAe,CAAC;AAGvE,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,2BAA2B,CAAC;AAKpD,OAAe,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAY,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAItD,eAAO,MAAM,YAAY,IAAI,CAAC;AAC9B,eAAO,MAAM,YAAY,QAAS,CAAC;AAEnC,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;oNAAwF,CAAC;AAE5G,QAAA,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;kMAGZ,CAAC;AAEF,MAAM,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,OAAO,CAAC,CAAC;AAE5C,MAAM,WAAW,IAAI;IACnB,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,OAAO,SAAS,CAAC,CAAC;IACzC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,wBAAgB,IAAI,CAAC,GAAG,EAAE;IAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI,CAUzG;AAUD,wBAAgB,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO,CAIhF;AAED,wBAAgB,MAAM,CAAC,UAAU,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE;IAAE,EAAE,EAAE,KAAK,CAAA;CAAE,CAAC,CAW7F;AAED,eAAO,MAAM,OAAO;;;;;;uBA2ClB,CAAC;AAEH,eAAO,MAAM,IAAI;;;;;;;;;;;;;;;UAIf,CAAC;AAEH,eAAO,MAAM,GAAG;;iBAed,CAAC;AAEH,eAAO,MAAM,MAAM;;;;;;;;;;;iBAqBjB,CAAC;AAEH,eAAO,MAAM,MAAM;;iBAWjB,CAAC;AAEH,eAAO,MAAM,GAAG;;;;;;;;;;;;;;;UAOd,CAAC;AAEH,eAAO,MAAM,IAAI;;;;;;;;;;;;;;;;;;;;;;;IASf,CAAC"}
1
+ {"version":3,"file":"jobs.d.ts","sourceRoot":"","sources":["../../src/component/jobs.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAS/C,QAAA,MAAM,OAAO;;;;;;8BAkDX,CAAC;AAEH,QAAA,MAAM,IAAI;;;;;;;;;;;;;;;UAIR,CAAC;AAEH,QAAA,MAAM,GAAG;;iBAqBP,CAAC;AAEH,QAAA,MAAM,MAAM;;;;;;;;;;;iBA0CV,CAAC;AAEH,QAAA,MAAM,MAAM;;iBAgBV,CAAC;AAEH,QAAA,MAAM,GAAG;;;;;;;;;;;;;;;UAOP,CAAC;AAEH,QAAA,MAAM,IAAI;;;;;;;;;;;;;;;;;;;;;;;IAcR,CAAC;AAEH,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC"}