Skip to content

Commit 58b6f15

Browse files
authored
feat: jsr + conninfo on handler + types - fix #5 (#6)
* feat: jsr + conninfo on handler + types - fix #5 * feat: jsr + conninfo on handler + types - fix #5
1 parent aef5d43 commit 58b6f15

File tree

12 files changed

+257
-107
lines changed

12 files changed

+257
-107
lines changed

.github/workflows/build.yml

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
name: Build
2+
on:
3+
push:
4+
branches: [master]
5+
pull_request:
6+
7+
jobs:
8+
prettier:
9+
name: "prettier"
10+
runs-on: ubuntu-latest
11+
strategy:
12+
matrix:
13+
deno-version: [1.45.3]
14+
15+
steps:
16+
- uses: actions/checkout@v4
17+
18+
- uses: actions/setup-node@v4
19+
with:
20+
node-version: "20.x"
21+
registry-url: "https://registry.npmjs.org"
22+
- run: yarn install --frozen-lockfile
23+
24+
- name: run prettier checker
25+
run: yarn prettier:check
26+
27+
- name: Use Deno Version ${{ matrix.deno-version }}
28+
uses: denoland/setup-deno@v1
29+
with:
30+
deno-version: ${{ matrix.deno-version }}

.github/workflows/publish.yml

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
name: Publish
2+
on:
3+
push:
4+
tags:
5+
- "*"
6+
7+
jobs:
8+
publish:
9+
runs-on: ubuntu-latest
10+
strategy:
11+
matrix:
12+
deno-version: [1.45.3]
13+
14+
permissions:
15+
contents: read
16+
id-token: write
17+
18+
steps:
19+
- uses: actions/checkout@v4
20+
21+
- name: Set Versions
22+
uses: actions/github-script@v4
23+
id: set_version
24+
with:
25+
script: |
26+
const tag = context.ref.substring(10).replace('v', '')
27+
core.setOutput('tag', tag)
28+
console.log(tag)
29+
30+
- uses: actions/setup-node@v4
31+
with:
32+
node-version: "20.x"
33+
registry-url: "https://registry.npmjs.org"
34+
- run: yarn install --frozen-lockfile
35+
36+
- name: run prettier checker
37+
run: yarn prettier:check
38+
39+
- name: Add version to package.json
40+
uses: jaywcjlove/github-action-package@main
41+
with:
42+
path: "./deno.json"
43+
data: |
44+
{
45+
"version": "${{ steps.set_version.outputs.tag }}"
46+
}
47+
48+
- name: Publish package
49+
run: npx jsr publish --allow-dirty

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
1-
.idea
1+
.idea
2+
node_modules

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
# SOCKET.ionic
1+
# @da/socket
22

33
## Server
44

