From e0def78d2708252733adae182052d2be4a49859f Mon Sep 17 00:00:00 2001 From: Dan Farrelly Date: Fri, 20 Dec 2024 16:09:11 -0500 Subject: [PATCH 1/8] Add vanilla Node.js handler --- packages/inngest/src/node.test.ts | 38 ++++++++ packages/inngest/src/node.ts | 142 ++++++++++++++++++++++++++++++ packages/inngest/src/types.ts | 1 + 3 files changed, 181 insertions(+) create mode 100644 packages/inngest/src/node.test.ts create mode 100644 packages/inngest/src/node.ts diff --git a/packages/inngest/src/node.test.ts b/packages/inngest/src/node.test.ts new file mode 100644 index 00000000..5a2685d8 --- /dev/null +++ b/packages/inngest/src/node.test.ts @@ -0,0 +1,38 @@ +import http from "node:http"; +import { Socket } from "node:net"; +import { Buffer } from "node:buffer"; +import * as NodeHandler from "@local/node"; +import { testFramework } from "./test/helpers"; + +testFramework("Node", NodeHandler, { + transformReq: (req, res) => { + const socket = new Socket(); + const nodeReq = new http.IncomingMessage(socket); + + // Set the method and URL + nodeReq.method = req.method; + nodeReq.url = req.url; + + if (req.protocol === "https") { + nodeReq.headers["x-forwarded-proto"] = req.protocol; + } + + // Set headers + for (const [key, value] of Object.entries(req.headers)) { + nodeReq.headers[key.toLowerCase()] = value; + } + + // Mock the body data + const bodyData = Buffer.from(JSON.stringify(req.body)); + + nodeReq.on("end", () => { + console.log("END!"); + }); + + // Override the read methods to return the body data + nodeReq.push(bodyData); + nodeReq.push(null); // Signals the end of the stream + + return [nodeReq, res]; + }, +}); diff --git a/packages/inngest/src/node.ts b/packages/inngest/src/node.ts new file mode 100644 index 00000000..edd3bbea --- /dev/null +++ b/packages/inngest/src/node.ts @@ -0,0 +1,142 @@ +import http from "node:http"; +import { type TLSSocket } from "node:tls"; +import { URL } from "node:url"; +import { + InngestCommHandler, + type ServeHandlerOptions, +} from "./components/InngestCommHandler.js"; +import { type SupportedFrameworkName } from "./types.js"; + +/** + * The name of the framework, used to identify the framework in Inngest + * dashboards and during testing. + */ +export const frameworkName: SupportedFrameworkName = "nodejs"; + +/** + * Parse the incoming message request as a JSON body + */ +async function parseRequestBody(req: http.IncomingMessage): Promise { + return new Promise((resolve, reject) => { + let body = ""; + req.on("data", (chunk) => { + body += chunk; + }); + req.on("end", () => { + try { + const json = JSON.parse(body) as unknown; + resolve(json); + } catch (err) { + reject(err); + } + }); + }); +} + +function getURL(req: http.IncomingMessage, hostnameOption?: string): URL { + const protocol = + (req.headers["x-forwarded-proto"] as string) || + ((req.socket as TLSSocket)?.encrypted ? "https" : "http"); + const origin = hostnameOption || `${protocol}://${req.headers.host}`; + return new URL(req.url || "", origin); +} + +/** + * Serve and register any declared functions with Inngest, making them available + * to be triggered by events. + * + * @example Serve Inngest functions on all paths + * ```ts + * import { serve } from "inngest/node"; + * import { inngest } from "./src/inngest/client"; + * import myFn from "./src/inngest/myFn"; // Your own function + * + * const server = http.createServer(serve({ + * client: inngest, functions: [myFn] + * })); + * server.listen(3000); + * ``` + * + * @example Serve Inngest on a specific path + * ```ts + * import { serve } from "inngest/node"; + * import { inngest } from "./src/inngest/client"; + * import myFn from "./src/inngest/myFn"; // Your own function + * + * const server = http.createServer((req, res) => { + * if (req.url.start === '/api/inngest') { + * return serve({ + * client: inngest, functions: [myFn] + * })(req, res); + * } + * // ... + * }); + * server.listen(3000); + * ``` + * + * @public + */ +// Has explicit return type to avoid JSR-defined "slow types" +export const serve = (options: ServeHandlerOptions): http.RequestListener => { + const handler = new InngestCommHandler({ + frameworkName, + ...options, + handler: (req: http.IncomingMessage, res: http.ServerResponse) => { + return { + body: async () => parseRequestBody(req), + headers: (key) => { + return req.headers[key] && Array.isArray(req.headers[key]) + ? req.headers[key][0] + : req.headers[key]; + }, + method: () => { + if (!req.method) { + throw new Error( + "Request method not defined. Potential use outside of context of Server." + ); + } + return req.method; + }, + url: () => getURL(req, options.serveHost), + transformResponse: ({ body, status, headers }) => { + res.writeHead(status, headers); + res.end(body); + }, + }; + }, + }); + return handler.createHandler() as http.RequestListener; +}; + +/** + * EXPERIMENTAL - Create an http server to serve Inngest functions. + * + * @example + * ```ts + * import { createServer } from "inngest/node"; + * import { inngest } from "./src/inngest/client"; + * import myFn from "./src/inngest/myFn"; // Your own function + * + * const server = createServer({ + * client: inngest, functions: [myFn] + * }); + * server.listen(3000); + * ``` + * + * @public + */ +export const createServer = (options: ServeHandlerOptions) => { + const server = http.createServer((req, res) => { + const url = getURL(req, options.serveHost); + const pathname = options.servePath || "/api/inngest"; + if (url.pathname === pathname) { + return serve(options)(req, res); + } + res.writeHead(404); + res.end(); + }); + server.on("clientError", (err, socket) => { + socket.end("HTTP/1.1 400 Bad Request\r\n\r\n"); + }); + return server; +}; diff --git a/packages/inngest/src/types.ts b/packages/inngest/src/types.ts index 9925fe5a..6ebb93e1 100644 --- a/packages/inngest/src/types.ts +++ b/packages/inngest/src/types.ts @@ -1254,6 +1254,7 @@ export type SupportedFrameworkName = | "express" | "aws-lambda" | "nextjs" + | "nodejs" | "nuxt" | "h3" | "redwoodjs" From 92e6c67069d4630e429b4589be06cec7e1849b7c Mon Sep 17 00:00:00 2001 From: Dan Farrelly Date: Fri, 20 Dec 2024 16:12:55 -0500 Subject: [PATCH 2/8] Remove test logging --- packages/inngest/src/node.test.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/packages/inngest/src/node.test.ts b/packages/inngest/src/node.test.ts index 5a2685d8..d6cfc318 100644 --- a/packages/inngest/src/node.test.ts +++ b/packages/inngest/src/node.test.ts @@ -25,10 +25,6 @@ testFramework("Node", NodeHandler, { // Mock the body data const bodyData = Buffer.from(JSON.stringify(req.body)); - nodeReq.on("end", () => { - console.log("END!"); - }); - // Override the read methods to return the body data nodeReq.push(bodyData); nodeReq.push(null); // Signals the end of the stream From f4979569aa99e0b7d5469d5cdb1b8fdaeccc3fba Mon Sep 17 00:00:00 2001 From: Dan Farrelly Date: Fri, 20 Dec 2024 16:24:45 -0500 Subject: [PATCH 3/8] Add example server for Node --- examples/framework-node/.gitignore | 2 + examples/framework-node/README.md | 28 +++++ examples/framework-node/index.ts | 8 ++ examples/framework-node/inngest/client.ts | 4 + examples/framework-node/inngest/helloWorld.ts | 11 ++ examples/framework-node/inngest/index.ts | 5 + examples/framework-node/inngest/types.ts | 10 ++ examples/framework-node/package.json | 21 ++++ examples/framework-node/tsconfig.json | 109 ++++++++++++++++++ packages/inngest/package.json | 5 + 10 files changed, 203 insertions(+) create mode 100644 examples/framework-node/.gitignore create mode 100644 examples/framework-node/README.md create mode 100644 examples/framework-node/index.ts create mode 100644 examples/framework-node/inngest/client.ts create mode 100644 examples/framework-node/inngest/helloWorld.ts create mode 100644 examples/framework-node/inngest/index.ts create mode 100644 examples/framework-node/inngest/types.ts create mode 100644 examples/framework-node/package.json create mode 100644 examples/framework-node/tsconfig.json diff --git a/examples/framework-node/.gitignore b/examples/framework-node/.gitignore new file mode 100644 index 00000000..23a608b6 --- /dev/null +++ b/examples/framework-node/.gitignore @@ -0,0 +1,2 @@ +node_modules +*.js diff --git a/examples/framework-node/README.md b/examples/framework-node/README.md new file mode 100644 index 00000000..e627b6ab --- /dev/null +++ b/examples/framework-node/README.md @@ -0,0 +1,28 @@ +# Inngest Node.js Template + +This is a vanilla Node.js server project. It is a minimal zero-external dependencies example of how to run Inngest natively in Node.js. + +## Getting Started + +Use [`create-next-app`](https://www.npmjs.com/package/create-next-app) with [npm](https://docs.npmjs.com/cli/init), [Yarn](https://yarnpkg.com/lang/en/docs/cli/create/), or [pnpm](https://pnpm.io) to bootstrap the example: + +```bash +npx create-next-app --example https://github.com/inngest/inngest-js/tree/main/examples/framework-node inngest-node +``` + +```bash +yarn create next-app --example https://github.com/inngest/inngest-js/tree/main/examples/framework-node inngest-node +``` + +```bash +pnpm create next-app --example https://github.com/inngest/inngest-js/tree/main/examples/framework-node inngest-node +``` + +Open http://localhost:3000 with your browser to see the result. + +- [Inngest functions](https://www.inngest.com/docs/functions) are available at `inngest/`. +- The [Inngest handler](https://www.inngest.com/docs/sdk/serve) is available at `index.ts`. + +## Learn More + +- [Inngest Documentation](https://www.inngest.com/docs) - learn about the Inngest SDK, functions, and events diff --git a/examples/framework-node/index.ts b/examples/framework-node/index.ts new file mode 100644 index 00000000..d0e3ac2f --- /dev/null +++ b/examples/framework-node/index.ts @@ -0,0 +1,8 @@ +import { createServer } from 'inngest/node'; +import { functions, inngest } from './inngest'; + +const server = createServer({ client: inngest, functions }); + +server.listen(3000, () => { + console.log('Server running on http://localhost:3000'); +}); diff --git a/examples/framework-node/inngest/client.ts b/examples/framework-node/inngest/client.ts new file mode 100644 index 00000000..57022b79 --- /dev/null +++ b/examples/framework-node/inngest/client.ts @@ -0,0 +1,4 @@ +import { Inngest } from "inngest"; +import { schemas } from "./types"; + +export const inngest = new Inngest({ id: "my-express-app", schemas }); diff --git a/examples/framework-node/inngest/helloWorld.ts b/examples/framework-node/inngest/helloWorld.ts new file mode 100644 index 00000000..7e083dbd --- /dev/null +++ b/examples/framework-node/inngest/helloWorld.ts @@ -0,0 +1,11 @@ +import { inngest } from "./client"; + +export default inngest.createFunction( + { id: "hello-world" }, + { event: "demo/event.sent" }, + async ({ event, step }) => { + return { + message: `Hello ${event.name}!`, + }; + } +); diff --git a/examples/framework-node/inngest/index.ts b/examples/framework-node/inngest/index.ts new file mode 100644 index 00000000..2315e5f4 --- /dev/null +++ b/examples/framework-node/inngest/index.ts @@ -0,0 +1,5 @@ +import helloWorld from "./helloWorld"; + +export const functions = [helloWorld]; + +export { inngest } from "./client"; diff --git a/examples/framework-node/inngest/types.ts b/examples/framework-node/inngest/types.ts new file mode 100644 index 00000000..bb570b2c --- /dev/null +++ b/examples/framework-node/inngest/types.ts @@ -0,0 +1,10 @@ +import { EventSchemas } from "inngest"; + +type DemoEventSent = { + name: "demo/event.sent"; + data: { + message: string; + }; +}; + +export const schemas = new EventSchemas().fromUnion(); diff --git a/examples/framework-node/package.json b/examples/framework-node/package.json new file mode 100644 index 00000000..12fafed1 --- /dev/null +++ b/examples/framework-node/package.json @@ -0,0 +1,21 @@ +{ + "name": "framework-nodejs", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "build": "tsc -p tsconfig.json", + "dev": "tsx index.ts", + "start": "node dist/index.js" + }, + "author": "", + "license": "ISC", + "dependencies": { + "inngest": "^3.0.0" + }, + "devDependencies": { + "@types/node": "^20.5.2", + "tsx": "^4.7.3", + "typescript": "^5.1.6" + } +} diff --git a/examples/framework-node/tsconfig.json b/examples/framework-node/tsconfig.json new file mode 100644 index 00000000..a56cef67 --- /dev/null +++ b/examples/framework-node/tsconfig.json @@ -0,0 +1,109 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig to read more about this file */ + + /* Projects */ + // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ + // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ + // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ + // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ + // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ + // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ + + /* Language and Environment */ + "target": "es2016" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */, + // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ + // "jsx": "preserve", /* Specify what JSX code is generated. */ + // "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */ + // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ + // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ + // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ + // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ + // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ + // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ + // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ + // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ + + /* Modules */ + "module": "commonjs" /* Specify what module code is generated. */, + // "rootDir": "./", /* Specify the root folder within your source files. */ + // "moduleResolution": "node10", /* Specify how TypeScript looks up a file from a given module specifier. */ + // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ + // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ + // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ + // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ + // "types": [], /* Specify type package names to be included without being referenced in a source file. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ + // "allowImportingTsExtensions": true, /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */ + // "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */ + // "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */ + // "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */ + // "resolveJsonModule": true, /* Enable importing .json files. */ + // "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */ + // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ + + /* JavaScript Support */ + // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ + // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ + // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ + + /* Emit */ + // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ + // "declarationMap": true, /* Create sourcemaps for d.ts files. */ + // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ + // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ + // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ + // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ + "outDir": "./dist" /* Specify an output folder for all emitted files. */, + // "removeComments": true, /* Disable emitting comments. */ + // "noEmit": true, /* Disable emitting files from a compilation. */ + // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ + // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */ + // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ + // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ + // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ + // "newLine": "crlf", /* Set the newline character for emitting files. */ + // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ + // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ + // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ + // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ + // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ + // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ + + /* Interop Constraints */ + // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ + // "verbatimModuleSyntax": true, /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */ + // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ + "esModuleInterop": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */, + // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ + "forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */, + + /* Type Checking */ + "strict": true /* Enable all strict type-checking options. */, + // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ + // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ + // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ + // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ + // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ + // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ + // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ + // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ + // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ + // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ + // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ + // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ + // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ + // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ + // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ + // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ + // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ + // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ + + /* Completeness */ + // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ + "skipLibCheck": true /* Skip type checking all .d.ts files. */ + } +} diff --git a/packages/inngest/package.json b/packages/inngest/package.json index 42705114..0e64c4c1 100644 --- a/packages/inngest/package.json +++ b/packages/inngest/package.json @@ -132,6 +132,11 @@ "import": "./nitro.js", "types": "./nitro.d.ts" }, + "./node": { + "require": "./node.js", + "import": "./node.js", + "types": "./node.d.ts" + }, "./types": { "require": "./types.js", "import": "./types.js", From 193de8fac3bc09c44cc193cd5182be96a99bc2b3 Mon Sep 17 00:00:00 2001 From: Dan Farrelly Date: Fri, 20 Dec 2024 16:28:45 -0500 Subject: [PATCH 4/8] Rename examples dir --- examples/{framework-node => node}/.gitignore | 0 examples/{framework-node => node}/README.md | 0 examples/{framework-node => node}/index.ts | 0 examples/{framework-node => node}/inngest/client.ts | 0 examples/{framework-node => node}/inngest/helloWorld.ts | 0 examples/{framework-node => node}/inngest/index.ts | 0 examples/{framework-node => node}/inngest/types.ts | 0 examples/{framework-node => node}/package.json | 0 examples/{framework-node => node}/tsconfig.json | 0 9 files changed, 0 insertions(+), 0 deletions(-) rename examples/{framework-node => node}/.gitignore (100%) rename examples/{framework-node => node}/README.md (100%) rename examples/{framework-node => node}/index.ts (100%) rename examples/{framework-node => node}/inngest/client.ts (100%) rename examples/{framework-node => node}/inngest/helloWorld.ts (100%) rename examples/{framework-node => node}/inngest/index.ts (100%) rename examples/{framework-node => node}/inngest/types.ts (100%) rename examples/{framework-node => node}/package.json (100%) rename examples/{framework-node => node}/tsconfig.json (100%) diff --git a/examples/framework-node/.gitignore b/examples/node/.gitignore similarity index 100% rename from examples/framework-node/.gitignore rename to examples/node/.gitignore diff --git a/examples/framework-node/README.md b/examples/node/README.md similarity index 100% rename from examples/framework-node/README.md rename to examples/node/README.md diff --git a/examples/framework-node/index.ts b/examples/node/index.ts similarity index 100% rename from examples/framework-node/index.ts rename to examples/node/index.ts diff --git a/examples/framework-node/inngest/client.ts b/examples/node/inngest/client.ts similarity index 100% rename from examples/framework-node/inngest/client.ts rename to examples/node/inngest/client.ts diff --git a/examples/framework-node/inngest/helloWorld.ts b/examples/node/inngest/helloWorld.ts similarity index 100% rename from examples/framework-node/inngest/helloWorld.ts rename to examples/node/inngest/helloWorld.ts diff --git a/examples/framework-node/inngest/index.ts b/examples/node/inngest/index.ts similarity index 100% rename from examples/framework-node/inngest/index.ts rename to examples/node/inngest/index.ts diff --git a/examples/framework-node/inngest/types.ts b/examples/node/inngest/types.ts similarity index 100% rename from examples/framework-node/inngest/types.ts rename to examples/node/inngest/types.ts diff --git a/examples/framework-node/package.json b/examples/node/package.json similarity index 100% rename from examples/framework-node/package.json rename to examples/node/package.json diff --git a/examples/framework-node/tsconfig.json b/examples/node/tsconfig.json similarity index 100% rename from examples/framework-node/tsconfig.json rename to examples/node/tsconfig.json From 7e108c1c0ed2b24cd799d119486adcf1aa8fd431 Mon Sep 17 00:00:00 2001 From: Dan Farrelly Date: Fri, 20 Dec 2024 16:39:39 -0500 Subject: [PATCH 5/8] Add changeset --- .changeset/new-experts-refuse.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/new-experts-refuse.md diff --git a/.changeset/new-experts-refuse.md b/.changeset/new-experts-refuse.md new file mode 100644 index 00000000..ce8a537f --- /dev/null +++ b/.changeset/new-experts-refuse.md @@ -0,0 +1,5 @@ +--- +'inngest': minor +--- + +Add vanilla Node.js serve handler From 68efa6455adf986cca74264e2abee73cecd68747 Mon Sep 17 00:00:00 2001 From: Jack Williams <1736957+jpwilliams@users.noreply.github.com> Date: Mon, 30 Dec 2024 15:32:33 +0000 Subject: [PATCH 6/8] Add `"inngest/node"` export for JSR --- packages/inngest/jsr.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/inngest/jsr.json b/packages/inngest/jsr.json index 5bb91c4b..d8030791 100644 --- a/packages/inngest/jsr.json +++ b/packages/inngest/jsr.json @@ -36,6 +36,7 @@ "./deno/fresh": "./src/deno/fresh.ts", "./hono": "./src/hono.ts", "./nitro": "./src/nitro.ts", + "./node": "./src/node.ts", "./types": "./src/types.ts" } -} \ No newline at end of file +} From ec89cadfa1dfd449cdce998d060b01e2025652f2 Mon Sep 17 00:00:00 2001 From: Jack Williams <1736957+jpwilliams@users.noreply.github.com> Date: Mon, 30 Dec 2024 15:33:40 +0000 Subject: [PATCH 7/8] Allow peer deps in `"inngest/node"` export --- packages/inngest/.eslintrc.js | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/inngest/.eslintrc.js b/packages/inngest/.eslintrc.js index fe555774..f9e5655e 100644 --- a/packages/inngest/.eslintrc.js +++ b/packages/inngest/.eslintrc.js @@ -50,6 +50,7 @@ module.exports = { "src/remix.ts", "src/sveltekit.ts", "src/nitro.ts", + "src/node.ts", ], includeInternal: true, includeTypes: true, From f988b44bb77890d3d855b156149cec3d0768bc54 Mon Sep 17 00:00:00 2001 From: Jack Williams <1736957+jpwilliams@users.noreply.github.com> Date: Mon, 30 Dec 2024 15:38:11 +0000 Subject: [PATCH 8/8] Force test `node` example --- .github/workflows/pr.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 83f55c08..bb6d9b41 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -223,6 +223,7 @@ jobs: streaming: force - example: framework-nextjs-app-router streaming: force + - example: node steps: # Checkout the repo - name: Checkout SDK