@trpc/server 11.1.0 → 11.1.1-canary.8

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@trpc/server",
3
- "version": "11.1.0",
3
+ "version": "11.1.1-canary.8+9beb26c63",
4
4
  "description": "The tRPC server library",
5
5
  "author": "KATT",
6
6
  "license": "MIT",
@@ -152,5 +152,5 @@
152
152
  "peerDependencies": {
153
153
  "typescript": ">=5.7.2"
154
154
  },
155
- "gitHead": "0b93d77369ffbcaf70afa1052691bc643cf33a61"
155
+ "gitHead": "9beb26c636d44852e0f407f3d7a82ad54df65b4d"
156
156
  }
@@ -68,8 +68,8 @@ export function fastifyTRPCPlugin<TRouter extends AnyRouter>(
68
68
  ...trpcOptions,
69
69
  });
70
70
 
71
- fastify.get(prefix ?? '/', { websocket: true }, async (socket, req) => {
72
- await onConnection(socket, req.raw);
71
+ fastify.get(prefix ?? '/', { websocket: true }, (socket, req) => {
72
+ onConnection(socket, req.raw);
73
73
  if (trpcOptions?.keepAlive?.enabled) {
74
74
  const { pingMs, pongWaitMs } = trpcOptions.keepAlive;
75
75
  handleKeepAlive(socket, pingMs, pongWaitMs);
@@ -34,6 +34,8 @@ import {
34
34
  type MaybePromise,
35
35
  } from '../unstable-core-do-not-import';
36
36
  // eslint-disable-next-line no-restricted-imports
37
+ import type { Result } from '../unstable-core-do-not-import';
38
+ // eslint-disable-next-line no-restricted-imports
37
39
  import { iteratorResource } from '../unstable-core-do-not-import/stream/utils/asyncIterable';
38
40
  import { Unpromise } from '../vendor/unpromise';
39
41
  import { createURL, type NodeHTTPCreateContextFnOptions } from './node-http';
@@ -98,14 +100,16 @@ export type WSSHandlerOptions<TRouter extends AnyRouter> =
98
100
  dangerouslyDisablePong?: boolean;
99
101
  };
100
102
 
101
- const unsetContextPromiseSymbol = Symbol('unsetContextPromise');
102
103
  export function getWSConnectionHandler<TRouter extends AnyRouter>(
103
104
  opts: WSSHandlerOptions<TRouter>,
104
105
  ) {
105
106
  const { createContext, router } = opts;
106
107
  const { transformer } = router._def._config;
107
108
 
108
- return async (client: ws.WebSocket, req: IncomingMessage) => {
109
+ return (client: ws.WebSocket, req: IncomingMessage) => {
110
+ type Context = inferRouterContext<TRouter>;
111
+ type ContextResult = Result<Context>;
112
+
109
113
  const clientSubscriptions = new Map<number | string, AbortController>();
110
114
  const abortController = new AbortController();
111
115
 
@@ -122,26 +126,31 @@ export function getWSConnectionHandler<TRouter extends AnyRouter>(
122
126
  );
123
127
  }
124
128
 
125
- function createCtxPromise(
129
+ async function createCtxPromise(
126
130
  getConnectionParams: () => TRPCRequestInfo['connectionParams'],
127
- ): Promise<inferRouterContext<TRouter>> {
128
- return run(async () => {
129
- ctx = await createContext?.({
130
- req,
131
- res: client,
132
- info: {
133
- connectionParams: getConnectionParams(),
134
- calls: [],
135
- isBatchCall: false,
136
- accept: null,
137
- type: 'unknown',
138
- signal: abortController.signal,
139
- url: null,
140
- },
141
- });
131
+ ): Promise<ContextResult> {
132
+ try {
133
+ return await run(async (): Promise<ContextResult> => {
134
+ ctx = await createContext?.({
135
+ req,
136
+ res: client,
137
+ info: {
138
+ connectionParams: getConnectionParams(),
139
+ calls: [],
140
+ isBatchCall: false,
141
+ accept: null,
142
+ type: 'unknown',
143
+ signal: abortController.signal,
144
+ url: null,
145
+ },
146
+ });
142
147
 
143
- return ctx;
144
- }).catch((cause) => {
148
+ return {
149
+ ok: true,
150
+ value: ctx,
151
+ };
152
+ });
153
+ } catch (cause) {
145
154
  const error = getTRPCErrorFromUnknown(cause);
146
155
  opts.onError?.({
147
156
  error,
@@ -167,12 +176,14 @@ export function getWSConnectionHandler<TRouter extends AnyRouter>(
167
176
  (globalThis.setImmediate ?? globalThis.setTimeout)(() => {
168
177
  client.close();
169
178
  });
170
-
171
- throw error;
172
- });
179
+ return {
180
+ ok: false,
181
+ error,
182
+ };
183
+ }
173
184
  }
174
185
 
175
- let ctx: inferRouterContext<TRouter> | undefined = undefined;
186
+ let ctx: Context | undefined = undefined;
176
187
 
177
188
  /**
178
189
  * promise for initializing the context
@@ -182,18 +193,40 @@ export function getWSConnectionHandler<TRouter extends AnyRouter>(
182
193
  */
183
194
  let ctxPromise =
184
195
  createURL(req).searchParams.get('connectionParams') === '1'
185
- ? unsetContextPromiseSymbol
196
+ ? null
186
197
  : createCtxPromise(() => null);
187
198
 
188
- async function handleRequest(msg: TRPCClientOutgoingMessage) {
199
+ function handleRequest(msg: TRPCClientOutgoingMessage) {
189
200
  const { id, jsonrpc } = msg;
190
201
 
191
- /* istanbul ignore next -- @preserve */
192
202
  if (id === null) {
193
- throw new TRPCError({
194
- code: 'BAD_REQUEST',
195
- message: '`id` is required',
203
+ const error = getTRPCErrorFromUnknown(
204
+ new TRPCError({
205
+ code: 'PARSE_ERROR',
206
+ message: '`id` is required',
207
+ }),
208
+ );
209
+ opts.onError?.({
210
+ error,
211
+ path: undefined,
212
+ type: 'unknown',
213
+ ctx,
214
+ req,
215
+ input: undefined,
196
216
  });
217
+ respond({
218
+ id,
219
+ jsonrpc,
220
+ error: getErrorShape({
221
+ config: router._def._config,
222
+ error,
223
+ type: 'unknown',
224
+ path: undefined,
225
+ input: undefined,
226
+ ctx,
227
+ }),
228
+ });
229
+ return;
197
230
  }
198
231
  if (msg.method === 'subscription.stop') {
199
232
  clientSubscriptions.get(id)?.abort();
@@ -202,20 +235,25 @@ export function getWSConnectionHandler<TRouter extends AnyRouter>(
202
235
  const { path, lastEventId } = msg.params;
203
236
  let { input } = msg.params;
204
237
  const type = msg.method;
205
- try {
206
- if (lastEventId !== undefined) {
207
- if (isObject(input)) {
208
- input = {
209
- ...input,
210
- lastEventId: lastEventId,
211
- };
212
- } else {
213
- input ??= {
214
- lastEventId: lastEventId,
215
- };
216
- }
238
+
239
+ if (lastEventId !== undefined) {
240
+ if (isObject(input)) {
241
+ input = {
242
+ ...input,
243
+ lastEventId: lastEventId,
244
+ };
245
+ } else {
246
+ input ??= {
247
+ lastEventId: lastEventId,
248
+ };
249
+ }
250
+ }
251
+ run(async () => {
252
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
253
+ const res = await ctxPromise!; // asserts context has been set
254
+ if (!res.ok) {
255
+ throw res.error;
217
256
  }
218
- await ctxPromise; // asserts context has been set
219
257
 
220
258
  const abortController = new AbortController();
221
259
  const result = await callTRPCProcedure({
@@ -384,7 +422,7 @@ export function getWSConnectionHandler<TRouter extends AnyRouter>(
384
422
  type: 'started',
385
423
  },
386
424
  });
387
- } catch (cause) /* istanbul ignore next -- @preserve */ {
425
+ }).catch((cause) => {
388
426
  // procedure threw an error
389
427
  const error = getTRPCErrorFromUnknown(cause);
390
428
  opts.onError?.({ error, path, type, ctx, req, input });
@@ -400,9 +438,9 @@ export function getWSConnectionHandler<TRouter extends AnyRouter>(
400
438
  ctx,
401
439
  }),
402
440
  });
403
- }
441
+ });
404
442
  }
405
- client.on('message', async (rawData) => {
443
+ client.on('message', (rawData) => {
406
444
  // eslint-disable-next-line @typescript-eslint/no-base-to-string
407
445
  const msgStr = rawData.toString();
408
446
  if (msgStr === 'PONG') {
@@ -414,7 +452,7 @@ export function getWSConnectionHandler<TRouter extends AnyRouter>(
414
452
  }
415
453
  return;
416
454
  }
417
- if (ctxPromise === unsetContextPromiseSymbol) {
455
+ if (!ctxPromise) {
418
456
  // If the ctxPromise wasn't created immediately, we're expecting the first message to be a TRPCConnectionParamsMessage
419
457
  ctxPromise = createCtxPromise(() => {
420
458
  let msg;
@@ -438,31 +476,36 @@ export function getWSConnectionHandler<TRouter extends AnyRouter>(
438
476
  });
439
477
  return;
440
478
  }
441
- try {
442
- const msgJSON: unknown = JSON.parse(msgStr);
443
- const msgs: unknown[] = Array.isArray(msgJSON) ? msgJSON : [msgJSON];
444
- const promises = msgs
445
- .map((raw) => parseTRPCMessage(raw, transformer))
446
- .map(handleRequest);
447
- await Promise.all(promises);
448
- } catch (cause) {
449
- const error = new TRPCError({
450
- code: 'PARSE_ERROR',
451
- cause,
452
- });
453
479
 
454
- respond({
455
- id: null,
456
- error: getErrorShape({
457
- config: router._def._config,
458
- error,
459
- type: 'unknown',
460
- path: undefined,
461
- input: undefined,
462
- ctx: undefined,
463
- }),
464
- });
465
- }
480
+ const parsedMsgs = run(() => {
481
+ try {
482
+ const msgJSON: unknown = JSON.parse(msgStr);
483
+ const msgs: unknown[] = Array.isArray(msgJSON) ? msgJSON : [msgJSON];
484
+
485
+ return msgs.map((raw) => parseTRPCMessage(raw, transformer));
486
+ } catch (cause) {
487
+ const error = new TRPCError({
488
+ code: 'PARSE_ERROR',
489
+ cause,
490
+ });
491
+
492
+ respond({
493
+ id: null,
494
+ error: getErrorShape({
495
+ config: router._def._config,
496
+ error,
497
+ type: 'unknown',
498
+ path: undefined,
499
+ input: undefined,
500
+ ctx,
501
+ }),
502
+ });
503
+
504
+ return [];
505
+ }
506
+ });
507
+
508
+ parsedMsgs.map(handleRequest);
466
509
  });
467
510
 
468
511
  // WebSocket errors should be handled, as otherwise unhandled exceptions will crash Node.js.
@@ -487,10 +530,6 @@ export function getWSConnectionHandler<TRouter extends AnyRouter>(
487
530
  clientSubscriptions.clear();
488
531
  abortController.abort();
489
532
  });
490
-
491
- if (ctxPromise !== unsetContextPromiseSymbol) {
492
- await ctxPromise;
493
- }
494
533
  };
495
534
  }
496
535
 
@@ -544,22 +583,7 @@ export function applyWSSHandler<TRouter extends AnyRouter>(
544
583
  return;
545
584
  }
546
585
 
547
- onConnection(client, req).catch((cause) => {
548
- opts.onError?.({
549
- error: new TRPCError({
550
- code: 'INTERNAL_SERVER_ERROR',
551
- cause,
552
- message: 'Failed to handle WebSocket connection',
553
- }),
554
- req: req,
555
- path: undefined,
556
- type: 'unknown',
557
- ctx: undefined,
558
- input: undefined,
559
- });
560
-
561
- client.close();
562
- });
586
+ onConnection(client, req);
563
587
  });
564
588
 
565
589
  return {
@@ -1 +0,0 @@
1
- export * from '../../../../dist/adapters/node-http/content-type/form-data';
@@ -1 +0,0 @@
1
- module.exports = require('../../../../dist/adapters/node-http/content-type/form-data');
@@ -1 +0,0 @@
1
- export * from '../../../../dist/adapters/node-http/content-type/json';
@@ -1 +0,0 @@
1
- module.exports = require('../../../../dist/adapters/node-http/content-type/json');
@@ -1,16 +0,0 @@
1
- -----BEGIN CERTIFICATE REQUEST-----
2
- MIICnDCCAYQCAQAwVzELMAkGA1UEBhMCVVMxDjAMBgNVBAgMBVN0YXRlMQ0wCwYD
3
- VQQHDARDaXR5MRUwEwYDVQQKDAxPcmdhbml6YXRpb24xEjAQBgNVBAMMCWxvY2Fs
4
- aG9zdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMzmTl2DaAV9s+HQ
5
- q7kdhDvYIcd5bQdmX3apvkG9llW1ERbgcVgWYi+e+m8JK6IqSfu3lBbLIe5vdy47
6
- csdczal5xK+CYCGddsASdQrj1hOy+YYTI3O3XiGAUUJt6AEBFaMvCGM/g0q6UBmA
7
- g0tz+hh9b6cOG6lRkPG8GidU+HezPILseVSiYASk9DMJpS55J+NsxbGUyKkqwuSH
8
- AMDEeM1ICJIy2L4+JO7/89s4ac5RfFGqoAKck6V6DWSYrHBeYNA06o1JnfF8ee7E
9
- fVPmkDBs/kmOSuckep+a+UAk7xNDa/qbSFPCyVLtQuasHzyFdGNeaa7Mw0aHxazH
10
- flBiq/kCAwEAAaAAMA0GCSqGSIb3DQEBCwUAA4IBAQC7R/twgb7TKiC7877zUbgN
11
- L3Y8ojQ1j5hgNimFSdTQoO942a/qwpz3KNJiXYZFFJJfDLyPpXbM5tDD/kaB+htH
12
- WEw7WFbe/XI8A+YrcGM6hSoEqyidOhnmA8ImYesuUM3ljw6spfMuKN9HyaPW2AxR
13
- k4hkuOKeD6B7izvF20yqdTwMMNC417ZXX69Gxo2KmMJ1UwbLpy6MmooBFfmZfbEi
14
- 5q4SMz/xlqlB/yuN0Khdtef0TOQAMPE41rZ8Z7U5ilMwirH8Q+xAwuIeBg6i5dx5
15
- JYTv7n9ivLHAwKgbyxZ7uhCH8SVJQwmePBW7D6fsAAln/vRQ3qSDJfcLxpOKg/D9
16
- -----END CERTIFICATE REQUEST-----
@@ -1,16 +0,0 @@
1
- -----BEGIN CERTIFICATE REQUEST-----
2
- MIICnDCCAYQCAQAwVzELMAkGA1UEBhMCVVMxDjAMBgNVBAgMBVN0YXRlMQ0wCwYD
3
- VQQHDARDaXR5MRUwEwYDVQQKDAxPcmdhbml6YXRpb24xEjAQBgNVBAMMCWxvY2Fs
4
- aG9zdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMUlV+48NLYnj6bY
5
- 7IAZHEgXHw4EePv2lUct4jRqot80Kb41cgfCHlCkzwXBuyYrZhkNu9Dz6XoCijG6
6
- UvactVPxL2nJTA/YwzUAxzRI01JDzk3PXgGiS1S7C4w+VJe/rEVFXasywvM3KD78
7
- doQjyenK3TGpDuEqrGUMXqSv9ZWEzlkrcdiwKGqrOLvnHjVkEEuwxDlD7YIkwbqr
8
- WKjy1w9UX0yX77BW0CQxMfTFQR3xfk1/lpK2xL5xricAm/m3P0nayuBG1QnOEcJF
9
- LIztK60YH/p2JY2b+pgqpmW3RYjyNVODKoW7KPHoCHPDu97aNWulRdUjKK7bVLT8
10
- D8/NgQcCAwEAAaAAMA0GCSqGSIb3DQEBCwUAA4IBAQBskN6AEEvXGzbj8rSeyn+a
11
- +6Xa/NnmgPpxBWtWPDwIUv0bCCfRtwB93pDIKOf0PpNxidbdNFOZ5InbiWJ/HTZy
12
- Taz4ZcnCbekrc28Grb7yLKk+AKtdRIDGAutBnlCGmhnN2tMqgfqmC1A6liUa8B9K
13
- STYik2woZiH20fsF4maNNKv0tqWmSm/g4IOvniE+L3IebW0wl0BAKjAjc481uaNc
14
- sq72Lwgqdrh66AR70VeFzcTUJlXDTtCBfs2ejnJ7oqmldjsP1mIiTMobE6OOiSI1
15
- P3z52lWYIkQ5eq5bPsGLxOLbo3Oj97O3BRaW/KOOyrWy00sUoqtAnc9J80DpVb8m
16
- -----END CERTIFICATE REQUEST-----
@@ -1,21 +0,0 @@
1
- -----BEGIN CERTIFICATE-----
2
- MIIDXTCCAkWgAwIBAgIUHRRMEU8Gk+R8L6NWrn4V+tyR+TYwDQYJKoZIhvcNAQEL
3
- BQAwVzELMAkGA1UEBhMCVVMxDjAMBgNVBAgMBVN0YXRlMQ0wCwYDVQQHDARDaXR5
4
- MRUwEwYDVQQKDAxPcmdhbml6YXRpb24xEjAQBgNVBAMMCWxvY2FsaG9zdDAeFw0y
5
- NTAyMDUwODQwMTdaFw0yNjAyMDUwODQwMTdaMFcxCzAJBgNVBAYTAlVTMQ4wDAYD
6
- VQQIDAVTdGF0ZTENMAsGA1UEBwwEQ2l0eTEVMBMGA1UECgwMT3JnYW5pemF0aW9u
7
- MRIwEAYDVQQDDAlsb2NhbGhvc3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
8
- AoIBAQDFJVfuPDS2J4+m2OyAGRxIFx8OBHj79pVHLeI0aqLfNCm+NXIHwh5QpM8F
9
- wbsmK2YZDbvQ8+l6AooxulL2nLVT8S9pyUwP2MM1AMc0SNNSQ85Nz14BoktUuwuM
10
- PlSXv6xFRV2rMsLzNyg+/HaEI8npyt0xqQ7hKqxlDF6kr/WVhM5ZK3HYsChqqzi7
11
- 5x41ZBBLsMQ5Q+2CJMG6q1io8tcPVF9Ml++wVtAkMTH0xUEd8X5Nf5aStsS+ca4n
12
- AJv5tz9J2srgRtUJzhHCRSyM7SutGB/6diWNm/qYKqZlt0WI8jVTgyqFuyjx6Ahz
13
- w7ve2jVrpUXVIyiu21S0/A/PzYEHAgMBAAGjITAfMB0GA1UdDgQWBBQXOmpfTQXk
14
- +zu/QjreEe21Wi3YcTANBgkqhkiG9w0BAQsFAAOCAQEAWzE8ACF1qf05SDGqLs8Y
15
- j948IXf0E2ou23/M2n5wMYOGRWe5KrHJjHYcTcssHklb30KEfv35QlKW3jBCy909
16
- DrTcpMcdNapbyMKvvUB1SlLildl0MoaJMtYKE/UjdBRcl/oTPRpOAvqZNC2bqdww
17
- YqHLW30RJQKVCjE63KN+CNf3Tl8JkZpbAex46BIP2m9pEeJYahGjr0sw/xH37j5N
18
- lkKVKMSdtqeGtP4x4tVZwb+c2faDVBncO7HtprHktx7zPyYrrLHRbejxF0nU6gJt
19
- TPWsxfAPz5Qp08/kd8JMYvp0c8vLqin7MeYbt27jrt38ojBDM63tr39HjBBCWD4X
20
- uA==
21
- -----END CERTIFICATE-----
@@ -1,28 +0,0 @@
1
- -----BEGIN PRIVATE KEY-----
2
- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDFJVfuPDS2J4+m
3
- 2OyAGRxIFx8OBHj79pVHLeI0aqLfNCm+NXIHwh5QpM8FwbsmK2YZDbvQ8+l6Aoox
4
- ulL2nLVT8S9pyUwP2MM1AMc0SNNSQ85Nz14BoktUuwuMPlSXv6xFRV2rMsLzNyg+
5
- /HaEI8npyt0xqQ7hKqxlDF6kr/WVhM5ZK3HYsChqqzi75x41ZBBLsMQ5Q+2CJMG6
6
- q1io8tcPVF9Ml++wVtAkMTH0xUEd8X5Nf5aStsS+ca4nAJv5tz9J2srgRtUJzhHC
7
- RSyM7SutGB/6diWNm/qYKqZlt0WI8jVTgyqFuyjx6Ahzw7ve2jVrpUXVIyiu21S0
8
- /A/PzYEHAgMBAAECggEAKw/UHBKEhQExLIWXaweRGOIMA3jQoGClDK4mCcL9Hnn7
9
- YDO2W6F4E69cFOrTISw7md9ZFfQhHGhvnRsQwhNKvDIjZBz3A0MaqHoqCO6bUg3D
10
- g1V3OC4l/DT6+cAnpBnW3C6hniJxWMTEgrWMgaJ7mRiZph5CRMaYb137UkepAeZk
11
- YITpoT4WM/aC0m6tbRqPju44H1CI6fEO0jXvXMzbx9HC/ecGLXffUlr44coTEzJd
12
- 0jiJZ1IgF3ULSESP1YZ/ZO+QhZn0SAEGnwvPNPp8J+OPpMCyCpd7juaVJ0+L4dXW
13
- dY1AkU/CalomMmm8jRq7k0+EyewKwUXw4A84aw3q0QKBgQD/vXonqclhYKZROZPY
14
- lXAIOFAIDRlrnoMat1Rn7c4hLVEWeROSHERU3rkr2BORYTThTZlmv80ymkPughVJ
15
- 6+RxGqO7V9EwFMucdN1R2hWnryN4+sxjJzf4bfCabt+wNnWAkgzQM+v7CeTLZnqU
16
- cbvlGJ5XwuIUWl07cXk0c1k0CQKBgQDFWJ/1SckC+7MgruGyicvIPcPu2Cf/55D4
17
- swenPDitACeJkecdrCRsGisDk7DLc5qZTh1PWtD5UVl+9GCv4uXDYAmOqakPocZp
18
- pCHWJGOBBEYHpwuMlXfWoUqfpZFVhohcWfVt/8EzDgEwoXx2QkPNj4HAPw4U99zA
19
- ptn1ROnwjwKBgQCNULBNdn629mcw/vX5eiocALIIoORpGYAspR1ZCIkcwCPMnT75
20
- P/FqTGBaH95AOUy1KuIXaukCi0f6ZZtJ67Wh4iyTeyU2wmb4n4MklbPdouOhGEUU
21
- jTlaZ7XKQHYOsyke0JWP/wDpCUCKPKiDmo1PPNlSeXff80cNb9if6RVjsQKBgC1S
22
- ZDIGBwcLXSEVaLoDEWzkWnog5FbODKpBG3HZz75TecELZAOZhCfbfqNsqL6gxxGM
23
- MgkGd1W6zA3u+8GJH3FWPfuolS4E3jdmvWqbosp/e8HIKEvaC9Kb6jJt6Mm2gtyK
24
- wGXJxcn+3mEXxSi3oTC1U3wePxKrteP8rbO5ZuybAoGAG1iwMSSn9RgCHTetHy8c
25
- Drk+fz4LpOXrMODi5TKI6DIuA0fpHElrMPoqeZEECinSfqWsWtN/uAlmI2LKq0E6
26
- pqkklLaydD5M0netB1ldg++8M1KKnKaeU1A/TDCfgmpAHSNYjd94A6EcpFSfru7Z
27
- ofQVXV5mpAaM0R//PxI6w9E=
28
- -----END PRIVATE KEY-----
@@ -1,21 +0,0 @@
1
- -----BEGIN CERTIFICATE-----
2
- MIIDXTCCAkWgAwIBAgIUeqo3k/yGCOxONYa7gcKwKCNW6rYwDQYJKoZIhvcNAQEL
3
- BQAwVzELMAkGA1UEBhMCVVMxDjAMBgNVBAgMBVN0YXRlMQ0wCwYDVQQHDARDaXR5
4
- MRUwEwYDVQQKDAxPcmdhbml6YXRpb24xEjAQBgNVBAMMCWxvY2FsaG9zdDAeFw0y
5
- NTAyMDUwODQwMTBaFw0yNjAyMDUwODQwMTBaMFcxCzAJBgNVBAYTAlVTMQ4wDAYD
6
- VQQIDAVTdGF0ZTENMAsGA1UEBwwEQ2l0eTEVMBMGA1UECgwMT3JnYW5pemF0aW9u
7
- MRIwEAYDVQQDDAlsb2NhbGhvc3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
8
- AoIBAQDM5k5dg2gFfbPh0Ku5HYQ72CHHeW0HZl92qb5BvZZVtREW4HFYFmIvnvpv
9
- CSuiKkn7t5QWyyHub3cuO3LHXM2pecSvgmAhnXbAEnUK49YTsvmGEyNzt14hgFFC
10
- begBARWjLwhjP4NKulAZgINLc/oYfW+nDhupUZDxvBonVPh3szyC7HlUomAEpPQz
11
- CaUueSfjbMWxlMipKsLkhwDAxHjNSAiSMti+PiTu//PbOGnOUXxRqqACnJOleg1k
12
- mKxwXmDQNOqNSZ3xfHnuxH1T5pAwbP5JjkrnJHqfmvlAJO8TQ2v6m0hTwslS7ULm
13
- rB88hXRjXmmuzMNGh8Wsx35QYqv5AgMBAAGjITAfMB0GA1UdDgQWBBRWKpGNrzjp
14
- AUOqQi2zGiRcmD+gfTANBgkqhkiG9w0BAQsFAAOCAQEAqGIcV/S8y5j0mCi3apmo
15
- xQpFswTeATmBbVuHkrj3Q+ghaxQ6QGa6o/V7oSGblhTagvRr8RGj8fWRoutQgUzP
16
- jh5wuDfjJh7lB2hAdi9L2dE+2K8/Y9r7U+UIFJIw0jIdEpx+X9egbhxBwy+pEo3Y
17
- D1oqQaOuLXyw3A5i4eow/kP1lOioU1MsNp3eVu4vr4MWTXjSdqs8XiUqRds1PlW7
18
- AhFrjqxJfb0V3mt/Mnx0JaPpMqtLlBQLmbNGKJUPjk4IVkqtEjg85iDa4FZ4YLhh
19
- lSgVizhxxrJAULTubDzaR/WRYEO82z5ramszt6pWJ926qXBbca/kI2detTRaaXKE
20
- kg==
21
- -----END CERTIFICATE-----
@@ -1,28 +0,0 @@
1
- -----BEGIN PRIVATE KEY-----
2
- MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDM5k5dg2gFfbPh
3
- 0Ku5HYQ72CHHeW0HZl92qb5BvZZVtREW4HFYFmIvnvpvCSuiKkn7t5QWyyHub3cu
4
- O3LHXM2pecSvgmAhnXbAEnUK49YTsvmGEyNzt14hgFFCbegBARWjLwhjP4NKulAZ
5
- gINLc/oYfW+nDhupUZDxvBonVPh3szyC7HlUomAEpPQzCaUueSfjbMWxlMipKsLk
6
- hwDAxHjNSAiSMti+PiTu//PbOGnOUXxRqqACnJOleg1kmKxwXmDQNOqNSZ3xfHnu
7
- xH1T5pAwbP5JjkrnJHqfmvlAJO8TQ2v6m0hTwslS7ULmrB88hXRjXmmuzMNGh8Ws
8
- x35QYqv5AgMBAAECggEAClkuXN2Jt89HB2Zd1JICT0XFl6NmZ4YwLO16k6uS0mjR
9
- lbgdBAUmDSrTEfUNXFm/lfmJ/pMLTMAZ7ZPojTDpcoADzZZrgFR0KSlgJROSiLj/
10
- DlpcmG1K0S0qeCJWDOjvB2hqch1ve4BzPQUnJxIoL9ZJTjoG7nNVZfQUARJdoH6Y
11
- dbw3wm+BQ3ze+cuuaoiginTP1XionmV8ENOQQcBEezD0v/XyYFs9nbd88MqkMAeM
12
- L+DWvlW6UzsOK2zJGyHr6V+I3jjJ0dnMslu/IeiAsbO+SlTlvs1y+TtbeTAFwanN
13
- QvDB3cBZLjZ/QuCgdy7GEE7urU6ei+ZkwngS4uP1FQKBgQD3+zrYS15Xs1CFf7Jn
14
- mQvHWQpmVfsOHu1GxHx/9GFVtVLsolaEWaMElvuA9MF1hoBccz6JhT/qKmgGu1uB
15
- LLZS5nJVQxZTSgKmnvaJ+tfmOYEYjQc6surIFx+OrcejIMHicY5qHCfsKbrJ4Bz2
16
- TQVn5DFz30q6haCNS0Vl3GJCJQKBgQDThnL2RqmP/CN7vUYRHS5I82o+2gnA51c1
17
- /UcxHesLKLUHPbyUdh179dW4phU4OfD8cDz58WlSMg+kfPad2SwBTyRb1GabD6k4
18
- aBaW7hFvFX8LLyRwKkjcchdlPpUkk/tDG7/yGagOZERsw3WrB2THdH8A1tobe2VA
19
- creR/pf4RQKBgQCXtoUu1RV39EV8Fz7vsKuLH4eESnAZGISz+fvtUHbIN/HuwfbK
20
- bAiXA0QFhjhhjZM0fHEzM2mB+sW/8Jov8kntd/1U+oFLHYl3pONSUTwLJv07JvTY
21
- TaPkHHl7EgiEXcMgpbaqZmVqT7FuVoWBjmeTQwGaUW7npF8wcm+XvPgEXQKBgQDP
22
- usUh2SlijuKl/a5W1kqDOBHKIcTcXhUGn3MP6GrQ7axCrT2KqyiveTDngqtqKXTh
23
- 5LPtXkjpgOJdzp8/S2zs6DUzvbb6ZvnvvEEa/je+2OSILkbhpJUjcSRKuJgtcOqb
24
- 8B+j+dBSOeP80EO5r6woON8VCurtfFRmY4Kl7Np/5QKBgQDz02TVdu/umziELuTI
25
- fDwEN4MSVhNEXAFye8sr+ed288tcf87fMYIrOkaku6CEmkkyqFQjwaZIGugox8gW
26
- uIXFdP9vU3qkzkfV8z8W/3z1H51N5jU/u9SX/zVt+SBmxOj3M/UB46eHJap/2L24
27
- jgRr09TIWnnC3NCOKkzpbCRB7g==
28
- -----END PRIVATE KEY-----