@rlanz/socket 0.0.1-9 → 0.1.1
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/README.md +562 -556
- package/build/{base_channel-DPOnqned.d.ts → base_channel-CasBQV5I.d.ts} +7 -25
- package/build/{chunk-QNOOQXYY.js → chunk-3FY7EIZF.js} +252 -200
- package/build/chunk-3FY7EIZF.js.map +1 -0
- package/build/{chunk-6PJ4ALJD.js → chunk-DM3UQMWW.js} +5 -3
- package/build/chunk-DM3UQMWW.js.map +1 -0
- package/build/chunk-NUPBNOP3.js +61 -0
- package/build/chunk-NUPBNOP3.js.map +1 -0
- package/build/{chunk-YVC7IMDN.js → chunk-OAI6SAER.js} +2 -2
- package/build/chunk-YSW4MNFR.js +7 -0
- package/build/chunk-YSW4MNFR.js.map +1 -0
- package/build/{framework-B8pJ4cCA.d.ts → framework-Cb71JA5f.d.ts} +1 -1
- package/build/{index-DjBYUhFR.d.ts → index-DCPtfkJL.d.ts} +1 -1
- package/build/index.d.ts +3 -2
- package/build/providers/socket_provider.d.ts +3 -2
- package/build/providers/socket_provider.js +312 -130
- package/build/providers/socket_provider.js.map +1 -1
- package/build/services/socket.d.ts +3 -2
- package/build/shared_types-B11CaOr5.d.ts +26 -0
- package/build/{socket_service-BcC9ASCE.d.ts → socket_service-C2YRbhrO.d.ts} +1 -1
- package/build/src/assembler_hook.js +54 -30
- package/build/src/assembler_hook.js.map +1 -1
- package/build/src/client/index.d.ts +3 -8
- package/build/src/client/index.js +3 -2
- package/build/src/client/react.d.ts +3 -8
- package/build/src/client/react.js +4 -3
- package/build/src/client/react.js.map +1 -1
- package/build/src/client/types.d.ts +18 -13
- package/build/src/client/vue.d.ts +3 -8
- package/build/src/client/vue.js +4 -3
- package/build/src/client/vue.js.map +1 -1
- package/build/src/decorators.d.ts +2 -1
- package/build/src/health_check.d.ts +3 -2
- package/build/src/otel.d.ts +1 -0
- package/build/src/otel.js +211 -27
- package/build/src/otel.js.map +1 -1
- package/build/src/types.d.ts +2 -1
- package/package.json +31 -7
- package/build/chunk-6PJ4ALJD.js.map +0 -1
- package/build/chunk-D3HUBCBW.js +0 -18
- package/build/chunk-D3HUBCBW.js.map +0 -1
- package/build/chunk-QNOOQXYY.js.map +0 -1
- /package/build/{chunk-YVC7IMDN.js.map → chunk-OAI6SAER.js.map} +0 -0
|
@@ -1,12 +1,13 @@
|
|
|
1
|
-
import { S as SocketService } from '../socket_service-
|
|
1
|
+
import { S as SocketService } from '../socket_service-C2YRbhrO.js';
|
|
2
2
|
import 'node:http';
|
|
3
3
|
import '@adonisjs/logger';
|
|
4
4
|
import 'emittery';
|
|
5
5
|
import 'ws';
|
|
6
|
-
import '../base_channel-
|
|
6
|
+
import '../base_channel-CasBQV5I.js';
|
|
7
7
|
import '@adonisjs/core/types/http';
|
|
8
8
|
import '@adonisjs/core/http';
|
|
9
9
|
import '@boringnode/bus/types/main';
|
|
10
|
+
import '../shared_types-B11CaOr5.js';
|
|
10
11
|
import '../src/testing.js';
|
|
11
12
|
|
|
12
13
|
declare let socket: SocketService;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Message sent by the client to a channel.
|
|
3
|
+
*/
|
|
4
|
+
interface ChannelMessage {
|
|
5
|
+
channel: string;
|
|
6
|
+
event: string;
|
|
7
|
+
data?: unknown;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Channel handler acknowledgement response.
|
|
11
|
+
*/
|
|
12
|
+
type ChannelAck<T = unknown> = {
|
|
13
|
+
ok: true;
|
|
14
|
+
data?: T;
|
|
15
|
+
error?: never;
|
|
16
|
+
} | {
|
|
17
|
+
ok: false;
|
|
18
|
+
error: string;
|
|
19
|
+
data?: never;
|
|
20
|
+
};
|
|
21
|
+
/** Extracts the server-to-client event map declared by a channel instance. */
|
|
22
|
+
type ChannelServerEventsOf<T> = T extends {
|
|
23
|
+
readonly $serverEvents: infer Events;
|
|
24
|
+
} ? Events : unknown;
|
|
25
|
+
|
|
26
|
+
export type { ChannelServerEventsOf as C, ChannelAck as a, ChannelMessage as b };
|
|
@@ -2,7 +2,7 @@ import { IncomingMessage, Server } from 'node:http';
|
|
|
2
2
|
import { Logger } from '@adonisjs/logger';
|
|
3
3
|
import Emittery from 'emittery';
|
|
4
4
|
import { WebSocketServer } from 'ws';
|
|
5
|
-
import {
|
|
5
|
+
import { s as BaseChannelConstructor, B as BaseChannel, t as ChannelMiddlewareRunnerFactory, u as ChannelMatch, A as AuthenticatedSocket, v as PresenceData, C as ChannelOptions, i as SocketEvents, P as PresenceManager, a as SocketConfig, p as SocketServiceStatus, j as SocketHealthSnapshot } from './base_channel-CasBQV5I.js';
|
|
6
6
|
import { HttpContext } from '@adonisjs/core/http';
|
|
7
7
|
import { SocketFake } from './src/testing.js';
|
|
8
8
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
BindableChannelPattern
|
|
3
|
-
} from "../chunk-
|
|
3
|
+
} from "../chunk-DM3UQMWW.js";
|
|
4
4
|
import "../chunk-E6ILCRL3.js";
|
|
5
5
|
|
|
6
6
|
// src/assembler_hook.ts
|
|
@@ -45,41 +45,38 @@ function validateHandlerMethod(filePath, method, name) {
|
|
|
45
45
|
fail(filePath, `handler method ${name} must not require parameters after the payload`);
|
|
46
46
|
}
|
|
47
47
|
}
|
|
48
|
-
function
|
|
49
|
-
const source = ts.createSourceFile(
|
|
50
|
-
filePath,
|
|
51
|
-
fs.readFileSync(filePath, "utf8"),
|
|
52
|
-
ts.ScriptTarget.Latest,
|
|
53
|
-
true,
|
|
54
|
-
filePath.endsWith(".js") ? ts.ScriptKind.JS : ts.ScriptKind.TS
|
|
55
|
-
);
|
|
48
|
+
function collectChannelImports(source) {
|
|
56
49
|
const decoratorImports = /* @__PURE__ */ new Set();
|
|
57
50
|
const decoratorNamespaces = /* @__PURE__ */ new Set();
|
|
58
51
|
const baseChannelImports = /* @__PURE__ */ new Set();
|
|
59
52
|
const socketNamespaces = /* @__PURE__ */ new Set();
|
|
60
53
|
for (const statement of source.statements) {
|
|
61
|
-
if (!ts.isImportDeclaration(statement) || !ts.isStringLiteral(statement.moduleSpecifier)
|
|
54
|
+
if (!ts.isImportDeclaration(statement) || !ts.isStringLiteral(statement.moduleSpecifier))
|
|
62
55
|
continue;
|
|
63
|
-
|
|
56
|
+
const module = statement.moduleSpecifier.text;
|
|
57
|
+
if (module !== "@rlanz/socket/decorators" && module !== "@rlanz/socket") continue;
|
|
64
58
|
const bindings = statement.importClause?.namedBindings;
|
|
65
59
|
if (bindings && ts.isNamedImports(bindings)) {
|
|
66
60
|
for (const binding of bindings.elements) {
|
|
67
61
|
const importedName = (binding.propertyName ?? binding.name).text;
|
|
68
|
-
if (
|
|
62
|
+
if (module === "@rlanz/socket/decorators" && importedName === "onMessage") {
|
|
69
63
|
decoratorImports.add(binding.name.text);
|
|
70
64
|
}
|
|
71
|
-
if (
|
|
65
|
+
if (module === "@rlanz/socket" && importedName === "BaseChannel") {
|
|
72
66
|
baseChannelImports.add(binding.name.text);
|
|
73
67
|
}
|
|
74
68
|
}
|
|
75
69
|
} else if (bindings && ts.isNamespaceImport(bindings)) {
|
|
76
|
-
if (
|
|
70
|
+
if (module === "@rlanz/socket/decorators") {
|
|
77
71
|
decoratorNamespaces.add(bindings.name.text);
|
|
78
72
|
} else {
|
|
79
73
|
socketNamespaces.add(bindings.name.text);
|
|
80
74
|
}
|
|
81
75
|
}
|
|
82
76
|
}
|
|
77
|
+
return { decoratorImports, decoratorNamespaces, baseChannelImports, socketNamespaces };
|
|
78
|
+
}
|
|
79
|
+
function findChannelClass(source, filePath) {
|
|
83
80
|
const classes = source.statements.filter(ts.isClassDeclaration);
|
|
84
81
|
let channelClass = classes.find(
|
|
85
82
|
(node) => node.modifiers?.some((modifier) => modifier.kind === ts.SyntaxKind.DefaultKeyword)
|
|
@@ -97,30 +94,33 @@ function inspectChannel(filePath, importPath) {
|
|
|
97
94
|
if (channelClass.modifiers?.some((modifier) => modifier.kind === ts.SyntaxKind.AbstractKeyword)) {
|
|
98
95
|
fail(filePath, "the default-exported channel class must not be abstract");
|
|
99
96
|
}
|
|
97
|
+
return channelClass;
|
|
98
|
+
}
|
|
99
|
+
function directlyExtendsBaseChannel(channelClass, imports) {
|
|
100
100
|
const extendsType = channelClass.heritageClauses?.find((clause) => clause.token === ts.SyntaxKind.ExtendsKeyword)?.types.at(0);
|
|
101
101
|
const extendsExpression = extendsType?.expression;
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
const patternMember = channelClass.members.find(
|
|
102
|
+
return !!(extendsExpression && ts.isIdentifier(extendsExpression) && imports.baseChannelImports.has(extendsExpression.text) || extendsExpression && ts.isPropertyAccessExpression(extendsExpression) && ts.isIdentifier(extendsExpression.expression) && imports.socketNamespaces.has(extendsExpression.expression.text) && extendsExpression.name.text === "BaseChannel");
|
|
103
|
+
}
|
|
104
|
+
function findPatternMember(channelClass) {
|
|
105
|
+
return channelClass.members.find(
|
|
107
106
|
(member) => ts.isPropertyDeclaration(member) && propertyName(member.name) === "pattern" && !!member.modifiers?.some((modifier) => modifier.kind === ts.SyntaxKind.StaticKeyword)
|
|
108
107
|
);
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
108
|
+
}
|
|
109
|
+
function onMessageCall(decorator, imports) {
|
|
110
|
+
const expression = decorator.expression;
|
|
111
|
+
if (!ts.isCallExpression(expression)) return;
|
|
112
|
+
const callee = expression.expression;
|
|
113
|
+
if (ts.isIdentifier(callee) && imports.decoratorImports.has(callee.text)) return expression;
|
|
114
|
+
if (ts.isPropertyAccessExpression(callee) && ts.isIdentifier(callee.expression) && imports.decoratorNamespaces.has(callee.expression.text) && callee.name.text === "onMessage") {
|
|
115
|
+
return expression;
|
|
115
116
|
}
|
|
117
|
+
}
|
|
118
|
+
function inspectHandlers(channelClass, filePath, imports) {
|
|
116
119
|
const handlers = [];
|
|
117
120
|
for (const method of channelClass.members.filter(ts.isMethodDeclaration)) {
|
|
118
121
|
for (const decorator of ts.getDecorators(method) ?? []) {
|
|
119
|
-
const expression = decorator
|
|
120
|
-
|
|
121
|
-
if (!isImportedDecorator || !ts.isCallExpression(expression)) {
|
|
122
|
-
continue;
|
|
123
|
-
}
|
|
122
|
+
const expression = onMessageCall(decorator, imports);
|
|
123
|
+
if (!expression) continue;
|
|
124
124
|
if (isStatic(method)) {
|
|
125
125
|
fail(filePath, "@onMessage cannot generate a contract for a static method");
|
|
126
126
|
}
|
|
@@ -141,6 +141,30 @@ function inspectChannel(filePath, importPath) {
|
|
|
141
141
|
handlers.push({ event, method: name });
|
|
142
142
|
}
|
|
143
143
|
}
|
|
144
|
+
return handlers;
|
|
145
|
+
}
|
|
146
|
+
function inspectChannel(filePath, importPath) {
|
|
147
|
+
const source = ts.createSourceFile(
|
|
148
|
+
filePath,
|
|
149
|
+
fs.readFileSync(filePath, "utf8"),
|
|
150
|
+
ts.ScriptTarget.Latest,
|
|
151
|
+
true,
|
|
152
|
+
filePath.endsWith(".js") ? ts.ScriptKind.JS : ts.ScriptKind.TS
|
|
153
|
+
);
|
|
154
|
+
const imports = collectChannelImports(source);
|
|
155
|
+
const channelClass = findChannelClass(source, filePath);
|
|
156
|
+
if (!directlyExtendsBaseChannel(channelClass, imports)) {
|
|
157
|
+
return `Omitted ${importPath}: generated contracts do not support channel inheritance; the default export must directly extend BaseChannel imported from @rlanz/socket.`;
|
|
158
|
+
}
|
|
159
|
+
const patternMember = findPatternMember(channelClass);
|
|
160
|
+
if (!patternMember?.initializer || !ts.isStringLiteral(patternMember.initializer)) {
|
|
161
|
+
return `Omitted ${importPath}: static pattern must be a direct string literal.`;
|
|
162
|
+
}
|
|
163
|
+
const bindablePattern = BindableChannelPattern.parse(patternMember.initializer.text);
|
|
164
|
+
if (!bindablePattern) {
|
|
165
|
+
return `Omitted ${importPath}: pattern ${quote(patternMember.initializer.text)} is not supported by generated typing; use literals, required params, a final optional param, or a final wildcard.`;
|
|
166
|
+
}
|
|
167
|
+
const handlers = inspectHandlers(channelClass, filePath, imports);
|
|
144
168
|
return { pattern: patternMember.initializer.text, bindablePattern, importPath, handlers };
|
|
145
169
|
}
|
|
146
170
|
function generateSocketRegistry(options = {}) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/assembler_hook.ts"],"sourcesContent":["import fs from 'node:fs'\nimport { createRequire } from 'node:module'\nimport type TypeScript from 'typescript'\nimport type { CommonHooks } from '@adonisjs/assembler/types'\nimport type { IndexGeneratorSourceConfig } from '@adonisjs/assembler/types'\nimport { BindableChannelPattern } from './bindable_channel_pattern.js'\n\nconst require = createRequire(import.meta.url)\nlet ts: typeof TypeScript\n\nexport interface SocketAssemblerHookOptions {\n source?: string\n glob?: string[]\n output?: string\n}\n\ntype Handler = { event: string; method: string }\ntype Channel = {\n pattern: string\n bindablePattern: BindableChannelPattern\n importPath: string\n handlers: Handler[]\n}\ntype SocketAssemblerHook = Extract<CommonHooks['init'][number], { run: (...args: any[]) => any }>\n\nfunction quote(value: string) {\n return `'${value.replaceAll('\\\\', '\\\\\\\\').replaceAll(\"'\", \"\\\\'\")}'`\n}\n\nfunction generatedImportPath(importPath: string): string {\n return importPath.replace(/\\.ts$/, '')\n}\n\nfunction appImportAlias(source: string): string {\n const normalized = source.replace(/^\\.\\//, '')\n if (normalized === 'app') return '#app'\n if (normalized.startsWith('app/')) return `#app/${normalized.slice('app/'.length)}`\n throw new Error('[socket] Channel source must be inside the app directory')\n}\n\nfunction fail(filePath: string, message: string): never {\n throw new Error(`[socket] Cannot generate client types for ${filePath}: ${message}`)\n}\n\nfunction propertyName(node: TypeScript.PropertyName | undefined): string | undefined {\n if (node && (ts.isIdentifier(node) || ts.isStringLiteral(node))) return node.text\n}\n\nfunction isPublic(method: TypeScript.MethodDeclaration) {\n return !method.modifiers?.some(\n (modifier) =>\n modifier.kind === ts.SyntaxKind.PrivateKeyword ||\n modifier.kind === ts.SyntaxKind.ProtectedKeyword\n )\n}\n\nfunction isStatic(member: TypeScript.ClassElement): boolean {\n return (\n ts.canHaveModifiers(member) &&\n !!ts.getModifiers(member)?.some((modifier) => modifier.kind === ts.SyntaxKind.StaticKeyword)\n )\n}\n\nfunction validateHandlerMethod(\n filePath: string,\n method: TypeScript.MethodDeclaration,\n name: string\n): void {\n const parameters = method.parameters.filter(\n (parameter) => !(ts.isIdentifier(parameter.name) && parameter.name.text === 'this')\n )\n if (parameters.some((parameter) => parameter.dotDotDotToken)) {\n fail(filePath, `handler method ${name} must not use rest parameters`)\n }\n if (parameters.slice(2).some((parameter) => !parameter.questionToken && !parameter.initializer)) {\n fail(filePath, `handler method ${name} must not require parameters after the payload`)\n }\n}\n\nfunction inspectChannel(filePath: string, importPath: string): Channel | string {\n const source = ts.createSourceFile(\n filePath,\n fs.readFileSync(filePath, 'utf8'),\n ts.ScriptTarget.Latest,\n true,\n filePath.endsWith('.js') ? ts.ScriptKind.JS : ts.ScriptKind.TS\n )\n const decoratorImports = new Set<string>()\n const decoratorNamespaces = new Set<string>()\n const baseChannelImports = new Set<string>()\n const socketNamespaces = new Set<string>()\n\n for (const statement of source.statements) {\n if (\n !ts.isImportDeclaration(statement) ||\n !ts.isStringLiteral(statement.moduleSpecifier) ||\n (statement.moduleSpecifier.text !== '@rlanz/socket/decorators' &&\n statement.moduleSpecifier.text !== '@rlanz/socket')\n ) {\n continue\n }\n\n const bindings = statement.importClause?.namedBindings\n if (bindings && ts.isNamedImports(bindings)) {\n for (const binding of bindings.elements) {\n const importedName = (binding.propertyName ?? binding.name).text\n if (\n statement.moduleSpecifier.text === '@rlanz/socket/decorators' &&\n importedName === 'onMessage'\n ) {\n decoratorImports.add(binding.name.text)\n }\n if (statement.moduleSpecifier.text === '@rlanz/socket' && importedName === 'BaseChannel') {\n baseChannelImports.add(binding.name.text)\n }\n }\n } else if (bindings && ts.isNamespaceImport(bindings)) {\n if (statement.moduleSpecifier.text === '@rlanz/socket/decorators') {\n decoratorNamespaces.add(bindings.name.text)\n } else {\n socketNamespaces.add(bindings.name.text)\n }\n }\n }\n\n const classes = source.statements.filter(ts.isClassDeclaration)\n let channelClass = classes.find((node) =>\n node.modifiers?.some((modifier) => modifier.kind === ts.SyntaxKind.DefaultKeyword)\n )\n\n if (!channelClass) {\n const defaultExport = source.statements.find(\n (node): node is TypeScript.ExportAssignment =>\n ts.isExportAssignment(node) && !node.isExportEquals\n )\n if (defaultExport && ts.isIdentifier(defaultExport.expression)) {\n const defaultClassName = defaultExport.expression.text\n channelClass = classes.find((node) => node.name?.text === defaultClassName)\n }\n }\n if (!channelClass) fail(filePath, 'a default-exported channel class was not found')\n if (channelClass.modifiers?.some((modifier) => modifier.kind === ts.SyntaxKind.AbstractKeyword)) {\n fail(filePath, 'the default-exported channel class must not be abstract')\n }\n\n const extendsType = channelClass.heritageClauses\n ?.find((clause) => clause.token === ts.SyntaxKind.ExtendsKeyword)\n ?.types.at(0)\n const extendsExpression = extendsType?.expression\n const directlyExtendsBaseChannel =\n (extendsExpression &&\n ts.isIdentifier(extendsExpression) &&\n baseChannelImports.has(extendsExpression.text)) ||\n (extendsExpression &&\n ts.isPropertyAccessExpression(extendsExpression) &&\n ts.isIdentifier(extendsExpression.expression) &&\n socketNamespaces.has(extendsExpression.expression.text) &&\n extendsExpression.name.text === 'BaseChannel')\n\n if (!directlyExtendsBaseChannel) {\n return (\n `Omitted ${importPath}: generated contracts do not support channel inheritance; ` +\n 'the default export must directly extend BaseChannel imported from @rlanz/socket.'\n )\n }\n\n const patternMember = channelClass.members.find(\n (member): member is TypeScript.PropertyDeclaration =>\n ts.isPropertyDeclaration(member) &&\n propertyName(member.name) === 'pattern' &&\n !!member.modifiers?.some((modifier) => modifier.kind === ts.SyntaxKind.StaticKeyword)\n )\n if (\n !patternMember ||\n !patternMember.initializer ||\n !ts.isStringLiteral(patternMember.initializer)\n ) {\n return `Omitted ${importPath}: static pattern must be a direct string literal.`\n }\n\n const bindablePattern = BindableChannelPattern.parse(patternMember.initializer.text)\n if (!bindablePattern) {\n return (\n `Omitted ${importPath}: pattern ${quote(patternMember.initializer.text)} is not supported by ` +\n 'generated typing; use literals, required params, a final optional param, or a final wildcard.'\n )\n }\n\n const handlers: Handler[] = []\n for (const method of channelClass.members.filter(ts.isMethodDeclaration)) {\n for (const decorator of ts.getDecorators(method) ?? []) {\n const expression = decorator.expression\n const isImportedDecorator =\n ts.isCallExpression(expression) &&\n ((ts.isIdentifier(expression.expression) &&\n decoratorImports.has(expression.expression.text)) ||\n (ts.isPropertyAccessExpression(expression.expression) &&\n ts.isIdentifier(expression.expression.expression) &&\n decoratorNamespaces.has(expression.expression.expression.text) &&\n expression.expression.name.text === 'onMessage'))\n\n if (!isImportedDecorator || !ts.isCallExpression(expression)) {\n continue\n }\n\n if (isStatic(method)) {\n fail(filePath, '@onMessage cannot generate a contract for a static method')\n }\n\n if (expression.arguments.length !== 1 || !ts.isStringLiteral(expression.arguments[0])) {\n fail(\n filePath,\n `@onMessage on ${propertyName(method.name) ?? '<computed>'} needs a literal event`\n )\n }\n const event = expression.arguments[0].text\n const name = propertyName(method.name)\n if (!name || !ts.isIdentifier(method.name)) fail(filePath, '@onMessage methods must be named')\n if (!isPublic(method)) fail(filePath, `decorated handler method ${name} must be public`)\n validateHandlerMethod(filePath, method, name)\n if (handlers.some((handler) => handler.event === event)) {\n fail(filePath, `event \"${event}\" is mapped more than once`)\n }\n handlers.push({ event, method: name })\n }\n }\n\n return { pattern: patternMember.initializer.text, bindablePattern, importPath, handlers }\n}\n\n/** Registers generation of the application socket registry with AdonisJS Assembler. */\nexport function generateSocketRegistry(\n options: SocketAssemblerHookOptions = {}\n): SocketAssemblerHook {\n return {\n run(_parent, hooks, indexGenerator) {\n ts ??= require('typescript') as typeof TypeScript\n\n const source = options.source ?? './app/channels'\n const glob = options.glob ?? ['**/*_channel.{ts,js}']\n const importAlias = appImportAlias(source)\n\n indexGenerator.add('socketChannels', {\n source,\n glob,\n importAlias,\n output: options.output ?? './.adonisjs/client/socket.ts',\n as(vfs, buffer, _config, helpers) {\n const channels: Channel[] = []\n const diagnostics: string[] = []\n for (const filePath of Object.values(vfs.asList())) {\n const importPath = generatedImportPath(helpers.toImportPath(filePath))\n const inspected = inspectChannel(filePath, importPath)\n if (typeof inspected === 'string') diagnostics.push(inspected)\n else channels.push(inspected)\n }\n\n const patterns = new Set<string>()\n for (const channel of channels) {\n if (patterns.has(channel.bindablePattern.canonicalPattern)) {\n fail(\n channel.importPath,\n `pattern ${quote(channel.pattern)} is declared more than once`\n )\n }\n patterns.add(channel.bindablePattern.canonicalPattern)\n }\n\n for (const diagnostic of diagnostics) buffer.writeLine(`// [socket] ${diagnostic}`)\n if (diagnostics.length) buffer.writeLine('')\n buffer.writeLine('export interface AppSocket {').indent()\n buffer.writeLine('readonly channels: {').indent()\n for (const channel of channels) {\n buffer.writeLine(`readonly ${quote(channel.pattern)}: {`).indent()\n if (channel.bindablePattern.parameters.length === 0) {\n buffer.writeLine('readonly params: undefined')\n } else {\n buffer.writeLine('readonly params: {').indent()\n for (const parameter of channel.bindablePattern.parameters) {\n buffer.writeLine(\n `readonly ${quote(parameter.name)}${parameter.optional ? '?' : ''}: string | number`\n )\n }\n buffer.dedent().writeLine('}')\n }\n buffer.writeLine(\n `readonly channel: typeof import(${quote(channel.importPath)}).default`\n )\n buffer.writeLine('readonly handlers: {').indent()\n for (const handler of channel.handlers) {\n buffer.writeLine(`readonly ${quote(handler.event)}: ${quote(handler.method)}`)\n }\n buffer.dedent().writeLine('}')\n buffer.dedent().writeLine('}')\n }\n buffer.dedent().writeLine('}')\n buffer.dedent().writeLine('}')\n },\n } satisfies IndexGeneratorSourceConfig)\n\n indexGenerator.add('socketServerChannels', {\n source,\n glob,\n importAlias,\n output: './.adonisjs/server/socket_channels.ts',\n as(vfs, buffer, _config, helpers) {\n const filePaths = Object.values(vfs.asList())\n filePaths.forEach((filePath, index) => {\n const importPath = generatedImportPath(helpers.toImportPath(filePath))\n buffer.writeLine(`import Channel${index} from ${quote(importPath)}`)\n })\n if (filePaths.length) buffer.writeLine('')\n buffer.writeLine(\n `export const socketChannels = [${filePaths.map((_filePath, index) => `Channel${index}`).join(', ')}] as const`\n )\n },\n } satisfies IndexGeneratorSourceConfig)\n\n hooks.add('fileChanged', (_relativePath, absolutePath) => {\n return indexGenerator.addFile(absolutePath)\n })\n },\n }\n}\n\nconst socketRegistryHook = generateSocketRegistry()\nconst lazySocketRegistryHook: SocketAssemblerHook['run'] = socketRegistryHook.run\n\nexport default lazySocketRegistryHook\n"],"mappings":"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","names":["require"]}
|
|
1
|
+
{"version":3,"sources":["../../src/assembler_hook.ts"],"sourcesContent":["import fs from 'node:fs'\nimport { createRequire } from 'node:module'\nimport type TypeScript from 'typescript'\nimport type { CommonHooks } from '@adonisjs/assembler/types'\nimport type { IndexGeneratorSourceConfig } from '@adonisjs/assembler/types'\nimport { BindableChannelPattern } from './bindable_channel_pattern.js'\n\nconst require = createRequire(import.meta.url)\nlet ts: typeof TypeScript\n\nexport interface SocketAssemblerHookOptions {\n source?: string\n glob?: string[]\n output?: string\n}\n\ntype Handler = { event: string; method: string }\ntype Channel = {\n pattern: string\n bindablePattern: BindableChannelPattern\n importPath: string\n handlers: Handler[]\n}\ntype ChannelImports = {\n decoratorImports: Set<string>\n decoratorNamespaces: Set<string>\n baseChannelImports: Set<string>\n socketNamespaces: Set<string>\n}\ntype SocketAssemblerHook = Extract<CommonHooks['init'][number], { run: (...args: any[]) => any }>\n\nfunction quote(value: string) {\n return `'${value.replaceAll('\\\\', '\\\\\\\\').replaceAll(\"'\", \"\\\\'\")}'`\n}\n\nfunction generatedImportPath(importPath: string): string {\n return importPath.replace(/\\.ts$/, '')\n}\n\nfunction appImportAlias(source: string): string {\n const normalized = source.replace(/^\\.\\//, '')\n if (normalized === 'app') return '#app'\n if (normalized.startsWith('app/')) return `#app/${normalized.slice('app/'.length)}`\n throw new Error('[socket] Channel source must be inside the app directory')\n}\n\nfunction fail(filePath: string, message: string): never {\n throw new Error(`[socket] Cannot generate client types for ${filePath}: ${message}`)\n}\n\nfunction propertyName(node: TypeScript.PropertyName | undefined): string | undefined {\n if (node && (ts.isIdentifier(node) || ts.isStringLiteral(node))) return node.text\n}\n\nfunction isPublic(method: TypeScript.MethodDeclaration) {\n return !method.modifiers?.some(\n (modifier) =>\n modifier.kind === ts.SyntaxKind.PrivateKeyword ||\n modifier.kind === ts.SyntaxKind.ProtectedKeyword\n )\n}\n\nfunction isStatic(member: TypeScript.ClassElement): boolean {\n return (\n ts.canHaveModifiers(member) &&\n !!ts.getModifiers(member)?.some((modifier) => modifier.kind === ts.SyntaxKind.StaticKeyword)\n )\n}\n\nfunction validateHandlerMethod(\n filePath: string,\n method: TypeScript.MethodDeclaration,\n name: string\n): void {\n const parameters = method.parameters.filter(\n (parameter) => !(ts.isIdentifier(parameter.name) && parameter.name.text === 'this')\n )\n if (parameters.some((parameter) => parameter.dotDotDotToken)) {\n fail(filePath, `handler method ${name} must not use rest parameters`)\n }\n if (parameters.slice(2).some((parameter) => !parameter.questionToken && !parameter.initializer)) {\n fail(filePath, `handler method ${name} must not require parameters after the payload`)\n }\n}\n\nfunction collectChannelImports(source: TypeScript.SourceFile): ChannelImports {\n const decoratorImports = new Set<string>()\n const decoratorNamespaces = new Set<string>()\n const baseChannelImports = new Set<string>()\n const socketNamespaces = new Set<string>()\n\n for (const statement of source.statements) {\n if (!ts.isImportDeclaration(statement) || !ts.isStringLiteral(statement.moduleSpecifier))\n continue\n\n const module = statement.moduleSpecifier.text\n if (module !== '@rlanz/socket/decorators' && module !== '@rlanz/socket') continue\n\n const bindings = statement.importClause?.namedBindings\n if (bindings && ts.isNamedImports(bindings)) {\n for (const binding of bindings.elements) {\n const importedName = (binding.propertyName ?? binding.name).text\n if (module === '@rlanz/socket/decorators' && importedName === 'onMessage') {\n decoratorImports.add(binding.name.text)\n }\n if (module === '@rlanz/socket' && importedName === 'BaseChannel') {\n baseChannelImports.add(binding.name.text)\n }\n }\n } else if (bindings && ts.isNamespaceImport(bindings)) {\n if (module === '@rlanz/socket/decorators') {\n decoratorNamespaces.add(bindings.name.text)\n } else {\n socketNamespaces.add(bindings.name.text)\n }\n }\n }\n\n return { decoratorImports, decoratorNamespaces, baseChannelImports, socketNamespaces }\n}\n\nfunction findChannelClass(\n source: TypeScript.SourceFile,\n filePath: string\n): TypeScript.ClassDeclaration {\n const classes = source.statements.filter(ts.isClassDeclaration)\n let channelClass = classes.find((node) =>\n node.modifiers?.some((modifier) => modifier.kind === ts.SyntaxKind.DefaultKeyword)\n )\n\n if (!channelClass) {\n const defaultExport = source.statements.find(\n (node): node is TypeScript.ExportAssignment =>\n ts.isExportAssignment(node) && !node.isExportEquals\n )\n if (defaultExport && ts.isIdentifier(defaultExport.expression)) {\n const defaultClassName = defaultExport.expression.text\n channelClass = classes.find((node) => node.name?.text === defaultClassName)\n }\n }\n if (!channelClass) fail(filePath, 'a default-exported channel class was not found')\n if (channelClass.modifiers?.some((modifier) => modifier.kind === ts.SyntaxKind.AbstractKeyword)) {\n fail(filePath, 'the default-exported channel class must not be abstract')\n }\n return channelClass\n}\n\nfunction directlyExtendsBaseChannel(\n channelClass: TypeScript.ClassDeclaration,\n imports: ChannelImports\n): boolean {\n const extendsType = channelClass.heritageClauses\n ?.find((clause) => clause.token === ts.SyntaxKind.ExtendsKeyword)\n ?.types.at(0)\n const extendsExpression = extendsType?.expression\n return !!(\n (extendsExpression &&\n ts.isIdentifier(extendsExpression) &&\n imports.baseChannelImports.has(extendsExpression.text)) ||\n (extendsExpression &&\n ts.isPropertyAccessExpression(extendsExpression) &&\n ts.isIdentifier(extendsExpression.expression) &&\n imports.socketNamespaces.has(extendsExpression.expression.text) &&\n extendsExpression.name.text === 'BaseChannel')\n )\n}\n\nfunction findPatternMember(\n channelClass: TypeScript.ClassDeclaration\n): TypeScript.PropertyDeclaration | undefined {\n return channelClass.members.find(\n (member): member is TypeScript.PropertyDeclaration =>\n ts.isPropertyDeclaration(member) &&\n propertyName(member.name) === 'pattern' &&\n !!member.modifiers?.some((modifier) => modifier.kind === ts.SyntaxKind.StaticKeyword)\n )\n}\n\nfunction onMessageCall(\n decorator: TypeScript.Decorator,\n imports: ChannelImports\n): TypeScript.CallExpression | undefined {\n const expression = decorator.expression\n if (!ts.isCallExpression(expression)) return\n\n const callee = expression.expression\n if (ts.isIdentifier(callee) && imports.decoratorImports.has(callee.text)) return expression\n if (\n ts.isPropertyAccessExpression(callee) &&\n ts.isIdentifier(callee.expression) &&\n imports.decoratorNamespaces.has(callee.expression.text) &&\n callee.name.text === 'onMessage'\n ) {\n return expression\n }\n}\n\nfunction inspectHandlers(\n channelClass: TypeScript.ClassDeclaration,\n filePath: string,\n imports: ChannelImports\n): Handler[] {\n const handlers: Handler[] = []\n for (const method of channelClass.members.filter(ts.isMethodDeclaration)) {\n for (const decorator of ts.getDecorators(method) ?? []) {\n const expression = onMessageCall(decorator, imports)\n if (!expression) continue\n\n if (isStatic(method)) {\n fail(filePath, '@onMessage cannot generate a contract for a static method')\n }\n\n if (expression.arguments.length !== 1 || !ts.isStringLiteral(expression.arguments[0])) {\n fail(\n filePath,\n `@onMessage on ${propertyName(method.name) ?? '<computed>'} needs a literal event`\n )\n }\n const event = expression.arguments[0].text\n const name = propertyName(method.name)\n if (!name || !ts.isIdentifier(method.name)) fail(filePath, '@onMessage methods must be named')\n if (!isPublic(method)) fail(filePath, `decorated handler method ${name} must be public`)\n validateHandlerMethod(filePath, method, name)\n if (handlers.some((handler) => handler.event === event)) {\n fail(filePath, `event \"${event}\" is mapped more than once`)\n }\n handlers.push({ event, method: name })\n }\n }\n return handlers\n}\n\nfunction inspectChannel(filePath: string, importPath: string): Channel | string {\n const source = ts.createSourceFile(\n filePath,\n fs.readFileSync(filePath, 'utf8'),\n ts.ScriptTarget.Latest,\n true,\n filePath.endsWith('.js') ? ts.ScriptKind.JS : ts.ScriptKind.TS\n )\n const imports = collectChannelImports(source)\n const channelClass = findChannelClass(source, filePath)\n\n if (!directlyExtendsBaseChannel(channelClass, imports)) {\n return (\n `Omitted ${importPath}: generated contracts do not support channel inheritance; ` +\n 'the default export must directly extend BaseChannel imported from @rlanz/socket.'\n )\n }\n\n const patternMember = findPatternMember(channelClass)\n if (!patternMember?.initializer || !ts.isStringLiteral(patternMember.initializer)) {\n return `Omitted ${importPath}: static pattern must be a direct string literal.`\n }\n\n const bindablePattern = BindableChannelPattern.parse(patternMember.initializer.text)\n if (!bindablePattern) {\n return (\n `Omitted ${importPath}: pattern ${quote(patternMember.initializer.text)} is not supported by ` +\n 'generated typing; use literals, required params, a final optional param, or a final wildcard.'\n )\n }\n\n const handlers = inspectHandlers(channelClass, filePath, imports)\n\n return { pattern: patternMember.initializer.text, bindablePattern, importPath, handlers }\n}\n\n/** Registers generation of the application socket registry with AdonisJS Assembler. */\nexport function generateSocketRegistry(\n options: SocketAssemblerHookOptions = {}\n): SocketAssemblerHook {\n return {\n run(_parent, hooks, indexGenerator) {\n ts ??= require('typescript') as typeof TypeScript\n\n const source = options.source ?? './app/channels'\n const glob = options.glob ?? ['**/*_channel.{ts,js}']\n const importAlias = appImportAlias(source)\n\n indexGenerator.add('socketChannels', {\n source,\n glob,\n importAlias,\n output: options.output ?? './.adonisjs/client/socket.ts',\n as(vfs, buffer, _config, helpers) {\n const channels: Channel[] = []\n const diagnostics: string[] = []\n for (const filePath of Object.values(vfs.asList())) {\n const importPath = generatedImportPath(helpers.toImportPath(filePath))\n const inspected = inspectChannel(filePath, importPath)\n if (typeof inspected === 'string') diagnostics.push(inspected)\n else channels.push(inspected)\n }\n\n const patterns = new Set<string>()\n for (const channel of channels) {\n if (patterns.has(channel.bindablePattern.canonicalPattern)) {\n fail(\n channel.importPath,\n `pattern ${quote(channel.pattern)} is declared more than once`\n )\n }\n patterns.add(channel.bindablePattern.canonicalPattern)\n }\n\n for (const diagnostic of diagnostics) buffer.writeLine(`// [socket] ${diagnostic}`)\n if (diagnostics.length) buffer.writeLine('')\n buffer.writeLine('export interface AppSocket {').indent()\n buffer.writeLine('readonly channels: {').indent()\n for (const channel of channels) {\n buffer.writeLine(`readonly ${quote(channel.pattern)}: {`).indent()\n if (channel.bindablePattern.parameters.length === 0) {\n buffer.writeLine('readonly params: undefined')\n } else {\n buffer.writeLine('readonly params: {').indent()\n for (const parameter of channel.bindablePattern.parameters) {\n buffer.writeLine(\n `readonly ${quote(parameter.name)}${parameter.optional ? '?' : ''}: string | number`\n )\n }\n buffer.dedent().writeLine('}')\n }\n buffer.writeLine(\n `readonly channel: typeof import(${quote(channel.importPath)}).default`\n )\n buffer.writeLine('readonly handlers: {').indent()\n for (const handler of channel.handlers) {\n buffer.writeLine(`readonly ${quote(handler.event)}: ${quote(handler.method)}`)\n }\n buffer.dedent().writeLine('}')\n buffer.dedent().writeLine('}')\n }\n buffer.dedent().writeLine('}')\n buffer.dedent().writeLine('}')\n },\n } satisfies IndexGeneratorSourceConfig)\n\n indexGenerator.add('socketServerChannels', {\n source,\n glob,\n importAlias,\n output: './.adonisjs/server/socket_channels.ts',\n as(vfs, buffer, _config, helpers) {\n const filePaths = Object.values(vfs.asList())\n filePaths.forEach((filePath, index) => {\n const importPath = generatedImportPath(helpers.toImportPath(filePath))\n buffer.writeLine(`import Channel${index} from ${quote(importPath)}`)\n })\n if (filePaths.length) buffer.writeLine('')\n buffer.writeLine(\n `export const socketChannels = [${filePaths.map((_filePath, index) => `Channel${index}`).join(', ')}] as const`\n )\n },\n } satisfies IndexGeneratorSourceConfig)\n\n hooks.add('fileChanged', (_relativePath, absolutePath) => {\n return indexGenerator.addFile(absolutePath)\n })\n },\n }\n}\n\nconst socketRegistryHook = generateSocketRegistry()\nconst lazySocketRegistryHook: SocketAssemblerHook['run'] = socketRegistryHook.run\n\nexport default lazySocketRegistryHook\n"],"mappings":"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","names":["require"]}
|
|
@@ -1,8 +1,3 @@
|
|
|
1
|
-
export { S as Socket } from '../../index-
|
|
2
|
-
export { ChannelBroadcastEvent, ChannelBroadcastPayload, ChannelCallArgs, ChannelClientEvent, ChannelClientEventPayload, ChannelParameters, ChannelPattern, ConnectionState, EventHandler, PresenceData, PresenceUser, SocketOptions, SubscribeAckData, SubscribeOptions, SubscribeResult, UnsubscribeOptions } from './types.js';
|
|
3
|
-
export { a as ChannelAck, b as ChannelMessage } from '../../
|
|
4
|
-
import 'ws';
|
|
5
|
-
import 'node:http';
|
|
6
|
-
import '@adonisjs/core/types/http';
|
|
7
|
-
import '@adonisjs/core/http';
|
|
8
|
-
import '@boringnode/bus/types/main';
|
|
1
|
+
export { S as Socket } from '../../index-DCPtfkJL.js';
|
|
2
|
+
export { ChannelBroadcastEvent, ChannelBroadcastPayload, ChannelCallArgs, ChannelClientEvent, ChannelClientEventPayload, ChannelParameters, ChannelPattern, ConnectionState, EventHandler, PresenceData, PresenceUser, ResubscribeErrorContext, SocketOptions, SubscribeAckData, SubscribeOptions, SubscribeResult, UnsubscribeOptions } from './types.js';
|
|
3
|
+
export { a as ChannelAck, b as ChannelMessage } from '../../shared_types-B11CaOr5.js';
|
|
@@ -1,14 +1,9 @@
|
|
|
1
1
|
import * as react from 'react';
|
|
2
2
|
import { ReactNode } from 'react';
|
|
3
|
-
import { S as Socket } from '../../index-
|
|
3
|
+
import { S as Socket } from '../../index-DCPtfkJL.js';
|
|
4
4
|
import { ConnectionState, EventHandler } from './types.js';
|
|
5
|
-
import { F as FrameworkChannelCallArgs, a as FrameworkChannel, b as FrameworkChannelPattern, c as FrameworkChannelEvent, d as FrameworkChannelParameters, e as FrameworkChannelEventPayload } from '../../framework-
|
|
6
|
-
import '../../
|
|
7
|
-
import 'ws';
|
|
8
|
-
import 'node:http';
|
|
9
|
-
import '@adonisjs/core/types/http';
|
|
10
|
-
import '@adonisjs/core/http';
|
|
11
|
-
import '@boringnode/bus/types/main';
|
|
5
|
+
import { F as FrameworkChannelCallArgs, a as FrameworkChannel, b as FrameworkChannelPattern, c as FrameworkChannelEvent, d as FrameworkChannelParameters, e as FrameworkChannelEventPayload } from '../../framework-Cb71JA5f.js';
|
|
6
|
+
import '../../shared_types-B11CaOr5.js';
|
|
12
7
|
|
|
13
8
|
type ChannelEventArgs<Registry, Pattern extends FrameworkChannelPattern<Registry>, Event extends FrameworkChannelEvent<Registry, Pattern>> = FrameworkChannelParameters<Registry, Pattern> extends undefined ? [event: Event, handler: EventHandler<FrameworkChannelEventPayload<Registry, Pattern, Event>>] : [
|
|
14
9
|
parameters: FrameworkChannelParameters<Registry, Pattern>,
|
|
@@ -3,11 +3,12 @@ import {
|
|
|
3
3
|
acquireSocketOwnership,
|
|
4
4
|
createChannelCallArgs,
|
|
5
5
|
resolveChannelEventArgs
|
|
6
|
-
} from "../../chunk-
|
|
6
|
+
} from "../../chunk-OAI6SAER.js";
|
|
7
7
|
import {
|
|
8
8
|
buildChannelName
|
|
9
|
-
} from "../../chunk-
|
|
10
|
-
import "../../chunk-
|
|
9
|
+
} from "../../chunk-3FY7EIZF.js";
|
|
10
|
+
import "../../chunk-YSW4MNFR.js";
|
|
11
|
+
import "../../chunk-DM3UQMWW.js";
|
|
11
12
|
import "../../chunk-E6ILCRL3.js";
|
|
12
13
|
|
|
13
14
|
// src/client/react.ts
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/client/react.ts"],"sourcesContent":["import {\n createContext,\n createElement,\n useContext,\n useEffect,\n useRef,\n useState,\n useSyncExternalStore,\n type ReactNode,\n} from 'react'\nimport type { Channel } from './channel.js'\nimport { buildChannelName, type Socket } from './socket.js'\nimport type { ConnectionState, EventHandler } from './types.js'\nimport {\n acquireChannel,\n acquireSocketOwnership,\n createChannelCallArgs,\n resolveChannelEventArgs,\n type FrameworkChannel,\n type FrameworkChannelCallArgs,\n type FrameworkChannelEvent,\n type FrameworkChannelEventPayload,\n type FrameworkChannelParameters,\n type FrameworkChannelPattern,\n} from './framework.js'\n\ntype ChannelEventArgs<\n Registry,\n Pattern extends FrameworkChannelPattern<Registry>,\n Event extends FrameworkChannelEvent<Registry, Pattern>,\n> =\n FrameworkChannelParameters<Registry, Pattern> extends undefined\n ? [event: Event, handler: EventHandler<FrameworkChannelEventPayload<Registry, Pattern, Event>>]\n : [\n parameters: FrameworkChannelParameters<Registry, Pattern>,\n event: Event,\n handler: EventHandler<FrameworkChannelEventPayload<Registry, Pattern, Event>>,\n ]\n\nexport interface SocketProviderProps<Registry> {\n socket: Socket<Registry>\n children?: ReactNode\n /** Connect on mount and disconnect on unmount. Use only for an exclusively owned socket. */\n owned?: boolean\n}\n\nexport function createSocketHooks<Registry = never>() {\n const SocketContext = createContext<Socket<Registry> | null>(null)\n\n function useSocket(): Socket<Registry> {\n const socket = useContext(SocketContext)\n if (!socket) throw new Error('SocketProvider is missing')\n return socket\n }\n\n function SocketProvider({ socket, children, owned = false }: SocketProviderProps<Registry>) {\n useEffect(() => {\n if (!owned) return\n return acquireSocketOwnership(socket)\n }, [owned, socket])\n\n return createElement(SocketContext.Provider, { value: socket }, children)\n }\n\n function useSocketState(): ConnectionState {\n const socket = useSocket()\n return useSyncExternalStore(\n (notify) => socket.onStateChange(notify),\n () => socket.state,\n () => 'disconnected'\n )\n }\n\n function useChannel<const Args extends FrameworkChannelCallArgs<Registry>>(\n ...args: Args\n ): FrameworkChannel<Registry, Args[0]> | null\n function useChannel(pattern: null): null\n function useChannel(\n ...args: [pattern: FrameworkChannelPattern<Registry> | null, parameters?: object]\n ): Channel<any> | null {\n const [pattern, parameters] = args\n const socket = useSocket()\n const name = pattern === null ? null : buildChannelName(pattern, parameters)\n const [acquired, setAcquired] = useState<{\n socket: Socket<Registry>\n name: string\n channel: Channel<any>\n } | null>(null)\n\n useEffect(() => {\n if (pattern === null || name === null) {\n setAcquired(null)\n return\n }\n const channelArgs = createChannelCallArgs<Registry>(pattern, parameters)\n const { channel, lease } = acquireChannel(socket, ...channelArgs)\n setAcquired({ socket, name, channel })\n return () => lease.release()\n }, [name, pattern, socket])\n\n return acquired?.socket === socket && acquired.name === name ? acquired.channel : null\n }\n\n function useChannelEvent<\n const Pattern extends FrameworkChannelPattern<Registry>,\n Event extends FrameworkChannelEvent<Registry, Pattern>,\n >(pattern: Pattern | null, ...args: ChannelEventArgs<Registry, Pattern, Event>): void {\n const socket = useSocket()\n const {\n parameterInput: parameters,\n event,\n handler,\n } = resolveChannelEventArgs<\n FrameworkChannelParameters<Registry, Pattern>,\n Event,\n FrameworkChannelEventPayload<Registry, Pattern, Event>\n >(args)\n const name = pattern === null ? null : buildChannelName(pattern, parameters)\n const handlerRef = useRef(handler)\n handlerRef.current = handler\n\n useEffect(() => {\n if (pattern === null || name === null) return\n const channelArgs = createChannelCallArgs<Registry>(pattern, parameters)\n const { lease } = acquireChannel(socket, ...channelArgs)\n lease.listen(event, (data) => handlerRef.current(data))\n return () => lease.release()\n }, [event, name, pattern, socket])\n }\n\n return { SocketProvider, useSocket, useSocketState, useChannel, useChannelEvent }\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../../src/client/react.ts"],"sourcesContent":["import {\n createContext,\n createElement,\n useContext,\n useEffect,\n useRef,\n useState,\n useSyncExternalStore,\n type ReactNode,\n} from 'react'\nimport type { Channel } from './channel.js'\nimport { buildChannelName, type Socket } from './socket.js'\nimport type { ConnectionState, EventHandler } from './types.js'\nimport {\n acquireChannel,\n acquireSocketOwnership,\n createChannelCallArgs,\n resolveChannelEventArgs,\n type FrameworkChannel,\n type FrameworkChannelCallArgs,\n type FrameworkChannelEvent,\n type FrameworkChannelEventPayload,\n type FrameworkChannelParameters,\n type FrameworkChannelPattern,\n} from './framework.js'\n\ntype ChannelEventArgs<\n Registry,\n Pattern extends FrameworkChannelPattern<Registry>,\n Event extends FrameworkChannelEvent<Registry, Pattern>,\n> =\n FrameworkChannelParameters<Registry, Pattern> extends undefined\n ? [event: Event, handler: EventHandler<FrameworkChannelEventPayload<Registry, Pattern, Event>>]\n : [\n parameters: FrameworkChannelParameters<Registry, Pattern>,\n event: Event,\n handler: EventHandler<FrameworkChannelEventPayload<Registry, Pattern, Event>>,\n ]\n\nexport interface SocketProviderProps<Registry> {\n socket: Socket<Registry>\n children?: ReactNode\n /** Connect on mount and disconnect on unmount. Use only for an exclusively owned socket. */\n owned?: boolean\n}\n\nexport function createSocketHooks<Registry = never>() {\n const SocketContext = createContext<Socket<Registry> | null>(null)\n\n function useSocket(): Socket<Registry> {\n const socket = useContext(SocketContext)\n if (!socket) throw new Error('SocketProvider is missing')\n return socket\n }\n\n function SocketProvider({ socket, children, owned = false }: SocketProviderProps<Registry>) {\n useEffect(() => {\n if (!owned) return\n return acquireSocketOwnership(socket)\n }, [owned, socket])\n\n return createElement(SocketContext.Provider, { value: socket }, children)\n }\n\n function useSocketState(): ConnectionState {\n const socket = useSocket()\n return useSyncExternalStore(\n (notify) => socket.onStateChange(notify),\n () => socket.state,\n () => 'disconnected'\n )\n }\n\n function useChannel<const Args extends FrameworkChannelCallArgs<Registry>>(\n ...args: Args\n ): FrameworkChannel<Registry, Args[0]> | null\n function useChannel(pattern: null): null\n function useChannel(\n ...args: [pattern: FrameworkChannelPattern<Registry> | null, parameters?: object]\n ): Channel<any> | null {\n const [pattern, parameters] = args\n const socket = useSocket()\n const name = pattern === null ? null : buildChannelName(pattern, parameters)\n const [acquired, setAcquired] = useState<{\n socket: Socket<Registry>\n name: string\n channel: Channel<any>\n } | null>(null)\n\n useEffect(() => {\n if (pattern === null || name === null) {\n setAcquired(null)\n return\n }\n const channelArgs = createChannelCallArgs<Registry>(pattern, parameters)\n const { channel, lease } = acquireChannel(socket, ...channelArgs)\n setAcquired({ socket, name, channel })\n return () => lease.release()\n }, [name, pattern, socket])\n\n return acquired?.socket === socket && acquired.name === name ? acquired.channel : null\n }\n\n function useChannelEvent<\n const Pattern extends FrameworkChannelPattern<Registry>,\n Event extends FrameworkChannelEvent<Registry, Pattern>,\n >(pattern: Pattern | null, ...args: ChannelEventArgs<Registry, Pattern, Event>): void {\n const socket = useSocket()\n const {\n parameterInput: parameters,\n event,\n handler,\n } = resolveChannelEventArgs<\n FrameworkChannelParameters<Registry, Pattern>,\n Event,\n FrameworkChannelEventPayload<Registry, Pattern, Event>\n >(args)\n const name = pattern === null ? null : buildChannelName(pattern, parameters)\n const handlerRef = useRef(handler)\n handlerRef.current = handler\n\n useEffect(() => {\n if (pattern === null || name === null) return\n const channelArgs = createChannelCallArgs<Registry>(pattern, parameters)\n const { lease } = acquireChannel(socket, ...channelArgs)\n lease.listen(event, (data) => handlerRef.current(data))\n return () => lease.release()\n }, [event, name, pattern, socket])\n }\n\n return { SocketProvider, useSocket, useSocketState, useChannel, useChannelEvent }\n}\n"],"mappings":";;;;;;;;;;;;;;AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AAqCA,SAAS,oBAAsC;AACpD,QAAM,gBAAgB,cAAuC,IAAI;AAEjE,WAAS,YAA8B;AACrC,UAAM,SAAS,WAAW,aAAa;AACvC,QAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,2BAA2B;AACxD,WAAO;AAAA,EACT;AAEA,WAAS,eAAe,EAAE,QAAQ,UAAU,QAAQ,MAAM,GAAkC;AAC1F,cAAU,MAAM;AACd,UAAI,CAAC,MAAO;AACZ,aAAO,uBAAuB,MAAM;AAAA,IACtC,GAAG,CAAC,OAAO,MAAM,CAAC;AAElB,WAAO,cAAc,cAAc,UAAU,EAAE,OAAO,OAAO,GAAG,QAAQ;AAAA,EAC1E;AAEA,WAAS,iBAAkC;AACzC,UAAM,SAAS,UAAU;AACzB,WAAO;AAAA,MACL,CAAC,WAAW,OAAO,cAAc,MAAM;AAAA,MACvC,MAAM,OAAO;AAAA,MACb,MAAM;AAAA,IACR;AAAA,EACF;AAMA,WAAS,cACJ,MACkB;AACrB,UAAM,CAAC,SAAS,UAAU,IAAI;AAC9B,UAAM,SAAS,UAAU;AACzB,UAAM,OAAO,YAAY,OAAO,OAAO,iBAAiB,SAAS,UAAU;AAC3E,UAAM,CAAC,UAAU,WAAW,IAAI,SAItB,IAAI;AAEd,cAAU,MAAM;AACd,UAAI,YAAY,QAAQ,SAAS,MAAM;AACrC,oBAAY,IAAI;AAChB;AAAA,MACF;AACA,YAAM,cAAc,sBAAgC,SAAS,UAAU;AACvE,YAAM,EAAE,SAAS,MAAM,IAAI,eAAe,QAAQ,GAAG,WAAW;AAChE,kBAAY,EAAE,QAAQ,MAAM,QAAQ,CAAC;AACrC,aAAO,MAAM,MAAM,QAAQ;AAAA,IAC7B,GAAG,CAAC,MAAM,SAAS,MAAM,CAAC;AAE1B,WAAO,UAAU,WAAW,UAAU,SAAS,SAAS,OAAO,SAAS,UAAU;AAAA,EACpF;AAEA,WAAS,gBAGP,YAA4B,MAAwD;AACpF,UAAM,SAAS,UAAU;AACzB,UAAM;AAAA,MACJ,gBAAgB;AAAA,MAChB;AAAA,MACA;AAAA,IACF,IAAI,wBAIF,IAAI;AACN,UAAM,OAAO,YAAY,OAAO,OAAO,iBAAiB,SAAS,UAAU;AAC3E,UAAM,aAAa,OAAO,OAAO;AACjC,eAAW,UAAU;AAErB,cAAU,MAAM;AACd,UAAI,YAAY,QAAQ,SAAS,KAAM;AACvC,YAAM,cAAc,sBAAgC,SAAS,UAAU;AACvE,YAAM,EAAE,MAAM,IAAI,eAAe,QAAQ,GAAG,WAAW;AACvD,YAAM,OAAO,OAAO,CAAC,SAAS,WAAW,QAAQ,IAAI,CAAC;AACtD,aAAO,MAAM,MAAM,QAAQ;AAAA,IAC7B,GAAG,CAAC,OAAO,MAAM,SAAS,MAAM,CAAC;AAAA,EACnC;AAEA,SAAO,EAAE,gBAAgB,WAAW,gBAAgB,YAAY,gBAAgB;AAClF;","names":[]}
|
|
@@ -1,10 +1,5 @@
|
|
|
1
|
-
import { C as ChannelServerEventsOf } from '../../
|
|
2
|
-
export {
|
|
3
|
-
import 'ws';
|
|
4
|
-
import 'node:http';
|
|
5
|
-
import '@adonisjs/core/types/http';
|
|
6
|
-
import '@adonisjs/core/http';
|
|
7
|
-
import '@boringnode/bus/types/main';
|
|
1
|
+
import { C as ChannelServerEventsOf, a as ChannelAck } from '../../shared_types-B11CaOr5.js';
|
|
2
|
+
export { b as ChannelMessage } from '../../shared_types-B11CaOr5.js';
|
|
8
3
|
|
|
9
4
|
/** Type-only contract carried by a browser channel. */
|
|
10
5
|
interface ChannelContract<ClientEvents = unknown, ServerEvents = unknown> {
|
|
@@ -58,6 +53,11 @@ type ChannelClientEventPayload<Registry, Pattern extends ChannelPattern<Registry
|
|
|
58
53
|
type ChannelBroadcastEvent<Registry, Pattern extends ChannelPattern<Registry>> = Extract<keyof ServerEvents<ChannelContractFor<Registry, Pattern>>, string>;
|
|
59
54
|
/** Payload received from a server broadcast on a generated channel. */
|
|
60
55
|
type ChannelBroadcastPayload<Registry, Pattern extends ChannelPattern<Registry>, Event extends ChannelBroadcastEvent<Registry, Pattern>> = ServerEvents<ChannelContractFor<Registry, Pattern>>[Event];
|
|
56
|
+
/** Details about a rejected automatic channel resubscription. */
|
|
57
|
+
interface ResubscribeErrorContext {
|
|
58
|
+
channel: string;
|
|
59
|
+
error: Error;
|
|
60
|
+
}
|
|
61
61
|
/**
|
|
62
62
|
* Connection options.
|
|
63
63
|
*/
|
|
@@ -82,6 +82,15 @@ interface SocketOptions {
|
|
|
82
82
|
* Maximum automatic reconnection delay in ms. Defaults to 5000.
|
|
83
83
|
*/
|
|
84
84
|
reconnectMaxDelay?: number;
|
|
85
|
+
/**
|
|
86
|
+
* Decides whether a remotely closed connection should reconnect.
|
|
87
|
+
* By default, deliberate server disconnects are terminal and other closes reconnect.
|
|
88
|
+
*/
|
|
89
|
+
shouldReconnect?: (event: CloseEvent) => boolean;
|
|
90
|
+
/**
|
|
91
|
+
* Handles a rejected automatic channel resubscription.
|
|
92
|
+
*/
|
|
93
|
+
onResubscribeError?: (context: ResubscribeErrorContext) => void;
|
|
85
94
|
}
|
|
86
95
|
/**
|
|
87
96
|
* Channel subscription options.
|
|
@@ -110,11 +119,7 @@ interface SubscribeAckData {
|
|
|
110
119
|
/**
|
|
111
120
|
* Subscription response.
|
|
112
121
|
*/
|
|
113
|
-
|
|
114
|
-
ok: boolean;
|
|
115
|
-
error?: string;
|
|
116
|
-
data?: SubscribeAckData;
|
|
117
|
-
}
|
|
122
|
+
type SubscribeResult = ChannelAck<SubscribeAckData>;
|
|
118
123
|
/**
|
|
119
124
|
* Presence data.
|
|
120
125
|
*/
|
|
@@ -151,4 +156,4 @@ interface SocketClientTransport {
|
|
|
151
156
|
off<T = unknown>(event: string, handler: EventHandler<T>): void;
|
|
152
157
|
}
|
|
153
158
|
|
|
154
|
-
export { type ChannelBroadcastEvent, type ChannelBroadcastPayload, type ChannelCallArgs, type ChannelClientEvent, type ChannelClientEventPayload, type ChannelContract, type ChannelContractFor, type ChannelParameterValue, type ChannelParameters, type ChannelPattern, ChannelServerEventsOf, type ConnectionState, type EventHandler, type PresenceData, type PresenceUser, type SocketClientTransport, type SocketOptions, type SubscribeAckData, type SubscribeOptions, type SubscribeResult, type UnsubscribeOptions };
|
|
159
|
+
export { ChannelAck, type ChannelBroadcastEvent, type ChannelBroadcastPayload, type ChannelCallArgs, type ChannelClientEvent, type ChannelClientEventPayload, type ChannelContract, type ChannelContractFor, type ChannelParameterValue, type ChannelParameters, type ChannelPattern, ChannelServerEventsOf, type ConnectionState, type EventHandler, type PresenceData, type PresenceUser, type ResubscribeErrorContext, type SocketClientTransport, type SocketOptions, type SubscribeAckData, type SubscribeOptions, type SubscribeResult, type UnsubscribeOptions };
|
|
@@ -1,13 +1,8 @@
|
|
|
1
1
|
import { ShallowRef, ComputedRef, MaybeRefOrGetter } from 'vue';
|
|
2
|
-
import { S as Socket } from '../../index-
|
|
2
|
+
import { S as Socket } from '../../index-DCPtfkJL.js';
|
|
3
3
|
import { ConnectionState, EventHandler } from './types.js';
|
|
4
|
-
import { b as FrameworkChannelPattern, d as FrameworkChannelParameters, a as FrameworkChannel, c as FrameworkChannelEvent, e as FrameworkChannelEventPayload } from '../../framework-
|
|
5
|
-
import '../../
|
|
6
|
-
import 'ws';
|
|
7
|
-
import 'node:http';
|
|
8
|
-
import '@adonisjs/core/types/http';
|
|
9
|
-
import '@adonisjs/core/http';
|
|
10
|
-
import '@boringnode/bus/types/main';
|
|
4
|
+
import { b as FrameworkChannelPattern, d as FrameworkChannelParameters, a as FrameworkChannel, c as FrameworkChannelEvent, e as FrameworkChannelEventPayload } from '../../framework-Cb71JA5f.js';
|
|
5
|
+
import '../../shared_types-B11CaOr5.js';
|
|
11
6
|
|
|
12
7
|
type ChannelParameterInput<Registry, Pattern extends FrameworkChannelPattern<Registry>> = MaybeRefOrGetter<FrameworkChannelParameters<Registry, Pattern>>;
|
|
13
8
|
type VueChannelCallArgs<Registry> = {
|
package/build/src/client/vue.js
CHANGED
|
@@ -3,11 +3,12 @@ import {
|
|
|
3
3
|
acquireSocketOwnership,
|
|
4
4
|
createChannelCallArgs,
|
|
5
5
|
resolveChannelEventArgs
|
|
6
|
-
} from "../../chunk-
|
|
6
|
+
} from "../../chunk-OAI6SAER.js";
|
|
7
7
|
import {
|
|
8
8
|
buildChannelName
|
|
9
|
-
} from "../../chunk-
|
|
10
|
-
import "../../chunk-
|
|
9
|
+
} from "../../chunk-3FY7EIZF.js";
|
|
10
|
+
import "../../chunk-YSW4MNFR.js";
|
|
11
|
+
import "../../chunk-DM3UQMWW.js";
|
|
11
12
|
import "../../chunk-E6ILCRL3.js";
|
|
12
13
|
|
|
13
14
|
// src/client/vue.ts
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/client/vue.ts"],"sourcesContent":["import {\n computed,\n inject,\n onMounted,\n onScopeDispose,\n provide,\n shallowRef,\n toValue,\n watch,\n type ComputedRef,\n type InjectionKey,\n type MaybeRefOrGetter,\n type ShallowRef,\n} from 'vue'\nimport type { Channel } from './channel.js'\nimport { buildChannelName, type Socket } from './socket.js'\nimport type { ConnectionState, EventHandler } from './types.js'\nimport {\n acquireChannel,\n acquireSocketOwnership,\n createChannelCallArgs,\n resolveChannelEventArgs,\n type FrameworkChannel,\n type FrameworkChannelEvent,\n type FrameworkChannelEventPayload,\n type FrameworkChannelParameters,\n type FrameworkChannelPattern,\n} from './framework.js'\n\ninterface VueSocketContext<Registry> {\n socket: Socket<Registry>\n state: ShallowRef<ConnectionState>\n}\n\ntype ChannelParameterInput<\n Registry,\n Pattern extends FrameworkChannelPattern<Registry>,\n> = MaybeRefOrGetter<FrameworkChannelParameters<Registry, Pattern>>\n\ntype VueChannelCallArgs<Registry> = {\n [Pattern in FrameworkChannelPattern<Registry>]: FrameworkChannelParameters<\n Registry,\n Pattern\n > extends undefined\n ? [pattern: Pattern]\n : [pattern: Pattern, parameters: ChannelParameterInput<Registry, Pattern>]\n}[FrameworkChannelPattern<Registry>]\n\ntype VueChannelEventArgs<\n Registry,\n Pattern extends FrameworkChannelPattern<Registry>,\n Event extends FrameworkChannelEvent<Registry, Pattern>,\n> =\n FrameworkChannelParameters<Registry, Pattern> extends undefined\n ? [event: Event, handler: EventHandler<FrameworkChannelEventPayload<Registry, Pattern, Event>>]\n : [\n parameters: ChannelParameterInput<Registry, Pattern>,\n event: Event,\n handler: EventHandler<FrameworkChannelEventPayload<Registry, Pattern, Event>>,\n ]\n\nexport function createSocketComposables<Registry = never>() {\n const key = Symbol('socket') as InjectionKey<VueSocketContext<Registry>>\n\n function provideSocket(socket: Socket<Registry>, options: { owned?: boolean } = {}): void {\n const state = shallowRef(socket.state)\n const stopStateListener = socket.onStateChange((nextState) => {\n state.value = nextState\n })\n provide(key, { socket, state })\n\n let releaseOwnership: (() => void) | undefined\n if (options.owned) onMounted(() => (releaseOwnership = acquireSocketOwnership(socket)))\n onScopeDispose(() => {\n stopStateListener()\n releaseOwnership?.()\n })\n }\n\n function useContext(): VueSocketContext<Registry> {\n const context = inject(key)\n if (!context) throw new Error('provideSocket must be called by an ancestor')\n return context\n }\n\n function useSocket(): Socket<Registry> {\n return useContext().socket\n }\n\n function useSocketState(): {\n state: Readonly<ShallowRef<ConnectionState>>\n connected: ComputedRef<boolean>\n } {\n const state = useContext().state\n return { state, connected: computed(() => state.value === 'connected') }\n }\n\n function useChannel<const Args extends VueChannelCallArgs<Registry>>(\n ...args: Args\n ): Readonly<ShallowRef<FrameworkChannel<Registry, Args[0]> | null>>\n function useChannel(pattern: null): Readonly<ShallowRef<null>>\n function useChannel(\n ...args: [\n pattern: FrameworkChannelPattern<Registry> | null,\n parameterInput?: MaybeRefOrGetter<object | undefined>,\n ]\n ): Readonly<ShallowRef<Channel<any> | null>> {\n const [pattern, parameterInput] = args\n const socket = useSocket()\n const channel = shallowRef(null) as ShallowRef<Channel<any> | null>\n\n watch(\n () => (pattern === null ? null : toValue(parameterInput)),\n (parameters, _previousParameters, onCleanup) => {\n const nextName =\n pattern === null ? null : buildChannelName(pattern, parameters as object | undefined)\n if (nextName === null || pattern === null) {\n channel.value = null\n return\n }\n const channelArgs = createChannelCallArgs<Registry>(\n pattern,\n parameters as object | undefined\n )\n const acquired = acquireChannel(socket, ...channelArgs)\n channel.value = acquired.channel\n onCleanup(() => acquired.lease.release())\n },\n { immediate: true }\n )\n\n return channel\n }\n\n function useChannelEvent<\n const Pattern extends FrameworkChannelPattern<Registry>,\n Event extends FrameworkChannelEvent<Registry, Pattern>,\n >(pattern: Pattern | null, ...args: VueChannelEventArgs<Registry, Pattern, Event>): void {\n const socket = useSocket()\n const { parameterInput, event, handler } = resolveChannelEventArgs<\n ChannelParameterInput<Registry, Pattern>,\n Event,\n FrameworkChannelEventPayload<Registry, Pattern, Event>\n >(args)\n watch(\n () => (pattern === null ? null : toValue(parameterInput)),\n (parameters, _previousParameters, onCleanup) => {\n const nextName =\n pattern === null ? null : buildChannelName(pattern, parameters as object | undefined)\n if (nextName === null || pattern === null) return\n const channelArgs = createChannelCallArgs<Registry>(\n pattern,\n parameters as object | undefined\n )\n const { lease } = acquireChannel(socket, ...channelArgs)\n lease.listen(event, handler)\n onCleanup(() => lease.release())\n },\n { immediate: true }\n )\n }\n\n return { provideSocket, useSocket, useSocketState, useChannel, useChannelEvent }\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../../src/client/vue.ts"],"sourcesContent":["import {\n computed,\n inject,\n onMounted,\n onScopeDispose,\n provide,\n shallowRef,\n toValue,\n watch,\n type ComputedRef,\n type InjectionKey,\n type MaybeRefOrGetter,\n type ShallowRef,\n} from 'vue'\nimport type { Channel } from './channel.js'\nimport { buildChannelName, type Socket } from './socket.js'\nimport type { ConnectionState, EventHandler } from './types.js'\nimport {\n acquireChannel,\n acquireSocketOwnership,\n createChannelCallArgs,\n resolveChannelEventArgs,\n type FrameworkChannel,\n type FrameworkChannelEvent,\n type FrameworkChannelEventPayload,\n type FrameworkChannelParameters,\n type FrameworkChannelPattern,\n} from './framework.js'\n\ninterface VueSocketContext<Registry> {\n socket: Socket<Registry>\n state: ShallowRef<ConnectionState>\n}\n\ntype ChannelParameterInput<\n Registry,\n Pattern extends FrameworkChannelPattern<Registry>,\n> = MaybeRefOrGetter<FrameworkChannelParameters<Registry, Pattern>>\n\ntype VueChannelCallArgs<Registry> = {\n [Pattern in FrameworkChannelPattern<Registry>]: FrameworkChannelParameters<\n Registry,\n Pattern\n > extends undefined\n ? [pattern: Pattern]\n : [pattern: Pattern, parameters: ChannelParameterInput<Registry, Pattern>]\n}[FrameworkChannelPattern<Registry>]\n\ntype VueChannelEventArgs<\n Registry,\n Pattern extends FrameworkChannelPattern<Registry>,\n Event extends FrameworkChannelEvent<Registry, Pattern>,\n> =\n FrameworkChannelParameters<Registry, Pattern> extends undefined\n ? [event: Event, handler: EventHandler<FrameworkChannelEventPayload<Registry, Pattern, Event>>]\n : [\n parameters: ChannelParameterInput<Registry, Pattern>,\n event: Event,\n handler: EventHandler<FrameworkChannelEventPayload<Registry, Pattern, Event>>,\n ]\n\nexport function createSocketComposables<Registry = never>() {\n const key = Symbol('socket') as InjectionKey<VueSocketContext<Registry>>\n\n function provideSocket(socket: Socket<Registry>, options: { owned?: boolean } = {}): void {\n const state = shallowRef(socket.state)\n const stopStateListener = socket.onStateChange((nextState) => {\n state.value = nextState\n })\n provide(key, { socket, state })\n\n let releaseOwnership: (() => void) | undefined\n if (options.owned) onMounted(() => (releaseOwnership = acquireSocketOwnership(socket)))\n onScopeDispose(() => {\n stopStateListener()\n releaseOwnership?.()\n })\n }\n\n function useContext(): VueSocketContext<Registry> {\n const context = inject(key)\n if (!context) throw new Error('provideSocket must be called by an ancestor')\n return context\n }\n\n function useSocket(): Socket<Registry> {\n return useContext().socket\n }\n\n function useSocketState(): {\n state: Readonly<ShallowRef<ConnectionState>>\n connected: ComputedRef<boolean>\n } {\n const state = useContext().state\n return { state, connected: computed(() => state.value === 'connected') }\n }\n\n function useChannel<const Args extends VueChannelCallArgs<Registry>>(\n ...args: Args\n ): Readonly<ShallowRef<FrameworkChannel<Registry, Args[0]> | null>>\n function useChannel(pattern: null): Readonly<ShallowRef<null>>\n function useChannel(\n ...args: [\n pattern: FrameworkChannelPattern<Registry> | null,\n parameterInput?: MaybeRefOrGetter<object | undefined>,\n ]\n ): Readonly<ShallowRef<Channel<any> | null>> {\n const [pattern, parameterInput] = args\n const socket = useSocket()\n const channel = shallowRef(null) as ShallowRef<Channel<any> | null>\n\n watch(\n () => (pattern === null ? null : toValue(parameterInput)),\n (parameters, _previousParameters, onCleanup) => {\n const nextName =\n pattern === null ? null : buildChannelName(pattern, parameters as object | undefined)\n if (nextName === null || pattern === null) {\n channel.value = null\n return\n }\n const channelArgs = createChannelCallArgs<Registry>(\n pattern,\n parameters as object | undefined\n )\n const acquired = acquireChannel(socket, ...channelArgs)\n channel.value = acquired.channel\n onCleanup(() => acquired.lease.release())\n },\n { immediate: true }\n )\n\n return channel\n }\n\n function useChannelEvent<\n const Pattern extends FrameworkChannelPattern<Registry>,\n Event extends FrameworkChannelEvent<Registry, Pattern>,\n >(pattern: Pattern | null, ...args: VueChannelEventArgs<Registry, Pattern, Event>): void {\n const socket = useSocket()\n const { parameterInput, event, handler } = resolveChannelEventArgs<\n ChannelParameterInput<Registry, Pattern>,\n Event,\n FrameworkChannelEventPayload<Registry, Pattern, Event>\n >(args)\n watch(\n () => (pattern === null ? null : toValue(parameterInput)),\n (parameters, _previousParameters, onCleanup) => {\n const nextName =\n pattern === null ? null : buildChannelName(pattern, parameters as object | undefined)\n if (nextName === null || pattern === null) return\n const channelArgs = createChannelCallArgs<Registry>(\n pattern,\n parameters as object | undefined\n )\n const { lease } = acquireChannel(socket, ...channelArgs)\n lease.listen(event, handler)\n onCleanup(() => lease.release())\n },\n { immediate: true }\n )\n }\n\n return { provideSocket, useSocket, useSocketState, useChannel, useChannelEvent }\n}\n"],"mappings":";;;;;;;;;;;;;;AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAKK;AAgDA,SAAS,0BAA4C;AAC1D,QAAM,MAAM,uBAAO,QAAQ;AAE3B,WAAS,cAAc,QAA0B,UAA+B,CAAC,GAAS;AACxF,UAAM,QAAQ,WAAW,OAAO,KAAK;AACrC,UAAM,oBAAoB,OAAO,cAAc,CAAC,cAAc;AAC5D,YAAM,QAAQ;AAAA,IAChB,CAAC;AACD,YAAQ,KAAK,EAAE,QAAQ,MAAM,CAAC;AAE9B,QAAI;AACJ,QAAI,QAAQ,MAAO,WAAU,MAAO,mBAAmB,uBAAuB,MAAM,CAAE;AACtF,mBAAe,MAAM;AACnB,wBAAkB;AAClB,yBAAmB;AAAA,IACrB,CAAC;AAAA,EACH;AAEA,WAAS,aAAyC;AAChD,UAAM,UAAU,OAAO,GAAG;AAC1B,QAAI,CAAC,QAAS,OAAM,IAAI,MAAM,6CAA6C;AAC3E,WAAO;AAAA,EACT;AAEA,WAAS,YAA8B;AACrC,WAAO,WAAW,EAAE;AAAA,EACtB;AAEA,WAAS,iBAGP;AACA,UAAM,QAAQ,WAAW,EAAE;AAC3B,WAAO,EAAE,OAAO,WAAW,SAAS,MAAM,MAAM,UAAU,WAAW,EAAE;AAAA,EACzE;AAMA,WAAS,cACJ,MAIwC;AAC3C,UAAM,CAAC,SAAS,cAAc,IAAI;AAClC,UAAM,SAAS,UAAU;AACzB,UAAM,UAAU,WAAW,IAAI;AAE/B;AAAA,MACE,MAAO,YAAY,OAAO,OAAO,QAAQ,cAAc;AAAA,MACvD,CAAC,YAAY,qBAAqB,cAAc;AAC9C,cAAM,WACJ,YAAY,OAAO,OAAO,iBAAiB,SAAS,UAAgC;AACtF,YAAI,aAAa,QAAQ,YAAY,MAAM;AACzC,kBAAQ,QAAQ;AAChB;AAAA,QACF;AACA,cAAM,cAAc;AAAA,UAClB;AAAA,UACA;AAAA,QACF;AACA,cAAM,WAAW,eAAe,QAAQ,GAAG,WAAW;AACtD,gBAAQ,QAAQ,SAAS;AACzB,kBAAU,MAAM,SAAS,MAAM,QAAQ,CAAC;AAAA,MAC1C;AAAA,MACA,EAAE,WAAW,KAAK;AAAA,IACpB;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,gBAGP,YAA4B,MAA2D;AACvF,UAAM,SAAS,UAAU;AACzB,UAAM,EAAE,gBAAgB,OAAO,QAAQ,IAAI,wBAIzC,IAAI;AACN;AAAA,MACE,MAAO,YAAY,OAAO,OAAO,QAAQ,cAAc;AAAA,MACvD,CAAC,YAAY,qBAAqB,cAAc;AAC9C,cAAM,WACJ,YAAY,OAAO,OAAO,iBAAiB,SAAS,UAAgC;AACtF,YAAI,aAAa,QAAQ,YAAY,KAAM;AAC3C,cAAM,cAAc;AAAA,UAClB;AAAA,UACA;AAAA,QACF;AACA,cAAM,EAAE,MAAM,IAAI,eAAe,QAAQ,GAAG,WAAW;AACvD,cAAM,OAAO,OAAO,OAAO;AAC3B,kBAAU,MAAM,MAAM,QAAQ,CAAC;AAAA,MACjC;AAAA,MACA,EAAE,WAAW,KAAK;AAAA,IACpB;AAAA,EACF;AAEA,SAAO,EAAE,eAAe,WAAW,gBAAgB,YAAY,gBAAgB;AACjF;","names":[]}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import { A as AuthenticatedSocket } from '../base_channel-
|
|
1
|
+
import { A as AuthenticatedSocket } from '../base_channel-CasBQV5I.js';
|
|
2
2
|
import 'ws';
|
|
3
3
|
import 'node:http';
|
|
4
4
|
import '@adonisjs/core/types/http';
|
|
5
5
|
import '@adonisjs/core/http';
|
|
6
6
|
import '@boringnode/bus/types/main';
|
|
7
|
+
import '../shared_types-B11CaOr5.js';
|
|
7
8
|
|
|
8
9
|
type DecoratedChannelHandler<User> = (socket: AuthenticatedSocket<User>, data: unknown) => unknown;
|
|
9
10
|
/**
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import { BaseCheck, Result } from '@adonisjs/core/health';
|
|
2
|
-
import { S as SocketService } from '../socket_service-
|
|
2
|
+
import { S as SocketService } from '../socket_service-C2YRbhrO.js';
|
|
3
3
|
import 'node:http';
|
|
4
4
|
import '@adonisjs/logger';
|
|
5
5
|
import 'emittery';
|
|
6
6
|
import 'ws';
|
|
7
|
-
import '../base_channel-
|
|
7
|
+
import '../base_channel-CasBQV5I.js';
|
|
8
8
|
import '@adonisjs/core/types/http';
|
|
9
9
|
import '@adonisjs/core/http';
|
|
10
10
|
import '@boringnode/bus/types/main';
|
|
11
|
+
import '../shared_types-B11CaOr5.js';
|
|
11
12
|
import './testing.js';
|
|
12
13
|
|
|
13
14
|
declare class SocketHealthCheck extends BaseCheck {
|
package/build/src/otel.d.ts
CHANGED
|
@@ -23,6 +23,7 @@ declare class SocketInstrumentation extends InstrumentationBase<SocketInstrument
|
|
|
23
23
|
protected broadcastHandlers?: TracingChannelSubscribers<SocketBroadcastMessage>;
|
|
24
24
|
constructor(config?: SocketInstrumentationConfig);
|
|
25
25
|
protected init(): undefined;
|
|
26
|
+
protected _updateMetricInstruments(): void;
|
|
26
27
|
enable(): void;
|
|
27
28
|
disable(): void;
|
|
28
29
|
manuallyRegister(): void;
|