@devvit/server 0.11.19-next-2025-07-01-14-39-04-3a189619a.0 → 0.11.19-next-2025-07-01-17-04-17-76d17d8d9.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.
@@ -1,5 +1,5 @@
1
1
  import { Devvit } from '@devvit/public-api';
2
- import type { AppConfig, AppFormsConfig, AppMenuActionConfig, AppPermissionConfig, AppPostCreateConfig } from '@devvit/shared-types/schemas/config-file.v1.js';
2
+ import type { AppConfig, AppFormsConfig, AppMenuActionConfig, AppPermissionConfig, AppPostCreateConfig, AppSchedulerConfig } from '@devvit/shared-types/schemas/config-file.v1.js';
3
3
  /**
4
4
  * A subset of AppConfig (see config-file.v1.json) available in V8-flavored
5
5
  * LinkedBundles except for the deprecated Blocks callbacks. This config is used
@@ -13,6 +13,7 @@ export type DynamicAppConfig = {
13
13
  permissions: AppPermissionConfig;
14
14
  post?: DynamicAppPostConfig | undefined;
15
15
  menuActions?: AppMenuActionConfig[];
16
+ scheduler?: AppSchedulerConfig | undefined;
16
17
  forms?: AppFormsConfig;
17
18
  };
18
19
  /** @experimental */
@@ -1 +1 @@
1
- {"version":3,"file":"define-config.d.ts","sourceRoot":"","sources":["../src/define-config.tsx"],"names":[],"mappings":"AACA,OAAO,EAEL,MAAM,EAOP,MAAM,oBAAoB,CAAC;AAG5B,OAAO,KAAK,EACV,SAAS,EACT,cAAc,EACd,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACpB,MAAM,gDAAgD,CAAC;AAIxD;;;;;;;;GAQG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,WAAW,EAAE,mBAAmB,CAAC;IACjC,IAAI,CAAC,EAAE,oBAAoB,GAAG,SAAS,CAAC;IACxC,WAAW,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACpC,KAAK,CAAC,EAAE,cAAc,CAAC;CACxB,CAAC;AAEF,oBAAoB;AACpB,MAAM,MAAM,oBAAoB,GAAG;IACjC,MAAM,EAAE;QACN,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,MAAM,CAAC;QACd,kBAAkB;QAClB,MAAM,CAAC,EAAE;YACP,iDAAiD;YACjD,MAAM,CAAC,EACH,QAAQ,GACR;gBACE,IAAI,EAAE,OAAO,CAAC;gBACd;;;mBAGG;gBACH,KAAK,CAAC,EAAE,CAAC,MAAM,MAAM,CAAC,GAAG,SAAS,CAAC;aACpC,GACD,MAAM,CAAC,mBAAmB,GAC1B,SAAS,CAAC;SACf,CAAC;KACH,CAAC;IACF,MAAM,EAAE,0BAA0B,CAAC;CACpC,CAAC;AAEF,oBAAoB;AACpB,MAAM,MAAM,0BAA0B,GAAG,mBAAmB,GAAG;IAC7D,kBAAkB;IAClB,MAAM,CAAC,EACH;QACE;;;;WAIG;QACH,MAAM,CAAC,IAAI,GAAG,CAAC,OAAO,GAAG,SAAS,CAAC;QACnC;;;WAGG;QACH,KAAK,CAAC,IAAI,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;KAChD,GACD,SAAS,CAAC;CACf,CAAC;AAKF,oBAAoB;AACpB,wBAAgB,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,gBAAgB,GAAG,SAAS,CAAC,GAAG,OAAO,MAAM,CAM1F"}
1
+ {"version":3,"file":"define-config.d.ts","sourceRoot":"","sources":["../src/define-config.tsx"],"names":[],"mappings":"AACA,OAAO,EAEL,MAAM,EAOP,MAAM,oBAAoB,CAAC;AAG5B,OAAO,KAAK,EACV,SAAS,EACT,cAAc,EACd,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,EACnB,MAAM,gDAAgD,CAAC;AAIxD;;;;;;;;GAQG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,WAAW,EAAE,mBAAmB,CAAC;IACjC,IAAI,CAAC,EAAE,oBAAoB,GAAG,SAAS,CAAC;IACxC,WAAW,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACpC,SAAS,CAAC,EAAE,kBAAkB,GAAG,SAAS,CAAC;IAC3C,KAAK,CAAC,EAAE,cAAc,CAAC;CACxB,CAAC;AAEF,oBAAoB;AACpB,MAAM,MAAM,oBAAoB,GAAG;IACjC,MAAM,EAAE;QACN,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,MAAM,CAAC;QACd,kBAAkB;QAClB,MAAM,CAAC,EAAE;YACP,iDAAiD;YACjD,MAAM,CAAC,EACH,QAAQ,GACR;gBACE,IAAI,EAAE,OAAO,CAAC;gBACd;;;mBAGG;gBACH,KAAK,CAAC,EAAE,CAAC,MAAM,MAAM,CAAC,GAAG,SAAS,CAAC;aACpC,GACD,MAAM,CAAC,mBAAmB,GAC1B,SAAS,CAAC;SACf,CAAC;KACH,CAAC;IACF,MAAM,EAAE,0BAA0B,CAAC;CACpC,CAAC;AAEF,oBAAoB;AACpB,MAAM,MAAM,0BAA0B,GAAG,mBAAmB,GAAG;IAC7D,kBAAkB;IAClB,MAAM,CAAC,EACH;QACE;;;;WAIG;QACH,MAAM,CAAC,IAAI,GAAG,CAAC,OAAO,GAAG,SAAS,CAAC;QACnC;;;WAGG;QACH,KAAK,CAAC,IAAI,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;KAChD,GACD,SAAS,CAAC;CACf,CAAC;AAKF,oBAAoB;AACpB,wBAAgB,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,gBAAgB,GAAG,SAAS,CAAC,GAAG,OAAO,MAAM,CAO1F"}
package/define-config.js CHANGED
@@ -9,6 +9,8 @@ export function defineConfig(config) {
9
9
  configurePost(config.post);
10
10
  if (config.menuActions)
11
11
  configureMenuActions(config.menuActions);
12
+ if (config.scheduler)
13
+ configureScheduler(config.scheduler);
12
14
  if (config.forms)
13
15
  configureForms(config.forms);
14
16
  return Devvit;
@@ -146,6 +148,49 @@ async function callWebbitEndpoint(endpoint, body, metadata) {
146
148
  }
147
149
  return await response.json();
148
150
  }
