Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions .eslintrc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
{
"root": true,
"extends": ["@rocket.chat/eslint-config", "prettier", "plugin:@typescript-eslint/recommended"],
"plugins": ["prettier", "anti-trojan-source", "no-floating-promise"],
"settings": {
"import/core-modules": ["bun", "bun:test", "bun:sqlite"],
"import/resolver": {
"typescript": {
"alwaysTryTypes": true,
"project": ["./tsconfig.json", "./packages/*/tsconfig.json"]
},
"node": {
"extensions": [".js", ".jsx", ".ts", ".tsx"]
}
}
},
"rules": {
"@typescript-eslint/consistent-type-imports": "off",
"new-cap": ["error", {
"capIsNewExceptionPattern": "^t\\.(Object|String|Number|Boolean|Array|Tuple|Record|Union|Intersect|Literal|Optional|Nullable|Any|Unknown|Never|Void|Undefined|Null|Date|Files|File|Numeric|Integer|Enum|TemplateLiteral|Not|Recursive|Transform|Unsafe|Function|Constructor|Promise|AsyncIterator|Iterator|RegExp|Index|KeyOf|Partial|Required|Pick|Omit|Exclude|Extract|InstanceType|Parameters|ReturnType|Awaited|BooleanString|NumericString|MaybeEmpty|ObjectString|Lowercase|Uppercase|Capitalize|Uncapitalize)$"
}],
"@typescript-eslint/naming-convention": [
"error",
{
"selector": "interface",
"format": null
}
]
}
}
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ jobs:
- uses: oven-sh/setup-bun@v2
- run: bun install
- run: bun run build
- run: bun lint:ci
- run: bun lint
- run: bun tsc --noEmit
- uses: supercharge/mongodb-github-action@1.12.0
- run: RUN_MONGO_TESTS=1 bun test packages/federation-sdk/src/services/state.service.spec.ts packages/federation-sdk/src/services/room.service.spec.ts
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ jobs:

- run: bun install

- run: bun run lint:ci
- run: bun run lint

- run: bun run build

Expand Down
1 change: 0 additions & 1 deletion .husky/pre-push
Original file line number Diff line number Diff line change
@@ -1,3 +1,2 @@
bun run build
bunx tsc --noEmit
lint-staged
12 changes: 12 additions & 0 deletions .prettierrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"semi": true,
"bracketSpacing": true,
"arrowParens": "always",
"endOfLine": "lf",
"jsxSingleQuote": true,
"printWidth": 140,
"quoteProps": "consistent",
"singleQuote": true,
"trailingComma": "all",
"useTabs": true
}
3 changes: 0 additions & 3 deletions .vscode/extensions.json

This file was deleted.

869 changes: 809 additions & 60 deletions bun.lock

Large diffs are not rendered by default.

41 changes: 10 additions & 31 deletions bundle.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,46 +6,35 @@ const outputDir = './federation-bundle';
function getLocalPackages(packages: string[]) {
const localPackages = new Set();
for (const pkg of packages) {
// eslint-disable-next-line import/no-dynamic-require, @typescript-eslint/no-var-requires
const packageJson = require(`./packages/${pkg}/package.json`);
localPackages.add(packageJson.name);
}
return localPackages;
}

