serverless-ircd 0.1.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/.github/workflows/ci.yml +47 -0
- package/.github/workflows/deploy-cf.yml +97 -0
- package/LICENSE +29 -0
- package/README.md +323 -0
- package/apps/cf-worker/package.json +37 -0
- package/apps/cf-worker/scripts/smoke.mjs +175 -0
- package/apps/cf-worker/src/worker.ts +59 -0
- package/apps/cf-worker/tests/smoke.test.ts +150 -0
- package/apps/cf-worker/tsconfig.build.json +17 -0
- package/apps/cf-worker/tsconfig.test.json +18 -0
- package/apps/cf-worker/vitest.config.ts +31 -0
- package/apps/cf-worker/wrangler.test.toml +33 -0
- package/apps/cf-worker/wrangler.toml +98 -0
- package/apps/local-cli/package.json +35 -0
- package/apps/local-cli/src/line-scanner.ts +60 -0
- package/apps/local-cli/src/main.ts +145 -0
- package/apps/local-cli/src/motd-file.ts +45 -0
- package/apps/local-cli/src/server.ts +409 -0
- package/apps/local-cli/tests/e2e.test.ts +346 -0
- package/apps/local-cli/tests/id-factory.test.ts +25 -0
- package/apps/local-cli/tests/line-scanner.test.ts +81 -0
- package/apps/local-cli/tests/motd-file.test.ts +71 -0
- package/apps/local-cli/tests/tcp.test.ts +358 -0
- package/apps/local-cli/tsconfig.build.json +17 -0
- package/apps/local-cli/tsconfig.test.json +15 -0
- package/apps/local-cli/vitest.config.ts +24 -0
- package/biome.json +52 -0
- package/package.json +35 -0
- package/packages/cf-adapter/package.json +38 -0
- package/packages/cf-adapter/src/cf-runtime.ts +308 -0
- package/packages/cf-adapter/src/channel-do.ts +374 -0
- package/packages/cf-adapter/src/connection-do.ts +542 -0
- package/packages/cf-adapter/src/env.ts +67 -0
- package/packages/cf-adapter/src/index.ts +38 -0
- package/packages/cf-adapter/src/registry-do.ts +130 -0
- package/packages/cf-adapter/src/serialize.ts +142 -0
- package/packages/cf-adapter/src/sharding.ts +101 -0
- package/packages/cf-adapter/tests/cf-harness.ts +264 -0
- package/packages/cf-adapter/tests/cf-integration.test.ts +73 -0
- package/packages/cf-adapter/tests/cf-runtime.test.ts +527 -0
- package/packages/cf-adapter/tests/channel-do.test.ts +480 -0
- package/packages/cf-adapter/tests/connection-do.test.ts +329 -0
- package/packages/cf-adapter/tests/integration/harness.test.ts +229 -0
- package/packages/cf-adapter/tests/integration/harness.ts +102 -0
- package/packages/cf-adapter/tests/integration/in-memory-harness.ts +242 -0
- package/packages/cf-adapter/tests/integration/index.ts +17 -0
- package/packages/cf-adapter/tests/integration/scenarios.test.ts +20 -0
- package/packages/cf-adapter/tests/integration/scenarios.ts +495 -0
- package/packages/cf-adapter/tests/registry-do.test.ts +335 -0
- package/packages/cf-adapter/tests/sharding.test.ts +100 -0
- package/packages/cf-adapter/tests/worker/main.ts +33 -0
- package/packages/cf-adapter/tests/worker/stubs/channel-stub.ts +50 -0
- package/packages/cf-adapter/tests/worker/stubs/registry-stub.ts +57 -0
- package/packages/cf-adapter/tsconfig.build.json +16 -0
- package/packages/cf-adapter/tsconfig.test.json +18 -0
- package/packages/cf-adapter/vitest.config.ts +32 -0
- package/packages/cf-adapter/wrangler.test.toml +50 -0
- package/packages/in-memory-runtime/package.json +29 -0
- package/packages/in-memory-runtime/src/in-memory-runtime.ts +245 -0
- package/packages/in-memory-runtime/src/index.ts +9 -0
- package/packages/in-memory-runtime/tests/in-memory-runtime.test.ts +502 -0
- package/packages/in-memory-runtime/tsconfig.build.json +16 -0
- package/packages/in-memory-runtime/tsconfig.test.json +14 -0
- package/packages/in-memory-runtime/vitest.config.ts +21 -0
- package/packages/irc-core/package.json +29 -0
- package/packages/irc-core/src/caps/capabilities.ts +96 -0
- package/packages/irc-core/src/caps/index.ts +1 -0
- package/packages/irc-core/src/commands/away.ts +82 -0
- package/packages/irc-core/src/commands/cap.ts +257 -0
- package/packages/irc-core/src/commands/chghost.ts +30 -0
- package/packages/irc-core/src/commands/index.ts +40 -0
- package/packages/irc-core/src/commands/invite.ts +156 -0
- package/packages/irc-core/src/commands/isupport.ts +133 -0
- package/packages/irc-core/src/commands/join.ts +309 -0
- package/packages/irc-core/src/commands/kick.ts +162 -0
- package/packages/irc-core/src/commands/list.ts +126 -0
- package/packages/irc-core/src/commands/mode.ts +655 -0
- package/packages/irc-core/src/commands/motd.ts +146 -0
- package/packages/irc-core/src/commands/names.ts +164 -0
- package/packages/irc-core/src/commands/part.ts +118 -0
- package/packages/irc-core/src/commands/ping.ts +47 -0
- package/packages/irc-core/src/commands/privmsg.ts +256 -0
- package/packages/irc-core/src/commands/quit.ts +70 -0
- package/packages/irc-core/src/commands/registration.ts +251 -0
- package/packages/irc-core/src/commands/topic.ts +171 -0
- package/packages/irc-core/src/commands/who.ts +169 -0
- package/packages/irc-core/src/commands/whois.ts +165 -0
- package/packages/irc-core/src/effects.ts +184 -0
- package/packages/irc-core/src/index.ts +20 -0
- package/packages/irc-core/src/ports.ts +153 -0
- package/packages/irc-core/src/protocol/batch.ts +85 -0
- package/packages/irc-core/src/protocol/index.ts +18 -0
- package/packages/irc-core/src/protocol/messages.ts +36 -0
- package/packages/irc-core/src/protocol/numerics.ts +155 -0
- package/packages/irc-core/src/protocol/outbound.ts +145 -0
- package/packages/irc-core/src/protocol/parser.ts +175 -0
- package/packages/irc-core/src/protocol/serializer.ts +71 -0
- package/packages/irc-core/src/state/channel.ts +293 -0
- package/packages/irc-core/src/state/connection.ts +153 -0
- package/packages/irc-core/src/state/index.ts +25 -0
- package/packages/irc-core/src/state/registry.ts +22 -0
- package/packages/irc-core/src/types.ts +83 -0
- package/packages/irc-core/tests/batch.test.ts +79 -0
- package/packages/irc-core/tests/caps/capabilities.test.ts +148 -0
- package/packages/irc-core/tests/commands/away.test.ts +233 -0
- package/packages/irc-core/tests/commands/batch.test.ts +178 -0
- package/packages/irc-core/tests/commands/cap.test.ts +499 -0
- package/packages/irc-core/tests/commands/chghost.test.ts +186 -0
- package/packages/irc-core/tests/commands/echo-message.test.ts +212 -0
- package/packages/irc-core/tests/commands/extended-join.test.ts +147 -0
- package/packages/irc-core/tests/commands/invite-notify.test.ts +160 -0
- package/packages/irc-core/tests/commands/invite.test.ts +321 -0
- package/packages/irc-core/tests/commands/isupport.test.ts +209 -0
- package/packages/irc-core/tests/commands/join.test.ts +687 -0
- package/packages/irc-core/tests/commands/kick.test.ts +316 -0
- package/packages/irc-core/tests/commands/list.test.ts +452 -0
- package/packages/irc-core/tests/commands/mode.test.ts +1048 -0
- package/packages/irc-core/tests/commands/motd.test.ts +322 -0
- package/packages/irc-core/tests/commands/names.test.ts +342 -0
- package/packages/irc-core/tests/commands/part.test.ts +265 -0
- package/packages/irc-core/tests/commands/ping.test.ts +144 -0
- package/packages/irc-core/tests/commands/privmsg.test.ts +665 -0
- package/packages/irc-core/tests/commands/quit.test.ts +220 -0
- package/packages/irc-core/tests/commands/registration.test.ts +599 -0
- package/packages/irc-core/tests/commands/topic.test.ts +337 -0
- package/packages/irc-core/tests/commands/who.test.ts +441 -0
- package/packages/irc-core/tests/commands/whois.test.ts +422 -0
- package/packages/irc-core/tests/effects.test.ts +147 -0
- package/packages/irc-core/tests/message-tags.test.ts +182 -0
- package/packages/irc-core/tests/numerics.test.ts +98 -0
- package/packages/irc-core/tests/outbound.test.ts +232 -0
- package/packages/irc-core/tests/parser.test.ts +162 -0
- package/packages/irc-core/tests/ports.test.ts +101 -0
- package/packages/irc-core/tests/serializer.test.ts +164 -0
- package/packages/irc-core/tests/state/channel.test.ts +351 -0
- package/packages/irc-core/tests/state/connection.test.ts +122 -0
- package/packages/irc-core/tests/state/registry.test.ts +20 -0
- package/packages/irc-core/tests/types.test.ts +127 -0
- package/packages/irc-core/tsconfig.build.json +12 -0
- package/packages/irc-core/tsconfig.test.json +10 -0
- package/packages/irc-core/vitest.config.ts +21 -0
- package/packages/irc-server/package.json +28 -0
- package/packages/irc-server/src/actor.ts +449 -0
- package/packages/irc-server/src/dispatch.ts +120 -0
- package/packages/irc-server/src/index.ts +11 -0
- package/packages/irc-server/src/runtime.ts +61 -0
- package/packages/irc-server/tests/actor.test.ts +816 -0
- package/packages/irc-server/tests/dispatch.test.ts +512 -0
- package/packages/irc-server/tests/runtime.test.ts +52 -0
- package/packages/irc-server/tsconfig.build.json +13 -0
- package/packages/irc-server/tsconfig.test.json +11 -0
- package/packages/irc-server/vitest.config.ts +21 -0
- package/pnpm-workspace.yaml +4 -0
- package/tools/tcp-ws-forwarder/package.json +32 -0
- package/tools/tcp-ws-forwarder/src/forwarder.ts +244 -0
- package/tools/tcp-ws-forwarder/src/line-scanner.ts +55 -0
- package/tools/tcp-ws-forwarder/src/main.ts +114 -0
- package/tools/tcp-ws-forwarder/tests/forwarder.test.ts +618 -0
- package/tools/tcp-ws-forwarder/tests/framing.test.ts +51 -0
- package/tools/tcp-ws-forwarder/tests/line-scanner.test.ts +75 -0
- package/tools/tcp-ws-forwarder/tsconfig.build.json +12 -0
- package/tools/tcp-ws-forwarder/tsconfig.test.json +10 -0
- package/tools/tcp-ws-forwarder/vitest.config.ts +27 -0
- package/tsconfig.base.json +25 -0
- package/turbo.json +29 -0
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { LineScanner } from '../src/line-scanner';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* The line scanner is the only stateful piece of framing in the forwarder;
|
|
6
|
+
* it must be byte-accurate at chunk boundaries and tolerant of both CRLF
|
|
7
|
+
* and bare-LF line endings (PLAN §9 transport tolerance). These tests pin
|
|
8
|
+
* that contract in isolation, away from real sockets.
|
|
9
|
+
*/
|
|
10
|
+
describe('LineScanner', () => {
|
|
11
|
+
it('emits a single CRLF-terminated line and leaves no carry', () => {
|
|
12
|
+
const s = new LineScanner();
|
|
13
|
+
expect(s.push(Buffer.from('PING :tok\r\n'))).toEqual(['PING :tok']);
|
|
14
|
+
expect(s.flush()).toEqual([]);
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
it('emits each of several CRLF-terminated lines in one chunk in order', () => {
|
|
18
|
+
const s = new LineScanner();
|
|
19
|
+
expect(s.push(Buffer.from('A\r\nB\r\nC\r\n'))).toEqual(['A', 'B', 'C']);
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
it('buffers a partial line across chunks and joins it once terminated', () => {
|
|
23
|
+
const s = new LineScanner();
|
|
24
|
+
expect(s.push(Buffer.from('PI'))).toEqual([]);
|
|
25
|
+
expect(s.push(Buffer.from('NG :tok\r\n'))).toEqual(['PING :tok']);
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
it('preserves a UTF-8 multi-byte character split across chunks', () => {
|
|
29
|
+
// 'café :hi\r\n' is bytes: c a f 0xC3 0xA9 SP : h i CR LF (11 bytes).
|
|
30
|
+
// Split at offset 4 — inside 'é' (0xC3 | 0xA9).
|
|
31
|
+
const full = Buffer.from('café :hi\r\n', 'utf8');
|
|
32
|
+
const s = new LineScanner();
|
|
33
|
+
expect(s.push(full.subarray(0, 4))).toEqual([]); // carries 'caf' + first byte of é
|
|
34
|
+
expect(s.push(full.subarray(4))).toEqual(['café :hi']); // second byte completes é
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
it('tolerates bare LF line endings', () => {
|
|
38
|
+
const s = new LineScanner();
|
|
39
|
+
expect(s.push(Buffer.from('A\nB\n'))).toEqual(['A', 'B']);
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
it('tolerates a mix of CRLF and bare LF endings', () => {
|
|
43
|
+
const s = new LineScanner();
|
|
44
|
+
expect(s.push(Buffer.from('A\r\nB\nC\r\n'))).toEqual(['A', 'B', 'C']);
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
it('returns no lines for empty input', () => {
|
|
48
|
+
const s = new LineScanner();
|
|
49
|
+
expect(s.push(Buffer.alloc(0))).toEqual([]);
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
it('keeps an unterminated tail buffered until a terminator arrives', () => {
|
|
53
|
+
const s = new LineScanner();
|
|
54
|
+
expect(s.push(Buffer.from('partial'))).toEqual([]);
|
|
55
|
+
expect(s.push(Buffer.from(' line\r\n'))).toEqual(['partial line']);
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
it('flush returns a previously-unterminated tail (lossless)', () => {
|
|
59
|
+
const s = new LineScanner();
|
|
60
|
+
s.push(Buffer.from('no-newline-here'));
|
|
61
|
+
expect(s.flush()).toEqual(['no-newline-here']);
|
|
62
|
+
expect(s.flush()).toEqual([]);
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
it('flush is empty when there is no carry', () => {
|
|
66
|
+
const s = new LineScanner();
|
|
67
|
+
expect(s.flush()).toEqual([]);
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
it('does not strip a leading CR that is not part of a CRLF', () => {
|
|
71
|
+
// A bare \r in the middle of text is data, not a terminator.
|
|
72
|
+
const s = new LineScanner();
|
|
73
|
+
expect(s.push(Buffer.from('a\rb\r\n'))).toEqual(['a\rb']);
|
|
74
|
+
});
|
|
75
|
+
});
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
{
|
|
2
|
+
"extends": "../../tsconfig.base.json",
|
|
3
|
+
"compilerOptions": {
|
|
4
|
+
"composite": true,
|
|
5
|
+
"rootDir": "./src",
|
|
6
|
+
"outDir": "./dist",
|
|
7
|
+
"tsBuildInfoFile": "./.tsbuildinfo",
|
|
8
|
+
"types": ["node"]
|
|
9
|
+
},
|
|
10
|
+
"include": ["src/**/*.ts"],
|
|
11
|
+
"exclude": ["dist", "tests", "**/*.test.ts"]
|
|
12
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { defineConfig } from 'vitest/config';
|
|
2
|
+
|
|
3
|
+
export default defineConfig({
|
|
4
|
+
test: {
|
|
5
|
+
environment: 'node',
|
|
6
|
+
include: ['tests/**/*.test.ts'],
|
|
7
|
+
// Forwarder integration tests spin up real TCP + WS servers per case;
|
|
8
|
+
// give them a little headroom while staying fast enough for watch mode.
|
|
9
|
+
testTimeout: 5000,
|
|
10
|
+
hookTimeout: 5000,
|
|
11
|
+
coverage: {
|
|
12
|
+
provider: 'v8',
|
|
13
|
+
all: false,
|
|
14
|
+
include: ['src/**/*.ts'],
|
|
15
|
+
// `main.ts` is CLI glue (argv parsing, signal handlers); exercised
|
|
16
|
+
// manually by `pnpm start`. Mirrors the apps/local-cli policy.
|
|
17
|
+
exclude: ['src/main.ts'],
|
|
18
|
+
reporter: ['text', 'html', 'json-summary'],
|
|
19
|
+
thresholds: {
|
|
20
|
+
lines: 90,
|
|
21
|
+
functions: 90,
|
|
22
|
+
branches: 80,
|
|
23
|
+
statements: 90,
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
});
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2022",
|
|
4
|
+
"module": "ESNext",
|
|
5
|
+
"moduleResolution": "Bundler",
|
|
6
|
+
"lib": ["ES2022"],
|
|
7
|
+
"declaration": true,
|
|
8
|
+
"declarationMap": true,
|
|
9
|
+
"sourceMap": true,
|
|
10
|
+
"strict": true,
|
|
11
|
+
"noUncheckedIndexedAccess": true,
|
|
12
|
+
"noImplicitOverride": true,
|
|
13
|
+
"noFallthroughCasesInSwitch": true,
|
|
14
|
+
"exactOptionalPropertyTypes": true,
|
|
15
|
+
"noUnusedLocals": true,
|
|
16
|
+
"noUnusedParameters": true,
|
|
17
|
+
"isolatedModules": true,
|
|
18
|
+
"verbatimModuleSyntax": true,
|
|
19
|
+
"esModuleInterop": true,
|
|
20
|
+
"forceConsistentCasingInFileNames": true,
|
|
21
|
+
"resolveJsonModule": true,
|
|
22
|
+
"skipLibCheck": true,
|
|
23
|
+
"useDefineForClassFields": true
|
|
24
|
+
}
|
|
25
|
+
}
|
package/turbo.json
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://turbo.build/schema.json",
|
|
3
|
+
"ui": "stream",
|
|
4
|
+
"globalDependencies": ["tsconfig.base.json", "biome.json"],
|
|
5
|
+
"tasks": {
|
|
6
|
+
"build": {
|
|
7
|
+
"dependsOn": ["^build"],
|
|
8
|
+
"outputs": ["dist/**"]
|
|
9
|
+
},
|
|
10
|
+
"typecheck": {
|
|
11
|
+
"dependsOn": ["^build"]
|
|
12
|
+
},
|
|
13
|
+
"test": {
|
|
14
|
+
"dependsOn": ["^build"],
|
|
15
|
+
"outputs": ["coverage/**"]
|
|
16
|
+
},
|
|
17
|
+
"test:watch": {
|
|
18
|
+
"cache": false,
|
|
19
|
+
"persistent": true
|
|
20
|
+
},
|
|
21
|
+
"coverage": {
|
|
22
|
+
"dependsOn": ["^build"],
|
|
23
|
+
"outputs": ["coverage/**"]
|
|
24
|
+
},
|
|
25
|
+
"clean": {
|
|
26
|
+
"cache": false
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|