serverless-ircd 0.7.0 → 0.9.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 +7 -3
- package/.gitmodules +1 -1
- package/CHANGELOG.md +518 -29
- package/README.md +221 -161
- package/apps/aws-stack/package.json +1 -1
- package/apps/aws-stack/src/aws-stack.ts +186 -18
- package/apps/aws-stack/tests/stack.test.ts +400 -56
- package/apps/cf-tcp-container/package.json +1 -1
- package/apps/cf-tcp-container/src/container-server.ts +21 -1
- package/apps/cf-tcp-container/tests/config-loader.test.ts +43 -0
- package/apps/cf-tcp-container/tests/container-server.test.ts +249 -1
- package/apps/cf-tcp-container/tests/persistence.test.ts +9 -0
- package/apps/cf-tcp-container/tests/tls-e2e.test.ts +24 -5
- package/apps/cf-worker/package.json +1 -1
- package/apps/cf-worker/src/worker.ts +4 -4
- package/apps/cf-worker/tests/fixtures/web-dist/webclient/index.html +18 -0
- package/apps/cf-worker/tests/smoke.test.ts +5 -5
- package/apps/cf-worker/wrangler.test.toml +6 -6
- package/apps/cf-worker/wrangler.toml +7 -5
- package/apps/local-cli/package.json +1 -1
- package/apps/local-cli/src/config-loader.ts +8 -0
- package/apps/local-cli/src/main.ts +16 -0
- package/apps/local-cli/src/server.ts +95 -31
- package/apps/local-cli/tests/config-loader.test.ts +14 -0
- package/apps/local-cli/tests/config-resolution.test.ts +65 -0
- package/apps/local-cli/tests/motd-file-non-error.test.ts +29 -0
- package/apps/local-cli/tests/rehash.test.ts +147 -0
- package/apps/local-cli/tests/server-helpers.test.ts +63 -0
- package/apps/local-cli/tests/tcp.test.ts +89 -0
- package/apps/local-cli/tests/ws-subprotocol.test.ts +92 -0
- package/apps/web/landing/index.html +237 -16
- package/apps/web/package.json +3 -2
- package/apps/web/scripts/build.mjs +46 -16
- package/apps/web/src/build-env.ts +1 -1
- package/apps/web/src/config-schema.ts +6 -6
- package/apps/web/src/render-docs.ts +292 -0
- package/apps/web/tests/build-smoke.test.ts +43 -14
- package/apps/web/tests/config-schema.test.ts +1 -1
- package/apps/web/tests/landing-content.test.ts +103 -0
- package/apps/web/tests/render-docs.test.ts +198 -0
- package/docs/AWS-Adapter-Architecture.md +3 -2
- package/docs/AWS-Deployment.md +21 -8
- package/docs/Cloudflare-Deployment-Guide.md +22 -6
- package/docs/PlanExtensions.md +113 -3
- package/docs/Release-Process.md +23 -13
- package/docs/Services.md +578 -0
- package/docs/WebClientGuide.md +32 -31
- package/package.json +2 -2
- package/packages/aws-adapter/package.json +1 -1
- package/packages/aws-adapter/src/aws-runtime.ts +20 -1
- package/packages/aws-adapter/src/cdk-table-defs.ts +6 -0
- package/packages/aws-adapter/src/config-loader.ts +11 -0
- package/packages/aws-adapter/src/connection-counter.ts +89 -0
- package/packages/aws-adapter/src/dynamo-services-store.ts +649 -0
- package/packages/aws-adapter/src/handlers/connect.ts +55 -51
- package/packages/aws-adapter/src/handlers/default.ts +36 -4
- package/packages/aws-adapter/src/handlers/index.ts +15 -0
- package/packages/aws-adapter/src/handlers/nlb-stream.ts +25 -2
- package/packages/aws-adapter/src/handlers/sweeper.ts +5 -1
- package/packages/aws-adapter/src/index.ts +4 -0
- package/packages/aws-adapter/src/stats.ts +6 -1
- package/packages/aws-adapter/src/tables.ts +34 -4
- package/packages/aws-adapter/tests/aws-harness.ts +3 -0
- package/packages/aws-adapter/tests/aws-runtime.test.ts +23 -1
- package/packages/aws-adapter/tests/config-loader.test.ts +8 -0
- package/packages/aws-adapter/tests/connect.test.ts +158 -32
- package/packages/aws-adapter/tests/connection-counter.test.ts +144 -0
- package/packages/aws-adapter/tests/dynamo-services-store-dynamo.test.ts +183 -0
- package/packages/aws-adapter/tests/dynamo-services-store-unit.test.ts +568 -0
- package/packages/aws-adapter/tests/global-setup.ts +28 -1
- package/packages/aws-adapter/tests/gone-exception.test.ts +21 -2
- package/packages/aws-adapter/tests/handlers.test.ts +105 -3
- package/packages/aws-adapter/tests/nlb-stream.test.ts +29 -1
- package/packages/aws-adapter/tests/sweeper.test.ts +20 -0
- package/packages/aws-adapter/tests/tables.test.ts +6 -1
- package/packages/cf-adapter/package.json +1 -1
- package/packages/cf-adapter/src/config-loader.ts +11 -0
- package/packages/cf-adapter/src/connection-do.ts +130 -8
- package/packages/cf-adapter/src/d1-services-store.ts +703 -0
- package/packages/cf-adapter/src/env.ts +8 -0
- package/packages/cf-adapter/src/index.ts +5 -0
- package/packages/cf-adapter/tests/config-loader.test.ts +19 -0
- package/packages/cf-adapter/tests/connection-do-nickserv-d1.test.ts +128 -0
- package/packages/cf-adapter/tests/connection-do-pure.test.ts +130 -0
- package/packages/cf-adapter/tests/connection-do.test.ts +150 -2
- package/packages/cf-adapter/tests/d1-services-store.test.ts +582 -0
- package/packages/cf-adapter/tests/serialize.test.ts +1 -0
- package/packages/in-memory-runtime/package.json +1 -1
- package/packages/irc-core/package.json +1 -1
- package/packages/irc-core/scripts/generate-build-info.mjs +26 -5
- package/packages/irc-core/src/commands/account-auth.ts +200 -0
- package/packages/irc-core/src/commands/chanserv.ts +1166 -0
- package/packages/irc-core/src/commands/hostserv.ts +522 -0
- package/packages/irc-core/src/commands/index.ts +13 -0
- package/packages/irc-core/src/commands/join.ts +171 -9
- package/packages/irc-core/src/commands/markread.ts +202 -0
- package/packages/irc-core/src/commands/memoserv.ts +319 -0
- package/packages/irc-core/src/commands/mode.ts +96 -4
- package/packages/irc-core/src/commands/nickserv.ts +402 -0
- package/packages/irc-core/src/commands/oper.ts +18 -1
- package/packages/irc-core/src/commands/operserv.ts +346 -0
- package/packages/irc-core/src/commands/pre-away.ts +3 -1
- package/packages/irc-core/src/commands/privmsg.ts +42 -0
- package/packages/irc-core/src/commands/read-marker.ts +8 -8
- package/packages/irc-core/src/commands/registration.ts +78 -12
- package/packages/irc-core/src/commands/sasl.ts +18 -49
- package/packages/irc-core/src/commands/service-aliases.ts +52 -0
- package/packages/irc-core/src/commands/tagmsg.ts +41 -6
- package/packages/irc-core/src/commands/topic.ts +60 -10
- package/packages/irc-core/src/config.ts +36 -5
- package/packages/irc-core/src/effects.ts +56 -1
- package/packages/irc-core/src/ports.ts +1653 -84
- package/packages/irc-core/src/protocol/numerics.ts +8 -0
- package/packages/irc-core/src/state/channel.ts +38 -1
- package/packages/irc-core/src/state/connection.ts +25 -1
- package/packages/irc-core/src/types.ts +48 -12
- package/packages/irc-core/tests/commands/chanserv.test.ts +2335 -0
- package/packages/irc-core/tests/commands/chathistory.test.ts +6 -0
- package/packages/irc-core/tests/commands/hostserv.test.ts +1006 -0
- package/packages/irc-core/tests/commands/join.test.ts +572 -1
- package/packages/irc-core/tests/commands/markread.test.ts +361 -0
- package/packages/irc-core/tests/commands/memoserv.test.ts +654 -0
- package/packages/irc-core/tests/commands/mode.test.ts +381 -2
- package/packages/irc-core/tests/commands/nickserv.test.ts +990 -0
- package/packages/irc-core/tests/commands/oper.test.ts +13 -0
- package/packages/irc-core/tests/commands/operserv.test.ts +656 -0
- package/packages/irc-core/tests/commands/privmsg.test.ts +147 -0
- package/packages/irc-core/tests/commands/read-marker.test.ts +28 -28
- package/packages/irc-core/tests/commands/registration.test.ts +1015 -20
- package/packages/irc-core/tests/commands/sasl.test.ts +229 -12
- package/packages/irc-core/tests/commands/server-info.test.ts +9 -5
- package/packages/irc-core/tests/commands/service-aliases.test.ts +52 -0
- package/packages/irc-core/tests/commands/tagmsg.test.ts +73 -33
- package/packages/irc-core/tests/commands/topic.test.ts +94 -2
- package/packages/irc-core/tests/commands/unified-account.test.ts +416 -0
- package/packages/irc-core/tests/config.test.ts +49 -5
- package/packages/irc-core/tests/effects.test.ts +19 -0
- package/packages/irc-core/tests/message-store.test.ts +63 -0
- package/packages/irc-core/tests/persistent-services-store.test.ts +582 -0
- package/packages/irc-core/tests/services-store.test.ts +1289 -0
- package/packages/irc-core/tests/state/channel.test.ts +3 -0
- package/packages/irc-server/package.json +1 -1
- package/packages/irc-server/src/actor.ts +121 -16
- package/packages/irc-server/src/dispatch.ts +94 -7
- package/packages/irc-server/src/routing.ts +19 -0
- package/packages/irc-server/tests/actor.test.ts +988 -15
- package/packages/irc-server/tests/dispatch.test.ts +270 -2
- package/packages/irc-server/tests/routing.test.ts +6 -0
- package/packages/irc-test-support/package.json +1 -1
- package/packages/irc-test-support/src/in-memory-harness.ts +37 -8
- package/packages/irc-test-support/src/index.ts +1 -0
- package/packages/irc-test-support/src/scenarios.ts +21 -6
- package/packages/irc-test-support/tests/in-memory-harness.test.ts +51 -0
- package/packages/irc-test-support/vitest.config.ts +6 -1
- package/tools/ci-hardening/package.json +1 -1
- package/tools/load-test/package.json +1 -1
- package/tools/load-test/src/client.ts +13 -13
- package/tools/load-test/tests/client.test.ts +258 -2
- package/tools/load-test/tests/config.test.ts +39 -0
- package/tools/load-test/tests/harness.test.ts +21 -0
- package/tools/load-test/tests/metrics.test.ts +7 -0
- package/tools/tcp-ws-forwarder/package.json +1 -1
- package/tools/tcp-ws-forwarder/tests/close-error.test.ts +40 -0
- package/tools/tcp-ws-forwarder/tests/defensive-branches.test.ts +78 -0
- package/tools/tcp-ws-forwarder/tests/forwarder.test.ts +53 -2
- package/tools/tcp-ws-forwarder/tests/logger.test.ts +31 -1
- package/apps/cf-worker/tests/fixtures/web-dist/app/index.html +0 -18
- package/packages/irc-core/tests/read-marker-store.test.ts +0 -108
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from 'vitest';
|
|
2
|
-
import { InMemoryReadMarkerStore, type ReadMarkerStore } from '../src/ports';
|
|
3
|
-
|
|
4
|
-
describe('InMemoryReadMarkerStore — port conformance', () => {
|
|
5
|
-
it('implements the ReadMarkerStore port', () => {
|
|
6
|
-
const store: ReadMarkerStore = new InMemoryReadMarkerStore();
|
|
7
|
-
expect(store).toBeDefined();
|
|
8
|
-
});
|
|
9
|
-
});
|
|
10
|
-
|
|
11
|
-
describe('InMemoryReadMarkerStore — set + get', () => {
|
|
12
|
-
it('returns undefined for an unknown (account, channel) pair', () => {
|
|
13
|
-
const store = new InMemoryReadMarkerStore();
|
|
14
|
-
expect(store.get('alice', '#foo')).toBeUndefined();
|
|
15
|
-
});
|
|
16
|
-
|
|
17
|
-
it('stores and returns the msgid for a known (account, channel) pair', () => {
|
|
18
|
-
const store = new InMemoryReadMarkerStore();
|
|
19
|
-
store.set('alice', '#foo', 'm1');
|
|
20
|
-
expect(store.get('alice', '#foo')).toBe('m1');
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
it('overwrites the marker on a subsequent set for the same pair', () => {
|
|
24
|
-
const store = new InMemoryReadMarkerStore();
|
|
25
|
-
store.set('alice', '#foo', 'm1');
|
|
26
|
-
store.set('alice', '#foo', 'm2');
|
|
27
|
-
expect(store.get('alice', '#foo')).toBe('m2');
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
it('keys channels case-insensitively (rfc1459 fold)', () => {
|
|
31
|
-
const store = new InMemoryReadMarkerStore();
|
|
32
|
-
store.set('alice', '#Foo', 'm1');
|
|
33
|
-
expect(store.get('alice', '#foo')).toBe('m1');
|
|
34
|
-
expect(store.get('alice', '#FOO')).toBe('m1');
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
it('keys accounts case-insensitively (rfc1459 fold)', () => {
|
|
38
|
-
const store = new InMemoryReadMarkerStore();
|
|
39
|
-
store.set('Alice', '#foo', 'm1');
|
|
40
|
-
expect(store.get('alice', '#foo')).toBe('m1');
|
|
41
|
-
expect(store.get('ALICE', '#foo')).toBe('m1');
|
|
42
|
-
});
|
|
43
|
-
|
|
44
|
-
it('keeps markers for distinct accounts on the same channel separate', () => {
|
|
45
|
-
const store = new InMemoryReadMarkerStore();
|
|
46
|
-
store.set('alice', '#foo', 'm1');
|
|
47
|
-
store.set('bob', '#foo', 'm9');
|
|
48
|
-
expect(store.get('alice', '#foo')).toBe('m1');
|
|
49
|
-
expect(store.get('bob', '#foo')).toBe('m9');
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
it('keeps markers for distinct channels on the same account separate', () => {
|
|
53
|
-
const store = new InMemoryReadMarkerStore();
|
|
54
|
-
store.set('alice', '#foo', 'm1');
|
|
55
|
-
store.set('alice', '#bar', 'm2');
|
|
56
|
-
expect(store.get('alice', '#foo')).toBe('m1');
|
|
57
|
-
expect(store.get('alice', '#bar')).toBe('m2');
|
|
58
|
-
});
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
describe('InMemoryReadMarkerStore — forAccount', () => {
|
|
62
|
-
it('returns an empty array for an account with no markers', () => {
|
|
63
|
-
const store = new InMemoryReadMarkerStore();
|
|
64
|
-
expect(store.forAccount('alice')).toEqual([]);
|
|
65
|
-
});
|
|
66
|
-
|
|
67
|
-
it('returns every (channel, msgid) pair recorded for the account', () => {
|
|
68
|
-
const store = new InMemoryReadMarkerStore();
|
|
69
|
-
store.set('alice', '#foo', 'm1');
|
|
70
|
-
store.set('alice', '#bar', 'm2');
|
|
71
|
-
|
|
72
|
-
const entries = store.forAccount('alice');
|
|
73
|
-
expect(entries).toHaveLength(2);
|
|
74
|
-
const byChan = Object.fromEntries(entries.map((e) => [e.channel, e.msgid]));
|
|
75
|
-
expect(byChan['#foo']).toBe('m1');
|
|
76
|
-
expect(byChan['#bar']).toBe('m2');
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
it('reports the account name on each entry', () => {
|
|
80
|
-
const store = new InMemoryReadMarkerStore();
|
|
81
|
-
store.set('alice', '#foo', 'm1');
|
|
82
|
-
const entries = store.forAccount('alice');
|
|
83
|
-
expect(entries[0]?.account).toBe('alice');
|
|
84
|
-
});
|
|
85
|
-
|
|
86
|
-
it('reflects the most recent set when a pair is overwritten', () => {
|
|
87
|
-
const store = new InMemoryReadMarkerStore();
|
|
88
|
-
store.set('alice', '#foo', 'm1');
|
|
89
|
-
store.set('alice', '#foo', 'm2');
|
|
90
|
-
const entries = store.forAccount('alice');
|
|
91
|
-
expect(entries).toHaveLength(1);
|
|
92
|
-
expect(entries[0]?.msgid).toBe('m2');
|
|
93
|
-
});
|
|
94
|
-
|
|
95
|
-
it('does not leak markers belonging to a different account', () => {
|
|
96
|
-
const store = new InMemoryReadMarkerStore();
|
|
97
|
-
store.set('alice', '#foo', 'm1');
|
|
98
|
-
store.set('bob', '#bar', 'm2');
|
|
99
|
-
expect(store.forAccount('alice')).toHaveLength(1);
|
|
100
|
-
expect(store.forAccount('bob')).toHaveLength(1);
|
|
101
|
-
});
|
|
102
|
-
|
|
103
|
-
it('folds the account name case-insensitively on lookup', () => {
|
|
104
|
-
const store = new InMemoryReadMarkerStore();
|
|
105
|
-
store.set('Alice', '#foo', 'm1');
|
|
106
|
-
expect(store.forAccount('ALICE')).toHaveLength(1);
|
|
107
|
-
});
|
|
108
|
-
});
|