Skip to content

Commit 36c3132

Browse files
authored
Merge pull request #14 from jsonjoy-com/optimize-bundle
Optimize bundle
2 parents ddc9a38 + 344a302 commit 36c3132

25 files changed

+316
-211
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@
122122
"typescript": "^5.4.5",
123123
"uWebSockets.js": "uNetworking/uWebSockets.js#v20.44.0",
124124
"webpack": "^5.94.0",
125+
"webpack-bundle-analyzer": "^4.10.2",
125126
"webpack-cli": "^5.1.4",
126127
"webpack-dev-server": "^5.1.0",
127128
"websocket": "^1.0.34",

src/__demos__/json-crdt-server/routes/index.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {LevelStore} from '../services/blocks/store/level/LevelStore';
1010
import {ClassicLevel} from 'classic-level';
1111
import {Store} from '../services/blocks/store/types';
1212
import type {RouteDeps} from './types';
13+
import {TypedRpcError} from '../../../common/rpc/caller/error/typed';
1314

1415
export const createRouter = (services: Services) => {
1516
const router = ObjectValue.create(system);
@@ -28,10 +29,10 @@ export const createCaller = (services: Services = new Services()) => {
2829
router,
2930
wrapInternalError: (error: unknown) => {
3031
if (error instanceof RpcValue) return error;
31-
if (error instanceof RpcError) return RpcError.value(error);
32+
if (error instanceof RpcError) return TypedRpcError.value(error);
3233
// tslint:disable-next-line:no-console
3334
console.error(error);
34-
return RpcError.valueFrom(error);
35+
return TypedRpcError.valueFrom(error);
3536
},
3637
});
3738
return {router, caller, services};

src/__demos__/ui-text/webpack.config.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ const path = require('path');
22
const HtmlWebpackPlugin = require('html-webpack-plugin');
33