55
```ts
6-
import { getServerSocket } from "https://deno.land/x/socket_ionic/mod.ts";
6+
import { getServerSocket } from "@da/socket";
77

88
const server = getServerSocket(1994);
99

deno.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"name": "@da/socket",
3+
"version": "0.0.0",
4+
"exports": "./index.ts"
5+
}

mod.ts renamed to index.ts

File renamed without changes.

package.json

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
{
2+
"scripts": {
3+
"prettier:check": "prettier -c ./",
4+
"prettier:write": "prettier --write ."
5+
},
6+
"devDependencies": {
7+
"prettier": "3.3.3"
8+
},
9+
"packageManager": "[email protected]"
10+
}

src/client.ts

Lines changed: 87 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,31 @@ type Props = {
77
protocols?: string[];
88
};
99

10+
type Mutable = {
11+
connect: () => Promise<void>;
12+
emit: (
13+
event: string,
14+
message?: unknown,
15+
response?: (message?: unknown) => void,
16+
) => void;
17+
on: (
18+
event: "connected" | "disconnected" | "error",
19+
callback: (data?: unknown) => void,
20+
) => () => void;
21+
close: () => void;
22+
};
23+
1024
enum ReadyState {
1125
CONNECTING,
1226
OPEN,
1327
CLOSING,
14-
CLOSED
28+
CLOSED,
1529
}
1630

1731
const getRandomString = (length: number) => {
18-
let result = '';
32+
let result = "";
1933
const characters =
20-
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
34+
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
2135
const charactersLength = characters.length;
2236
let counter = 0;
2337
while (counter < length) {
@@ -34,101 +48,115 @@ export const getClientSocket = ({
3448
reconnectInterval = 1_000,
3549
silent = false,
3650
protocols = [],
37-
}: Props) => {
38-
const events: Record<string, any[]> = {};
51+
}: Props): Mutable => {
52+
const events: Record<string, ((data?: unknown) => unknown | null)[]> = {};
3953

40-
let socket;
54+
let socket: WebSocket;
4155
let reconnects = 0;
4256
let isConnected = false;
43-
let isClosed = false
44-
45-
const emitEventCallback = (event: string, data?: any) => {
46-
if(!events[event]) return;
47-
48-
for (const callback of events[event]) callback?.(data)
49-
}
50-
51-
const connect = async () =>
52-
new Promise((resolve, reject) => {
57+
let isClosed = false;
58+
59+
const emitEventCallback = (event: string, data?: unknown) => {
60+
if (!events[event]) return;
61+
62+
for (const callback of events[event]) callback?.(data);
63+
};
64+
65+
const connect = (): Promise<void> =>
66+
new Promise<void>((resolve, reject) => {
5367
try {
54-
if (isConnected) return resolve(null);
55-
68+
if (isConnected) return resolve();
69+
5670
!silent && reconnects === 0 && console.log(`Connecting to ${url}!`);
5771
socket = new WebSocket(url, protocols);
58-
72+
5973
// Connection opened
6074
socket.addEventListener("open", () => {
6175
isConnected = true;
6276
!silent && console.log(`Connected to ${url}!`);
63-
emitEventCallback('connected')
64-
resolve(null);
77+
emitEventCallback("connected");
78+
resolve();
6579
reconnects = 0;
6680
});
67-
81+
6882
// Listen for messages
69-
socket.addEventListener("message", async ({ data }) => {
83+
socket.addEventListener("message", ({ data }) => {
7084
const { event, message } = JSON.parse(data);
71-
if(!events[event]) return
72-
73-
emitEventCallback(event, message)
85+
if (!events[event]) return;
86+
87+
emitEventCallback(event, message);
7488
});
75-
76-
socket.addEventListener("error", (message) => emitEventCallback('error', message));
77-
89+
90+
socket.addEventListener("error", (message) =>
91+
emitEventCallback("error", message),
92+
);
93+
7894
socket.addEventListener("close", (message) => {
7995
!silent && isConnected && console.log(`Disconnected from ${url}!`);
80-
96+
8197
// resovle if it's already closed
82-
if(isClosed) return resolve(null);
83-
98+
if (isClosed) return resolve();
99+
84100
isConnected = false;
85101
if (reconnect && reconnectIntents > reconnects) {
86102
reconnects++;
87103
!silent &&
88-
console.log(
89-
`(${reconnects}/${reconnectIntents}) Reconnecting to ${url} in ${reconnectInterval}ms...`,
90-
);
104+
console.log(
105+
`(${reconnects}/${reconnectIntents}) Reconnecting to ${url} in ${reconnectInterval}ms...`,
106+
);
91107
setTimeout(async () => {
92108
await connect();
93-
resolve(null);
109+
resolve();
94110
}, reconnectInterval);
95111
return;
96112
}
97-
emitEventCallback('disconnected', message)
98-
resolve(null);
113+
emitEventCallback("disconnected", message);
114+
resolve();
99115
});
100116
} catch (e) {
101-
reject(e)
117+
reject(e);
102118
}
103119
});
104120

105-
const emit = (event: string, message?: any, response?: (message?: any) => void) => {
106-
if(socket.readyState !== ReadyState.OPEN)
107-
throw new Error(`Socket is not open (${ReadyState[socket.readyState]}}) {${event}:${message}}!`)
108-
109-
let responseEventId = null
110-
if(response) {
111-
responseEventId = getRandomString(32)
112-
113-
on(`${event}#${responseEventId}`, (data) => response(data))
121+
const emit = (
122+
event: string,
123+
message?: unknown,
124+
response?: (message?: unknown) => void,
125+
): void => {
126+
if (socket.readyState !== ReadyState.OPEN)
127+
throw new Error(
128+
`Socket is not open (${ReadyState[socket.readyState]}}) {${event}:${message}}!`,
129+
);
130+
131+
let responseEventId = null;
132+
if (response) {
133+
responseEventId = getRandomString(32);
134+
135+
on(`${event}#${responseEventId}`, (data) => response(data));
114136
}
115-
socket.send(JSON.stringify({ event, message: message || {}, responseEventId }));
116-
}
137+
socket.send(
138+
JSON.stringify({ event, message: message || {}, responseEventId }),
139+
);
140+
};
117141

118142
const on = (
119143
event: "connected" | "disconnected" | "error" | string,
120-
callback: (data?: any) => void,
121-
) => {
122-
if(!events[event]) events[event] = []
123-
124-
const index = events[event].push(callback) - 1
125-
return () => events[event] = events[event].map((callback, $index) => index === $index ? null : callback)
126-
}
144+
callback: (data?: unknown) => void,
145+
): (() => void) => {
146+
if (!events[event]) events[event] = [];
147+
148+
const index = events[event].push(callback) - 1;
149+
return () =>
150+
(events[event] = events[event].map<(data?: unknown) => unknown>(
151+
(callback, $index) =>
152+
(index === $index ? null : callback) as (data?: unknown) => unknown,
153+
));
154+
};
127155

128156
const close = () => {
129-
isClosed = true
157+
isClosed = true;
130158
socket.close();
131-
}
159+
};
132160

133161
return {
134162
connect,

0 commit comments

Comments
 (0)