const getDependencies = (
pkg: string,
type: 'dependencies' | 'devDependencies' | 'peerDependencies',
) => {
const getDependencies = (pkg: string, type: 'dependencies' | 'devDependencies' | 'peerDependencies') => {
// eslint-disable-next-line import/no-dynamic-require, @typescript-eslint/no-var-requires
const packageJson = require(`./packages/${pkg}/package.json`);
return packageJson[type] ?? {};
};

const getDependenciesFromPackages = (
packages: string[],
type: 'dependencies' | 'devDependencies' | 'peerDependencies',
) => {
const getDependenciesFromPackages = (packages: string[], type: 'dependencies' | 'devDependencies' | 'peerDependencies') => {
return packages.reduce((acc, name) => {
// biome-ignore lint/performance/noAccumulatingSpread: <explanation>
return { ...acc, ...getDependencies(name, type) };
}, {});
};

const filterWorkspace = (deps: Record<string, unknown>) =>
Object.fromEntries(
Object.entries(deps || {}).filter(
([, value]) =>
typeof value === 'string' && !value.startsWith('workspace:'),
),
);
Object.fromEntries(Object.entries(deps || {}).filter(([, value]) => typeof value === 'string' && !value.startsWith('workspace:')));

// TODO get list of packages programmatically
const packages = ['core', 'crypto', 'federation-sdk', 'room'];

const localPackagesNames = getLocalPackages(packages);

const packageJson = JSON.parse(
await Bun.file(`${inputDir}/package.json`).text(),
);
const packageJson = JSON.parse(await Bun.file(`${inputDir}/package.json`).text());

async function main() {
await $`rm -rf ${outputDir}/dist`;
Expand All @@ -54,23 +43,15 @@ async function main() {
await $`touch ${outputDir}/yarn.lock`;

const dependencies = getDependenciesFromPackages(packages, 'dependencies');
const devDependencies = getDependenciesFromPackages(
packages,
'devDependencies',
);
const peerDependencies = getDependenciesFromPackages(
packages,
'peerDependencies',
);
const devDependencies = getDependenciesFromPackages(packages, 'devDependencies');
const peerDependencies = getDependenciesFromPackages(packages, 'peerDependencies');

await Bun.build({
entrypoints: [`${inputDir}/src/index.ts`],
outdir: `${outputDir}/dist`,
target: 'node',
format: 'cjs',
external: Object.keys(dependencies).filter(
(dep) => !localPackagesNames.has(dep),
),
external: Object.keys(dependencies).filter((dep) => !localPackagesNames.has(dep)),
env: 'disable',
define: {
'process.env.NODE_ENV': '"production"',
Expand All @@ -92,9 +73,7 @@ async function main() {
...peerDependencies,
});

await Bun.file(`${outputDir}/package.json`).write(
`${JSON.stringify(packageJson, null, 2)}\n`,
);
await Bun.file(`${outputDir}/package.json`).write(`${JSON.stringify(packageJson, null, 2)}\n`);

await $`bun run rollup -c`;

Expand Down
34 changes: 13 additions & 21 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,22 @@
"private": true,
"type": "module",
"devDependencies": {
"@biomejs/biome": "^1.9.4",
"@rocket.chat/eslint-config": "^0.7.0",
"@types/bun": "latest",
"@types/express": "^5.0.1",
"@types/node": "^22.15.18",
"@types/sinon": "^17.0.4",
"@typescript-eslint/eslint-plugin": "5.62.0",
"@typescript-eslint/parser": "5.62.0",
"eslint": "~8.45.0",
"eslint-config-prettier": "~9.1.2",
"eslint-import-resolver-typescript": "^4.4.4",
"eslint-plugin-anti-trojan-source": "^1.1.2",
"eslint-plugin-import": "^2.32.0",
"eslint-plugin-no-floating-promise": "~2.0.0",
"eslint-plugin-prettier": "4.2.1",
"husky": "^9.1.7",
"lint-staged": "^16.1.2",
"prettier": "2.8.8",
"sinon": "^20.0.0",
"tsconfig-paths": "^4.2.0",
"turbo": "~2.5.6",
Expand All @@ -26,32 +35,15 @@
"tsyringe": "^4.10.0",
"tweetnacl": "^1.0.3"
},
"husky": {
"hooks": {
"pre-commit": "bun test"
}
},
"packageManager": "bun@1.3.9",
"lint-staged": {
"**.{js|ts|cjs|mjs|d.cts|d.mts|jsx|tsx|json|jsonc}": [
"biome check --files-ignore-unknown=true --diagnostic-level=error",
"biome check --write --no-errors-on-unmatched --diagnostic-level=error",
"biome check --write --organize-imports-enabled=false --no-errors-on-unmatched --diagnostic-level=error",
"biome check --write --unsafe --no-errors-on-unmatched --diagnostic-level=error",
"biome format --write --no-errors-on-unmatched --diagnostic-level=error",
"biome lint --write --no-errors-on-unmatched --diagnostic-level=error"
],
"*": ["biome check --no-errors-on-unmatched --files-ignore-unknown=true"]
},
"lint-staged": {},
"scripts": {
"prepare": "husky",
"start": "bun run index.ts",
"test": "bun test",
"lint": "eslint . --ext .ts,.js,.tsx,.jsx --ignore-path .gitignore",
"build": "turbo build",
"test:coverage": "bun test --coverage",
"lint": "bunx @biomejs/biome lint --diagnostic-level=error",
"lint:ci": "bunx @biomejs/biome ci --diagnostic-level=error",
"lint:fix": "bunx @biomejs/biome lint --fix",
"tsc": "tsc --noEmit",
"bundle:sdk": "bun run build && bun run bundle.ts"
}
Expand Down
3 changes: 3 additions & 0 deletions packages/core/.eslintrc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"extends": "../../.eslintrc.json"
}
66 changes: 19 additions & 47 deletions packages/core/src/AsyncDispatcher.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,7 @@ export type DefaultEventMap = Record<string | symbol, any>;
export type AnyEventTypeOf<EventMap extends DefaultEventMap> = keyof EventMap;

/** @public */
export type AnyEventOf<EventMap extends DefaultEventMap> =
EventMap[keyof EventMap];
export type AnyEventOf<EventMap extends DefaultEventMap> = EventMap[keyof EventMap];

/** @public */
export type AnyEventHandlerOf<EventMap extends DefaultEventMap> = {
Expand All @@ -16,66 +15,44 @@ export type AnyEventHandlerOf<EventMap extends DefaultEventMap> = {
}[keyof EventMap];

/** @public */
export type EventTypeOf<
EventMap extends DefaultEventMap,
EventValue extends EventMap[keyof EventMap],
> = {
[EventType in keyof EventMap]: EventMap[EventType] extends EventValue
? EventType
: never;
export type EventTypeOf<EventMap extends DefaultEventMap, EventValue extends EventMap[keyof EventMap]> = {
[EventType in keyof EventMap]: EventMap[EventType] extends EventValue ? EventType : never;
}[keyof EventMap];

/** @public */
export type EventOf<
EventMap extends DefaultEventMap,
EventType extends AnyEventTypeOf<EventMap>,
> = EventMap[EventType] extends void ? never : EventMap[EventType];
export type EventOf<EventMap extends DefaultEventMap, EventType extends AnyEventTypeOf<EventMap>> = EventMap[EventType] extends void
? never
: EventMap[EventType];

/** @public */
export type EventHandlerOf<
EventMap extends DefaultEventMap,
EventType extends AnyEventTypeOf<EventMap>,
> = EventMap[EventType] extends void
export type EventHandlerOf<EventMap extends DefaultEventMap, EventType extends AnyEventTypeOf<EventMap>> = EventMap[EventType] extends void
? () => unknown | Promise<unknown>
: (event: EventMap[EventType]) => unknown | Promise<unknown>;

/** @public */
export type OffCallbackHandler = () => void;

/** @public */
export interface IAsyncDispatcher<
EventMap extends DefaultEventMap = DefaultEventMap,
> {
on<
T extends AnyEventOf<EventMap>,
EventType extends AnyEventTypeOf<EventMap> = EventTypeOf<EventMap, T>,
>(
export interface IAsyncDispatcher<EventMap extends DefaultEventMap = DefaultEventMap> {
on<T extends AnyEventOf<EventMap>, EventType extends AnyEventTypeOf<EventMap> = EventTypeOf<EventMap, T>>(
type: EventType,
handler: EventHandlerOf<EventMap, EventType>,
): OffCallbackHandler;
once<
T extends AnyEventOf<EventMap>,
EventType extends AnyEventTypeOf<EventMap> = EventTypeOf<EventMap, T>,
>(
once<T extends AnyEventOf<EventMap>, EventType extends AnyEventTypeOf<EventMap> = EventTypeOf<EventMap, T>>(
type: EventType,
handler: EventHandlerOf<EventMap, EventType>,
): OffCallbackHandler;
off<
T extends AnyEventOf<EventMap>,
EventType extends AnyEventTypeOf<EventMap> = EventTypeOf<EventMap, T>,
>(type: EventType, handler: EventHandlerOf<EventMap, EventType>): void;
off<T extends AnyEventOf<EventMap>, EventType extends AnyEventTypeOf<EventMap> = EventTypeOf<EventMap, T>>(
type: EventType,
handler: EventHandlerOf<EventMap, EventType>,
): void;

has(key: AnyEventTypeOf<EventMap>): boolean;
events(): AnyEventTypeOf<EventMap>[];

emit<
T extends AnyEventOf<EventMap>,
EventType extends AnyEventTypeOf<EventMap> = EventTypeOf<EventMap, T>,
>(
emit<T extends AnyEventOf<EventMap>, EventType extends AnyEventTypeOf<EventMap> = EventTypeOf<EventMap, T>>(
type: EventType,
...[event]: EventOf<EventMap, EventType> extends void
? [undefined?]
: [EventOf<EventMap, EventType>]
...[event]: EventOf<EventMap, EventType> extends void ? [undefined?] : [EventOf<EventMap, EventType>]
): Promise<void>;
}

Expand All @@ -89,13 +66,8 @@ const kEvents = Symbol('events');
*
* @public
*/
export class AsyncDispatcher<EventMap extends DefaultEventMap = DefaultEventMap>
implements IAsyncDispatcher<EventMap>
{
private [kEvents] = new Map<
AnyEventTypeOf<EventMap>,
AnyEventHandlerOf<EventMap>[]
>();
export class AsyncDispatcher<EventMap extends DefaultEventMap = DefaultEventMap> implements IAsyncDispatcher<EventMap> {
private [kEvents] = new Map<AnyEventTypeOf<EventMap>, AnyEventHandlerOf<EventMap>[]>();

private [kOnce] = new WeakMap<AnyEventHandlerOf<EventMap>, number>();

Expand Down Expand Up @@ -142,7 +114,7 @@ export class AsyncDispatcher<EventMap extends DefaultEventMap = DefaultEventMap>
async emit(type: keyof EventMap, ...[event]: any[]): Promise<void> {
const list = [...(this[kEvents].get(type) ?? [])];

for (const handler of list) {
for await (const handler of list) {
await handler(event);

if (this[kOnce].get(handler)) {
Expand Down
Loading