@wrelik/jobs 0.1.0 → 2.0.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/.turbo/turbo-build.log +27 -0
- package/CHANGELOG.md +24 -0
- package/dist/client/index.d.mts +3 -0
- package/dist/client/index.d.ts +3 -0
- package/dist/client/index.js +34 -0
- package/dist/client/index.mjs +9 -0
- package/dist/server/index.d.mts +32 -0
- package/dist/server/index.d.ts +32 -0
- package/dist/server/index.js +68 -0
- package/dist/server/index.mjs +40 -0
- package/dist/shared/index.d.mts +7 -0
- package/dist/shared/index.d.ts +7 -0
- package/dist/shared/index.js +18 -0
- package/dist/shared/index.mjs +0 -0
- package/package.json +39 -6
- package/src/client/index.test.ts +7 -0
- package/src/client/index.ts +5 -0
- package/src/server/index.test.ts +66 -0
- package/src/server/index.ts +71 -0
- package/src/shared/index.ts +1 -0
- package/src/shared/types.ts +1 -0
- package/tsconfig.json +1 -1
- package/src/index.ts +0 -37
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
|
|
2
|
+
> @wrelik/jobs@2.0.0 build /home/runner/work/wrelik-kit/wrelik-kit/packages/jobs
|
|
3
|
+
> tsup src/server/index.ts src/client/index.ts src/shared/index.ts --format cjs,esm --dts --clean
|
|
4
|
+
|
|
5
|
+
[34mCLI[39m Building entry: src/client/index.ts, src/server/index.ts, src/shared/index.ts
|
|
6
|
+
[34mCLI[39m Using tsconfig: tsconfig.json
|
|
7
|
+
[34mCLI[39m tsup v8.5.1
|
|
8
|
+
[34mCLI[39m Target: es2022
|
|
9
|
+
[34mCLI[39m Cleaning output folder
|
|
10
|
+
[34mCJS[39m Build start
|
|
11
|
+
[34mESM[39m Build start
|
|
12
|
+
[32mESM[39m [1mdist/shared/index.mjs [22m[32m0 B[39m
|
|
13
|
+
[32mESM[39m [1mdist/client/index.mjs [22m[32m272.00 B[39m
|
|
14
|
+
[32mESM[39m [1mdist/server/index.mjs [22m[32m1.07 KB[39m
|
|
15
|
+
[32mESM[39m ⚡️ Build success in 76ms
|
|
16
|
+
[32mCJS[39m [1mdist/client/index.js [22m[32m1.27 KB[39m
|
|
17
|
+
[32mCJS[39m [1mdist/server/index.js [22m[32m2.18 KB[39m
|
|
18
|
+
[32mCJS[39m [1mdist/shared/index.js [22m[32m767.00 B[39m
|
|
19
|
+
[32mCJS[39m ⚡️ Build success in 77ms
|
|
20
|
+
[34mDTS[39m Build start
|
|
21
|
+
[32mDTS[39m ⚡️ Build success in 5028ms
|
|
22
|
+
[32mDTS[39m [1mdist/client/index.d.ts [22m[32m77.00 B[39m
|
|
23
|
+
[32mDTS[39m [1mdist/server/index.d.ts [22m[32m1.32 KB[39m
|
|
24
|
+
[32mDTS[39m [1mdist/shared/index.d.ts [22m[32m95.00 B[39m
|
|
25
|
+
[32mDTS[39m [1mdist/client/index.d.mts [22m[32m77.00 B[39m
|
|
26
|
+
[32mDTS[39m [1mdist/server/index.d.mts [22m[32m1.32 KB[39m
|
|
27
|
+
[32mDTS[39m [1mdist/shared/index.d.mts [22m[32m95.00 B[39m
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,29 @@
|
|
|
1
1
|
# @wrelik/jobs
|
|
2
2
|
|
|
3
|
+
## 2.0.0
|
|
4
|
+
|
|
5
|
+
### Major Changes
|
|
6
|
+
|
|
7
|
+
- 818ed58: Refactor runtime packages to strict subpath exports (`/server`, `/client`, `/shared`) with side-effect free entrypoints and hard CI/runtime boundary enforcement.
|
|
8
|
+
|
|
9
|
+
### Minor Changes
|
|
10
|
+
|
|
11
|
+
- Add platform wrapper packages for Clerk (Next/Expo), Next Sentry client instrumentation, and Upstash server SDK access so apps can avoid direct vendor imports while staying inside the `@wrelik/*` boundary.
|
|
12
|
+
|
|
13
|
+
Add temporary deprecated server-side compatibility singleton exports to analytics, email, jobs, and storage to support DRX migration from root-import convenience APIs to runtime subpaths in one cutover.
|
|
14
|
+
|
|
15
|
+
## 0.1.2
|
|
16
|
+
|
|
17
|
+
### Patch Changes
|
|
18
|
+
|
|
19
|
+
- a38ebcb: Add React Native / Expo support and enforce server-only boundaries.
|
|
20
|
+
|
|
21
|
+
## 0.1.1
|
|
22
|
+
|
|
23
|
+
### Patch Changes
|
|
24
|
+
|
|
25
|
+
- Update publishConfig to access:public for all packages.
|
|
26
|
+
|
|
3
27
|
## 0.1.0
|
|
4
28
|
|
|
5
29
|
### Minor Changes
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/client/index.ts
|
|
21
|
+
var client_exports = {};
|
|
22
|
+
__export(client_exports, {
|
|
23
|
+
serverOnlyClientStub: () => serverOnlyClientStub
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(client_exports);
|
|
26
|
+
var serverOnlyClientStub = (() => {
|
|
27
|
+
throw new Error(
|
|
28
|
+
"@wrelik/jobs/client is a server-only adapter stub. Use @wrelik/jobs/server on the backend and call your backend API from client or Expo apps."
|
|
29
|
+
);
|
|
30
|
+
})();
|
|
31
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
32
|
+
0 && (module.exports = {
|
|
33
|
+
serverOnlyClientStub
|
|
34
|
+
});
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// src/client/index.ts
|
|
2
|
+
var serverOnlyClientStub = (() => {
|
|
3
|
+
throw new Error(
|
|
4
|
+
"@wrelik/jobs/client is a server-only adapter stub. Use @wrelik/jobs/server on the backend and call your backend API from client or Expo apps."
|
|
5
|
+
);
|
|
6
|
+
})();
|
|
7
|
+
export {
|
|
8
|
+
serverOnlyClientStub
|
|
9
|
+
};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { JobTrigger } from '../shared/index.mjs';
|
|
2
|
+
|
|
3
|
+
interface JobsClient {
|
|
4
|
+
send: (payload: {
|
|
5
|
+
name: string;
|
|
6
|
+
data: unknown;
|
|
7
|
+
}) => Promise<unknown>;
|
|
8
|
+
createFunction: (config: {
|
|
9
|
+
id: string;
|
|
10
|
+
}, trigger: JobTrigger, handler: (args: unknown) => Promise<unknown>) => unknown;
|
|
11
|
+
}
|
|
12
|
+
declare function createJobsServer(appId: string, options?: {
|
|
13
|
+
client?: JobsClient;
|
|
14
|
+
createClient?: (appId: string) => JobsClient;
|
|
15
|
+
}): {
|
|
16
|
+
emit(eventName: string, payload: unknown): Promise<unknown>;
|
|
17
|
+
createFunction(name: string, trigger: JobTrigger, handler: (args: unknown) => Promise<unknown>): unknown;
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* @deprecated Temporary DRX compatibility singleton. Prefer createJobsServer(...) and explicit dependency wiring.
|
|
21
|
+
*/
|
|
22
|
+
declare function initJobs(appId: string, options?: Parameters<typeof createJobsServer>[1]): void;
|
|
23
|
+
/**
|
|
24
|
+
* @deprecated Temporary DRX compatibility singleton. Prefer createJobsServer(...).emit(...)
|
|
25
|
+
*/
|
|
26
|
+
declare function emit(eventName: string, payload: unknown): Promise<unknown>;
|
|
27
|
+
/**
|
|
28
|
+
* @deprecated Temporary DRX compatibility singleton. Prefer createJobsServer(...).createFunction(...)
|
|
29
|
+
*/
|
|
30
|
+
declare function createFunction(name: string, trigger: JobTrigger, handler: (args: unknown) => Promise<unknown>): unknown;
|
|
31
|
+
|
|
32
|
+
export { JobTrigger, type JobsClient, createFunction, createJobsServer, emit, initJobs };
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { JobTrigger } from '../shared/index.js';
|
|
2
|
+
|
|
3
|
+
interface JobsClient {
|
|
4
|
+
send: (payload: {
|
|
5
|
+
name: string;
|
|
6
|
+
data: unknown;
|
|
7
|
+
}) => Promise<unknown>;
|
|
8
|
+
createFunction: (config: {
|
|
9
|
+
id: string;
|
|
10
|
+
}, trigger: JobTrigger, handler: (args: unknown) => Promise<unknown>) => unknown;
|
|
11
|
+
}
|
|
12
|
+
declare function createJobsServer(appId: string, options?: {
|
|
13
|
+
client?: JobsClient;
|
|
14
|
+
createClient?: (appId: string) => JobsClient;
|
|
15
|
+
}): {
|
|
16
|
+
emit(eventName: string, payload: unknown): Promise<unknown>;
|
|
17
|
+
createFunction(name: string, trigger: JobTrigger, handler: (args: unknown) => Promise<unknown>): unknown;
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* @deprecated Temporary DRX compatibility singleton. Prefer createJobsServer(...) and explicit dependency wiring.
|
|
21
|
+
*/
|
|
22
|
+
declare function initJobs(appId: string, options?: Parameters<typeof createJobsServer>[1]): void;
|
|
23
|
+
/**
|
|
24
|
+
* @deprecated Temporary DRX compatibility singleton. Prefer createJobsServer(...).emit(...)
|
|
25
|
+
*/
|
|
26
|
+
declare function emit(eventName: string, payload: unknown): Promise<unknown>;
|
|
27
|
+
/**
|
|
28
|
+
* @deprecated Temporary DRX compatibility singleton. Prefer createJobsServer(...).createFunction(...)
|
|
29
|
+
*/
|
|
30
|
+
declare function createFunction(name: string, trigger: JobTrigger, handler: (args: unknown) => Promise<unknown>): unknown;
|
|
31
|
+
|
|
32
|
+
export { JobTrigger, type JobsClient, createFunction, createJobsServer, emit, initJobs };
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/server/index.ts
|
|
21
|
+
var server_exports = {};
|
|
22
|
+
__export(server_exports, {
|
|
23
|
+
createFunction: () => createFunction,
|
|
24
|
+
createJobsServer: () => createJobsServer,
|
|
25
|
+
emit: () => emit,
|
|
26
|
+
initJobs: () => initJobs
|
|
27
|
+
});
|
|
28
|
+
module.exports = __toCommonJS(server_exports);
|
|
29
|
+
var import_inngest = require("inngest");
|
|
30
|
+
function createJobsServer(appId, options) {
|
|
31
|
+
const client = options?.client ?? options?.createClient?.(appId) ?? new import_inngest.Inngest({ id: appId });
|
|
32
|
+
return {
|
|
33
|
+
emit(eventName, payload) {
|
|
34
|
+
return client.send({
|
|
35
|
+
name: eventName,
|
|
36
|
+
data: payload
|
|
37
|
+
});
|
|
38
|
+
},
|
|
39
|
+
createFunction(name, trigger, handler) {
|
|
40
|
+
return client.createFunction({ id: name }, trigger, handler);
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
var jobsSingleton = null;
|
|
45
|
+
function requireJobsSingleton() {
|
|
46
|
+
if (!jobsSingleton) {
|
|
47
|
+
throw new Error(
|
|
48
|
+
"@wrelik/jobs/server compatibility API is not initialized. Call initJobs(appId) before emit/createFunction."
|
|
49
|
+
);
|
|
50
|
+
}
|
|
51
|
+
return jobsSingleton;
|
|
52
|
+
}
|
|
53
|
+
function initJobs(appId, options) {
|
|
54
|
+
jobsSingleton = createJobsServer(appId, options);
|
|
55
|
+
}
|
|
56
|
+
function emit(eventName, payload) {
|
|
57
|
+
return requireJobsSingleton().emit(eventName, payload);
|
|
58
|
+
}
|
|
59
|
+
function createFunction(name, trigger, handler) {
|
|
60
|
+
return requireJobsSingleton().createFunction(name, trigger, handler);
|
|
61
|
+
}
|
|
62
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
63
|
+
0 && (module.exports = {
|
|
64
|
+
createFunction,
|
|
65
|
+
createJobsServer,
|
|
66
|
+
emit,
|
|
67
|
+
initJobs
|
|
68
|
+
});
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
// src/server/index.ts
|
|
2
|
+
import { Inngest } from "inngest";
|
|
3
|
+
function createJobsServer(appId, options) {
|
|
4
|
+
const client = options?.client ?? options?.createClient?.(appId) ?? new Inngest({ id: appId });
|
|
5
|
+
return {
|
|
6
|
+
emit(eventName, payload) {
|
|
7
|
+
return client.send({
|
|
8
|
+
name: eventName,
|
|
9
|
+
data: payload
|
|
10
|
+
});
|
|
11
|
+
},
|
|
12
|
+
createFunction(name, trigger, handler) {
|
|
13
|
+
return client.createFunction({ id: name }, trigger, handler);
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
var jobsSingleton = null;
|
|
18
|
+
function requireJobsSingleton() {
|
|
19
|
+
if (!jobsSingleton) {
|
|
20
|
+
throw new Error(
|
|
21
|
+
"@wrelik/jobs/server compatibility API is not initialized. Call initJobs(appId) before emit/createFunction."
|
|
22
|
+
);
|
|
23
|
+
}
|
|
24
|
+
return jobsSingleton;
|
|
25
|
+
}
|
|
26
|
+
function initJobs(appId, options) {
|
|
27
|
+
jobsSingleton = createJobsServer(appId, options);
|
|
28
|
+
}
|
|
29
|
+
function emit(eventName, payload) {
|
|
30
|
+
return requireJobsSingleton().emit(eventName, payload);
|
|
31
|
+
}
|
|
32
|
+
function createFunction(name, trigger, handler) {
|
|
33
|
+
return requireJobsSingleton().createFunction(name, trigger, handler);
|
|
34
|
+
}
|
|
35
|
+
export {
|
|
36
|
+
createFunction,
|
|
37
|
+
createJobsServer,
|
|
38
|
+
emit,
|
|
39
|
+
initJobs
|
|
40
|
+
};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __copyProps = (to, from, except, desc) => {
|
|
7
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
8
|
+
for (let key of __getOwnPropNames(from))
|
|
9
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
10
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
11
|
+
}
|
|
12
|
+
return to;
|
|
13
|
+
};
|
|
14
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
15
|
+
|
|
16
|
+
// src/shared/index.ts
|
|
17
|
+
var shared_exports = {};
|
|
18
|
+
module.exports = __toCommonJS(shared_exports);
|
|
File without changes
|
package/package.json
CHANGED
|
@@ -1,20 +1,53 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wrelik/jobs",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
|
|
3
|
+
"version": "2.0.0",
|
|
4
|
+
"publishConfig": {
|
|
5
|
+
"access": "public"
|
|
6
|
+
},
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "https://github.com/lwhite702/wrelik-kit.git",
|
|
10
|
+
"directory": "packages/jobs"
|
|
11
|
+
},
|
|
12
|
+
"sideEffects": false,
|
|
13
|
+
"exports": {
|
|
14
|
+
"./server": {
|
|
15
|
+
"types": "./dist/server/index.d.ts",
|
|
16
|
+
"import": "./dist/server/index.mjs",
|
|
17
|
+
"require": "./dist/server/index.js"
|
|
18
|
+
},
|
|
19
|
+
"./client": {
|
|
20
|
+
"types": "./dist/client/index.d.ts",
|
|
21
|
+
"import": "./dist/client/index.mjs",
|
|
22
|
+
"require": "./dist/client/index.js"
|
|
23
|
+
},
|
|
24
|
+
"./shared": {
|
|
25
|
+
"types": "./dist/shared/index.d.ts",
|
|
26
|
+
"import": "./dist/shared/index.mjs",
|
|
27
|
+
"require": "./dist/shared/index.js"
|
|
28
|
+
},
|
|
29
|
+
"./package.json": "./package.json"
|
|
30
|
+
},
|
|
6
31
|
"dependencies": {
|
|
7
32
|
"inngest": "^3.11.0"
|
|
8
33
|
},
|
|
9
34
|
"devDependencies": {
|
|
10
35
|
"tsup": "^8.0.1",
|
|
11
36
|
"vitest": "^1.2.2",
|
|
12
|
-
"@wrelik/eslint-config": "0.1.
|
|
13
|
-
"@wrelik/tsconfig": "0.1.
|
|
37
|
+
"@wrelik/eslint-config": "0.1.1",
|
|
38
|
+
"@wrelik/tsconfig": "0.1.1"
|
|
39
|
+
},
|
|
40
|
+
"wrelik": {
|
|
41
|
+
"runtimes": [
|
|
42
|
+
"server",
|
|
43
|
+
"client",
|
|
44
|
+
"shared"
|
|
45
|
+
]
|
|
14
46
|
},
|
|
15
47
|
"scripts": {
|
|
16
|
-
"build": "tsup src/index.ts --format cjs,esm --dts --clean",
|
|
48
|
+
"build": "tsup src/server/index.ts src/client/index.ts src/shared/index.ts --format cjs,esm --dts --clean",
|
|
17
49
|
"lint": "eslint src/",
|
|
50
|
+
"typecheck": "tsc --noEmit",
|
|
18
51
|
"test": "vitest run --passWithNoTests"
|
|
19
52
|
}
|
|
20
53
|
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { afterEach, describe, expect, it, vi } from 'vitest';
|
|
2
|
+
import { createJobsServer } from './index';
|
|
3
|
+
|
|
4
|
+
afterEach(() => {
|
|
5
|
+
vi.resetModules();
|
|
6
|
+
vi.clearAllMocks();
|
|
7
|
+
});
|
|
8
|
+
|
|
9
|
+
describe('@wrelik/jobs/server', () => {
|
|
10
|
+
it('registers functions with the wrapped client and preserves handler signature', async () => {
|
|
11
|
+
const createFunction = vi.fn((_config, _trigger, handler) => handler({ event: { data: { ok: true } } }));
|
|
12
|
+
const send = vi.fn(async () => ({ ids: ['evt_1'] }));
|
|
13
|
+
const jobs = createJobsServer('drx', {
|
|
14
|
+
client: {
|
|
15
|
+
send,
|
|
16
|
+
createFunction,
|
|
17
|
+
},
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
const handler = vi.fn(async (args: unknown) => args);
|
|
21
|
+
const result = await jobs.createFunction('sync-user', { event: 'user/sync' }, handler);
|
|
22
|
+
|
|
23
|
+
expect(createFunction).toHaveBeenCalledWith({ id: 'sync-user' }, { event: 'user/sync' }, handler);
|
|
24
|
+
expect(handler).toHaveBeenCalledWith({ event: { data: { ok: true } } });
|
|
25
|
+
expect(result).toEqual({ event: { data: { ok: true } } });
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
it('sends events through the wrapped client', async () => {
|
|
29
|
+
const send = vi.fn(async () => ({ ids: ['evt_1'] }));
|
|
30
|
+
const jobs = createJobsServer('drx', {
|
|
31
|
+
client: {
|
|
32
|
+
send,
|
|
33
|
+
createFunction: vi.fn(),
|
|
34
|
+
},
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
await jobs.emit('user.created', { userId: 'u1' });
|
|
38
|
+
expect(send).toHaveBeenCalledWith({ name: 'user.created', data: { userId: 'u1' } });
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
it('compatibility singleton throws before initJobs', async () => {
|
|
42
|
+
const mod = await import('./index.js');
|
|
43
|
+
expect(() => mod.emit('user.created', { userId: 'u1' })).toThrow(/initJobs/i);
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
it('compatibility singleton delegates after initJobs', async () => {
|
|
47
|
+
const send = vi.fn(async () => ({ ids: ['evt_99'] }));
|
|
48
|
+
const createFunction = vi.fn((_config, _trigger, handler) => handler({ event: { data: { ok: true } } }));
|
|
49
|
+
const mod = await import('./index.js');
|
|
50
|
+
|
|
51
|
+
mod.initJobs('drx-primary', {
|
|
52
|
+
client: {
|
|
53
|
+
send,
|
|
54
|
+
createFunction,
|
|
55
|
+
},
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
const handler = vi.fn(async (args: unknown) => args);
|
|
59
|
+
await mod.emit('user.created', { userId: 'u1' });
|
|
60
|
+
const result = await mod.createFunction('sync-user', { event: 'user/sync' }, handler);
|
|
61
|
+
|
|
62
|
+
expect(send).toHaveBeenCalledWith({ name: 'user.created', data: { userId: 'u1' } });
|
|
63
|
+
expect(createFunction).toHaveBeenCalledWith({ id: 'sync-user' }, { event: 'user/sync' }, handler);
|
|
64
|
+
expect(result).toEqual({ event: { data: { ok: true } } });
|
|
65
|
+
});
|
|
66
|
+
});
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/* eslint-disable no-restricted-imports */
|
|
2
|
+
import { Inngest } from 'inngest';
|
|
3
|
+
import type { JobTrigger } from '../shared';
|
|
4
|
+
export type { JobTrigger } from '../shared';
|
|
5
|
+
|
|
6
|
+
export interface JobsClient {
|
|
7
|
+
send: (payload: { name: string; data: unknown }) => Promise<unknown>;
|
|
8
|
+
createFunction: (config: { id: string }, trigger: JobTrigger, handler: (args: unknown) => Promise<unknown>) => unknown;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export function createJobsServer(
|
|
12
|
+
appId: string,
|
|
13
|
+
options?: { client?: JobsClient; createClient?: (appId: string) => JobsClient },
|
|
14
|
+
) {
|
|
15
|
+
const client =
|
|
16
|
+
options?.client ??
|
|
17
|
+
options?.createClient?.(appId) ??
|
|
18
|
+
((new Inngest({ id: appId }) as unknown) as JobsClient);
|
|
19
|
+
|
|
20
|
+
return {
|
|
21
|
+
emit(eventName: string, payload: unknown) {
|
|
22
|
+
return client.send({
|
|
23
|
+
name: eventName,
|
|
24
|
+
data: payload,
|
|
25
|
+
});
|
|
26
|
+
},
|
|
27
|
+
|
|
28
|
+
createFunction(name: string, trigger: JobTrigger, handler: (args: unknown) => Promise<unknown>) {
|
|
29
|
+
return client.createFunction({ id: name }, trigger, handler);
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
type JobsServerCompat = ReturnType<typeof createJobsServer>;
|
|
35
|
+
|
|
36
|
+
let jobsSingleton: JobsServerCompat | null = null;
|
|
37
|
+
|
|
38
|
+
function requireJobsSingleton(): JobsServerCompat {
|
|
39
|
+
if (!jobsSingleton) {
|
|
40
|
+
throw new Error(
|
|
41
|
+
'@wrelik/jobs/server compatibility API is not initialized. Call initJobs(appId) before emit/createFunction.',
|
|
42
|
+
);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
return jobsSingleton;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* @deprecated Temporary DRX compatibility singleton. Prefer createJobsServer(...) and explicit dependency wiring.
|
|
50
|
+
*/
|
|
51
|
+
export function initJobs(appId: string, options?: Parameters<typeof createJobsServer>[1]): void {
|
|
52
|
+
jobsSingleton = createJobsServer(appId, options);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* @deprecated Temporary DRX compatibility singleton. Prefer createJobsServer(...).emit(...)
|
|
57
|
+
*/
|
|
58
|
+
export function emit(eventName: string, payload: unknown): Promise<unknown> {
|
|
59
|
+
return requireJobsSingleton().emit(eventName, payload);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* @deprecated Temporary DRX compatibility singleton. Prefer createJobsServer(...).createFunction(...)
|
|
64
|
+
*/
|
|
65
|
+
export function createFunction(
|
|
66
|
+
name: string,
|
|
67
|
+
trigger: JobTrigger,
|
|
68
|
+
handler: (args: unknown) => Promise<unknown>,
|
|
69
|
+
): unknown {
|
|
70
|
+
return requireJobsSingleton().createFunction(name, trigger, handler);
|
|
71
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export type { JobTrigger } from './types';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export type JobTrigger = { event: string } | { cron: string };
|
package/tsconfig.json
CHANGED
package/src/index.ts
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import { Inngest, EventSchemas, type GetEvents } from 'inngest';
|
|
2
|
-
|
|
3
|
-
// Define the event types map that apps can extend via module augmentation?
|
|
4
|
-
// For now, we use a generic approach or require strict schemas.
|
|
5
|
-
// The user requirement says "Enforce event naming convention" was for analytics.
|
|
6
|
-
// For jobs: emit(eventName, payload), createFunction(name, trigger, handler).
|
|
7
|
-
|
|
8
|
-
let client: Inngest;
|
|
9
|
-
|
|
10
|
-
export function initJobs(appId: string, eventSchema?: any) {
|
|
11
|
-
// We can pass schemas if we want strict typing
|
|
12
|
-
client = new Inngest({ id: appId });
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
function getClient() {
|
|
16
|
-
if (!client) throw new Error('Jobs not initialized');
|
|
17
|
-
return client;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export async function emit(eventName: string, payload: any) {
|
|
21
|
-
return getClient().send({
|
|
22
|
-
name: eventName,
|
|
23
|
-
data: payload,
|
|
24
|
-
});
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
// Wrapper for createFunction to lock down options if needed
|
|
28
|
-
export function createFunction(
|
|
29
|
-
name: string,
|
|
30
|
-
trigger: { event: string } | { cron: string },
|
|
31
|
-
handler: (args: any) => Promise<any>,
|
|
32
|
-
) {
|
|
33
|
-
return getClient().createFunction({ id: name }, trigger, handler);
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
// Export the client for advance usage if necessary
|
|
37
|
-
export { client as inngest };
|