44
module.exports = {
5-
mode: 'development',
5+
// mode: 'development',
6+
mode: 'production',
67
devtool: 'inline-source-map',
78
entry: {
89
bundle: __dirname + '/main',
@@ -11,6 +12,7 @@ module.exports = {
1112
new HtmlWebpackPlugin({
1213
title: 'Development',
1314
}),
15+
new (require('webpack-bundle-analyzer').BundleAnalyzerPlugin)(),
1416
],
1517
module: {
1618
rules: [

src/common/channel/channel.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,6 @@ export interface PersistentChannelParams<T extends string | Uint8Array = string
195195

196196
/**
197197
* Channel which automatically reconnects if disconnected.
198-
* @todo Check if this is still used.
199198
*/
200199
export class PersistentChannel<T extends string | Uint8Array = string | Uint8Array> {
201200
/**

src/common/codec/binary/BinaryRpcMessageCodec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import {RpcMessageFormat} from '../constants';
22
import {decode} from './decode';
3-
import * as msg from '../../messages';
3+
import type * as msg from '../../messages';
44
import type {Uint8ArrayCut} from '@jsonjoy.com/util/lib/buffers/Uint8ArrayCut';
55
import type {JsonValueCodec} from '@jsonjoy.com/json-pack/lib/codecs/types';
66
import type {RpcMessageCodec} from '../types';

src/common/codec/compact/CompactRpcMessageCodec.ts

Lines changed: 148 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
1-
import {MsgPackEncoder} from '@jsonjoy.com/json-pack/lib/msgpack';
2-
import {CborEncoder} from '@jsonjoy.com/json-pack/lib/cbor/CborEncoder';
3-
import {JsonEncoder} from '@jsonjoy.com/json-pack/lib/json/JsonEncoder';
41
import {RpcMessageFormat} from '../constants';
5-
import {RpcError, RpcErrorCodes} from '../../rpc/caller/error';
2+
import {RpcError, RpcErrorCodes} from '../../rpc/caller/error/RpcError';
63
import * as msg from '../../messages';
74
import {CompactMessageType} from './constants';
85
import {RpcValue} from '../../messages/Value';
6+
import {TypedRpcError} from '../../rpc/caller/error/typed';
7+
import type {JsonEncoder} from '@jsonjoy.com/json-pack/lib/json/JsonEncoder';
98
import type {RpcMessageCodec} from '../types';
109
import type {JsonValueCodec} from '@jsonjoy.com/json-pack/lib/codecs/types';
1110
import type * as types from './types';
11+
import type {TlvBinaryJsonEncoder} from '@jsonjoy.com/json-pack';
1212

1313
const fromJson = (arr: unknown | unknown[] | types.CompactMessage): msg.ReactiveRpcMessage => {
1414
if (!(arr instanceof Array)) throw RpcError.fromCode(RpcErrorCodes.BAD_REQUEST);
@@ -48,33 +48,165 @@ const fromJson = (arr: unknown | unknown[] | types.CompactMessage): msg.Reactive
4848
return new msg.NotificationMessage(arr[1], new RpcValue(arr[2], undefined));
4949
}
5050
}
51-
throw RpcError.value(RpcError.validation('Unknown message type'));
51+
throw TypedRpcError.value(RpcError.validation('Unknown message type'));
52+
};
53+
54+
const encodeCompactWithNameAndPayload = (
55+
codec: JsonValueCodec,
56+
type: CompactMessageType,
57+
msg: msg.RequestDataMessage | msg.RequestCompleteMessage | msg.RequestErrorMessage,
58+
) => {
59+
const encoder = codec.encoder;
60+
if (typeof (encoder as any as TlvBinaryJsonEncoder).writeArrHdr === 'function') {
61+
const binaryEncoder = encoder as any as TlvBinaryJsonEncoder;
62+
const value = msg.value;
63+
const hasValue = value !== undefined;
64+
binaryEncoder.writeArrHdr(hasValue ? 4 : 3);
65+
encoder.writeUInteger(type);
66+
encoder.writeUInteger(msg.id);
67+
encoder.writeAsciiStr(msg.method);
68+
if (hasValue) {
69+
if (value.type) value.type.encoder(codec.format)(value.data, encoder);
70+
else encoder.writeAny(value.data);
71+
}
72+
} else if (
73+
typeof (encoder as any as JsonEncoder).writeStartArr === 'function' &&
74+
typeof (encoder as any as JsonEncoder).writeArrSeparator === 'function'
75+
) {
76+
const jsonEncoder = encoder as any as JsonEncoder;
77+
const value = msg.value;
78+
jsonEncoder.writeStartArr();
79+
jsonEncoder.writeNumber(type);
80+
jsonEncoder.writeArrSeparator();
81+
jsonEncoder.writeNumber(msg.id);
82+
jsonEncoder.writeArrSeparator();
83+
jsonEncoder.writeAsciiStr(msg.method);
84+
const hasValue = value !== undefined;
85+
if (hasValue) {
86+
jsonEncoder.writeArrSeparator();
87+
if (value.type) value.type.encoder(codec.format)(value.data, encoder);
88+
else jsonEncoder.writeAny(value.data);
89+
}
90+
jsonEncoder.writeEndArr();
91+
} else encoder.writeArr(msg.toCompact());
92+
};
93+
94+
const encodeCompactWithPayload = (
95+
codec: JsonValueCodec,
96+
type: CompactMessageType,
97+
msg: msg.ResponseCompleteMessage | msg.ResponseDataMessage | msg.ResponseErrorMessage,
98+
) => {
99+
const encoder = codec.encoder;
100+
if (typeof (encoder as any as TlvBinaryJsonEncoder).writeArrHdr === 'function') {
101+
const binaryEncoder = encoder as any as TlvBinaryJsonEncoder;
102+
const value = msg.value;
103+
const hasValue = value !== undefined;
104+
binaryEncoder.writeArrHdr(hasValue ? 3 : 2);
105+
encoder.writeUInteger(type);
106+
encoder.writeUInteger(msg.id);
107+
if (hasValue) {
108+
if (value.type) {
109+
value.type.encoder(codec.format)(value.data, encoder);
110+
} else encoder.writeAny(value.data);
111+
}
112+
} else if (
113+
typeof (encoder as any as JsonEncoder).writeStartArr === 'function' &&
114+
typeof (encoder as any as JsonEncoder).writeArrSeparator === 'function'
115+
) {
116+
const jsonEncoder = encoder as any as JsonEncoder;
117+
const value = msg.value;
118+
jsonEncoder.writeStartArr();
119+
jsonEncoder.writeNumber(type);
120+
jsonEncoder.writeArrSeparator();
121+
jsonEncoder.writeNumber(msg.id);
122+
const hasValue = value !== undefined;
123+
if (hasValue) {
124+
jsonEncoder.writeArrSeparator();
125+
if (value.type) value.type.encoder(codec.format)(value.data, jsonEncoder);
126+
else encoder.writeAny(value.data);
127+
}
128+
jsonEncoder.writeEndArr();
129+
} else encoder.writeArr(msg.toCompact());
52130
};
53131

54132
export class CompactRpcMessageCodec implements RpcMessageCodec {
55133
id = 'rx.compact';
56134
format = RpcMessageFormat.Compact;
57135

58-
public encodeMessage(jsonCodec: JsonValueCodec, message: msg.ReactiveRpcMessage): void {
59-
message.encodeCompact(jsonCodec);
136+
public encodeMessage(codec: JsonValueCodec, message: msg.ReactiveRpcMessage): void {
137+
if (message instanceof msg.NotificationMessage) {
138+
const encoder = codec.encoder;
139+
if (typeof (encoder as any as TlvBinaryJsonEncoder).writeArrHdr === 'function') {
140+
const binaryEncoder = encoder as any as TlvBinaryJsonEncoder;
141+
const value = message.value;
142+
const hasValue = value !== undefined;
143+
binaryEncoder.writeArrHdr(hasValue ? 3 : 2);
144+
encoder.writeUInteger(CompactMessageType.Notification);
145+
encoder.writeAsciiStr(message.method);
146+
if (hasValue) {
147+
if (value.type) value.type.encoder(codec.format)(value.data, encoder);
148+
else encoder.writeAny(value.data);
149+
}
150+
} else if (
151+
typeof (encoder as any as JsonEncoder).writeStartArr === 'function' &&
152+
typeof (encoder as any as JsonEncoder).writeArrSeparator === 'function'
153+
) {
154+
const jsonEncoder = encoder as any as JsonEncoder;
155+
const value = message.value;
156+
jsonEncoder.writeStartArr();
157+
jsonEncoder.writeNumber(CompactMessageType.Notification);
158+
jsonEncoder.writeArrSeparator();
159+
jsonEncoder.writeAsciiStr(message.method);
160+
const hasValue = value !== undefined;
161+
if (hasValue) {
162+
jsonEncoder.writeArrSeparator();
163+
if (value.type) value.type.encoder(codec.format)(value.data, jsonEncoder);
164+
else encoder.writeAny(value.data);
165+
}
166+
jsonEncoder.writeEndArr();
167+
} else encoder.writeArr(message.toCompact());
168+
} else if (message instanceof msg.RequestDataMessage) {
169+
encodeCompactWithNameAndPayload(codec, CompactMessageType.RequestData, message);
170+
} else if (message instanceof msg.RequestCompleteMessage) {
171+
encodeCompactWithNameAndPayload(codec, CompactMessageType.RequestComplete, message);
172+
} else if (message instanceof msg.RequestErrorMessage) {
173+
encodeCompactWithNameAndPayload(codec, CompactMessageType.RequestError, message);
174+
} else if (message instanceof msg.RequestUnsubscribeMessage) {
175+
codec.encoder.writeArr(message.toCompact());
176+
} else if (message instanceof msg.ResponseCompleteMessage) {
177+
encodeCompactWithPayload(codec, CompactMessageType.ResponseComplete, message);
178+
} else if (message instanceof msg.ResponseDataMessage) {
179+
encodeCompactWithPayload(codec, CompactMessageType.ResponseData, message);
180+
} else if (message instanceof msg.ResponseErrorMessage) {
181+
encodeCompactWithPayload(codec, CompactMessageType.ResponseError, message);
182+
} else if (message instanceof msg.ResponseUnsubscribeMessage) {
183+
codec.encoder.writeArr(message.toCompact());
184+
} else {
185+
codec.encoder.writeArr((message as any).toCompact());
186+
}
60187
}
61188

62189
public encodeBatch(jsonCodec: JsonValueCodec, batch: msg.ReactiveRpcMessage[]): void {
63190
const encoder = jsonCodec.encoder;
64-
if (encoder instanceof CborEncoder || encoder instanceof MsgPackEncoder) {
191+
if (typeof (encoder as any as TlvBinaryJsonEncoder).writeArrHdr === 'function') {
192+
const binaryEncoder = encoder as any as TlvBinaryJsonEncoder;
65193
const length = batch.length;
66-
encoder.writeArrHdr(length);
67-
for (let i = 0; i < length; i++) batch[i].encodeCompact(jsonCodec);
68-
} else if (encoder instanceof JsonEncoder) {
194+
binaryEncoder.writeArrHdr(length);
195+
for (let i = 0; i < length; i++) this.encodeMessage(jsonCodec, batch[i]);
196+
} else if (
197+
typeof (encoder as any as JsonEncoder).writeStartArr === 'function' &&
198+
typeof (encoder as any as JsonEncoder).writeArrSeparator === 'function'
199+
) {
200+
const jsonEncoder = encoder as any as JsonEncoder;
69201
const length = batch.length;
70202
const last = length - 1;
71-
encoder.writeStartArr();
203+
jsonEncoder.writeStartArr();
72204
for (let i = 0; i < last; i++) {
73-
batch[i].encodeCompact(jsonCodec);
74-
encoder.writeArrSeparator();
205+
this.encodeMessage(jsonCodec, batch[i]);
206+
jsonEncoder.writeArrSeparator();
75207
}
76-
if (length > 0) batch[last].encodeCompact(jsonCodec);
77-
encoder.writeEndArr();
208+
if (length > 0) this.encodeMessage(jsonCodec, batch[last]);
209+
jsonEncoder.writeEndArr();
78210
} else {
79211
const jsonMessages: types.CompactMessage[] = [];
80212
const length = batch.length;

src/common/codec/compact/__tests__/smoke-tests.spec.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import {
1414
ResponseUnsubscribeMessage,
1515
} from '../../../messages';
1616
import {RpcValue} from '../../../messages/Value';
17-
import {RpcError} from '../../../rpc/caller/error';
17+
import {TypedRpcError} from '../../../rpc/caller/error/typed';
1818

1919
const writer = new Writer(8 * Math.round(Math.random() * 100));
2020
const codecs = new Codecs(writer);
@@ -84,7 +84,7 @@ for (const jsonCodec of codecList) {
8484
});
8585

8686
test('Response Error typed', () => {
87-
const value = RpcError.internalErrorValue(null);
87+
const value = TypedRpcError.internalErrorValue(null);
8888
const message = new ResponseErrorMessage(123, value);
8989
const encoded = codec.encode(jsonCodec, [message]);
9090
const decoded1 = jsonCodec.decoder.read(encoded);

src/common/codec/json-rpc-2/JsonRpc2RpcMessageCodec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import {EncodingFormat} from '@jsonjoy.com/json-pack/lib/constants';
22
import {TlvBinaryJsonEncoder} from '@jsonjoy.com/json-pack/lib/types';
33
import {JsonJsonValueCodec} from '@jsonjoy.com/json-pack/lib/codecs/json';
44
import {RpcMessageFormat} from '../constants';
5-
import {RpcError} from '../../rpc/caller/error';
5+
import {RpcError} from '../../rpc/caller/error/RpcError';
66
import {RpcValue} from '../../messages/Value';
77
import * as msg from '../../messages';
88
import * as schema from './schema';

0 commit comments

Comments
 (0)