151
+ function configureScheduler(schedulerConfig) {
152
+ const cronTasks = {};
153
+ for (const [name, task] of Object.entries(schedulerConfig.tasks)) {
154
+ Devvit.addSchedulerJob({
155
+ name: name,
156
+ onRun: async (event, context) => {
157
+ await callWebbitEndpoint(task.endpoint, {
158
+ name: event.name,
159
+ data: event.data ?? null, // JSONObject wants null not undefined
160
+ }, context.debug.metadata);
161
+ },
162
+ });
163
+ // Tasks with cron specified require a bit more work further down
164
+ if (task.cron) {
165
+ cronTasks[name] = task;
166
+ }
167
+ }
168
+ // If provided, schedule any cron tasks the user asked for on install/upgrade, being careful to
169
+ // un-schedule any previously scheduled instances of these tasks
170
+ if (Object.keys(cronTasks).length > 0) {
171
+ Devvit.addTrigger({
172
+ events: ['AppInstall', 'AppUpgrade'],
173
+ onEvent: async (_event, context) => {
174
+ // Get all jobs
175
+ const existingJobs = await context.scheduler.listJobs();
176
+ // Filter down to just cron jobs
177
+ const jobsToCancel = existingJobs.filter((job) => {
178
+ // Only cancel cron jobs
179
+ return 'cron' in job;
180
+ });
181
+ // Cancel everything we need to
182
+ await Promise.all(jobsToCancel.map((job) => context.scheduler.cancelJob(job.id)));
183
+ // Schedule all the cron tasks we were given in the config
184
+ await Promise.all(Object.entries(cronTasks).map(async ([name, task]) => {
185
+ await context.scheduler.runJob({
186
+ name: name,
187
+ cron: task.cron,
188
+ });
189
+ }));
190
+ },
191
+ });
192
+ }
193
+ }
149
194
  async function createPost(ctx, create) {
150
195
  if (!ctx.subredditName)
151
196
  throw Error('no sub name');
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@devvit/server",
3
- "version": "0.11.19-next-2025-07-01-14-39-04-3a189619a.0",
3
+ "version": "0.11.19-next-2025-07-01-17-04-17-76d17d8d9.0",
4
4
  "license": "BSD-3-Clause",
5
5
  "repository": {
6
6
  "type": "git",
@@ -23,14 +23,14 @@
23
23
  },
24
24
  "types": "./index.d.ts",
25
25
  "dependencies": {
26
- "@devvit/protos": "0.11.19-next-2025-07-01-14-39-04-3a189619a.0",
27
- "@devvit/public-api": "0.11.19-next-2025-07-01-14-39-04-3a189619a.0",
28
- "@devvit/shared": "0.11.19-next-2025-07-01-14-39-04-3a189619a.0",
29
- "@devvit/shared-types": "0.11.19-next-2025-07-01-14-39-04-3a189619a.0"
26
+ "@devvit/protos": "0.11.19-next-2025-07-01-17-04-17-76d17d8d9.0",
27
+ "@devvit/public-api": "0.11.19-next-2025-07-01-17-04-17-76d17d8d9.0",
28
+ "@devvit/shared": "0.11.19-next-2025-07-01-17-04-17-76d17d8d9.0",
29
+ "@devvit/shared-types": "0.11.19-next-2025-07-01-17-04-17-76d17d8d9.0"
30
30
  },
31
31
  "devDependencies": {
32
- "@devvit/repo-tools": "0.11.19-next-2025-07-01-14-39-04-3a189619a.0",
33
- "@devvit/tsconfig": "0.11.19-next-2025-07-01-14-39-04-3a189619a.0",
32
+ "@devvit/repo-tools": "0.11.19-next-2025-07-01-17-04-17-76d17d8d9.0",
33
+ "@devvit/tsconfig": "0.11.19-next-2025-07-01-17-04-17-76d17d8d9.0",
34
34
  "eslint": "9.11.1",
35
35
  "typescript": "5.8.3",
36
36
  "vitest": "1.6.1"
@@ -39,5 +39,5 @@
39
39
  "directory": "dist"
40
40
  },
41
41
  "source": "./src/index.ts",
42
- "gitHead": "67f59b874319a6daf673d2245be80709aeaf8f1d"
42
+ "gitHead": "c2f0162348ad3bf31ebcf8688024223229b7bb2e"
43
43
  }