@azure-net/kit 5.1.0 → 5.2.0
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/dist/delivery/schema/Schema.d.ts +3 -1
- package/dist/delivery/schema/Schema.js +3 -0
- package/dist/delivery/schema/rules/Rules.d.ts +40 -6
- package/dist/delivery/schema/rules/Rules.js +174 -22
- package/dist/delivery/schema/rules/messages/En.js +28 -3
- package/dist/delivery/schema/rules/messages/Ru.js +28 -3
- package/dist/delivery/schema/rules/messages/Types.d.ts +28 -3
- package/dist/delivery/schema/rules/messages/WithI18n.js +28 -3
- package/dist/infra/datasource/BaseDatasource.js +2 -4
- package/dist/infra/query/QueryBuilder.js +37 -17
- package/dist/infra/response/BaseResponse.js +1 -1
- package/dist/plugin/AzureNetPlugin.js +52 -11
- package/dist/shared/app/App.d.ts +25 -2
- package/dist/shared/app/App.js +42 -1
- package/dist/shared/app/index.d.ts +1 -1
- package/dist/shared/background-task/BackgroundTask.d.ts +16 -0
- package/dist/shared/background-task/BackgroundTask.js +34 -0
- package/dist/shared/background-task/index.d.ts +1 -0
- package/dist/shared/background-task/index.js +1 -0
- package/dist/shared/boundary-provider/Provider.d.ts +1 -1
- package/dist/shared/boundary-provider/Provider.js +12 -8
- package/dist/shared/class-mirror/ClassMirror.js +0 -6
- package/dist/shared/cookie/UniversalCookie.d.ts +2 -0
- package/dist/shared/cookie/UniversalCookie.js +45 -30
- package/dist/shared/index.d.ts +2 -1
- package/dist/shared/index.js +2 -1
- package/dist/shared/logger/index.d.ts +2 -1
- package/dist/shared/logger/index.js +15 -10
- package/dist/svelte/active-form/ActiveForm.svelte.js +10 -9
- package/dist/svelte/query/Query.svelte.js +7 -7
- package/dist/svelte/shared/cloneStateValue.d.ts +2 -0
- package/dist/svelte/shared/cloneStateValue.js +100 -0
- package/package.json +7 -7
|
@@ -20,10 +20,28 @@ const findStaticImportInsertPosition = (sourceCode) => {
|
|
|
20
20
|
};
|
|
21
21
|
const createVirtualServerHooks = (silentChromeDevtools) => `// ${GENERATED_MARKER}
|
|
22
22
|
import { edgesHandle, edgesHandleRaw } from '${VIRTUAL_SERVER_UTILS_ID}';
|
|
23
|
+
import { RequestContext } from '@azure-net/kit/server-context';
|
|
23
24
|
|
|
24
25
|
const getRegister = async () => (await import('${VIRTUAL_PROGRAM_ID}')).register;
|
|
25
26
|
|
|
27
|
+
const withRequestContext = (event, callback) => {
|
|
28
|
+
try {
|
|
29
|
+
RequestContext.current();
|
|
30
|
+
} catch {
|
|
31
|
+
return edgesHandleRaw(event, callback);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
return callback();
|
|
35
|
+
};
|
|
36
|
+
|
|
26
37
|
export const init = async () => (await getRegister()).serverInit();
|
|
38
|
+
export const handleFetch = (input) => withRequestContext(input.event, async () => (await getRegister()).serverFetch(input));
|
|
39
|
+
export const handleValidationError = (input) => withRequestContext(
|
|
40
|
+
input.event,
|
|
41
|
+
async () => (await getRegister()).serverValidationError(input)
|
|
42
|
+
);
|
|
43
|
+
export const reroute = async (input) => (await getRegister()).reroute(input);
|
|
44
|
+
export const getTransport = async () => (await getRegister()).transport;
|
|
27
45
|
|
|
28
46
|
export const handle = edgesHandle(async ({ serialize, edgesEvent, resolve }) => {
|
|
29
47
|
const register = await getRegister();
|
|
@@ -59,8 +77,26 @@ const createVirtualServerUtils = () => "export { edgesHandle, edgesHandleRaw } f
|
|
|
59
77
|
const createVirtualClientHooks = () => `// ${GENERATED_MARKER}
|
|
60
78
|
const getRegister = async () => (await import('${VIRTUAL_PROGRAM_ID}')).register;
|
|
61
79
|
|
|
62
|
-
export const
|
|
80
|
+
export const transport = {};
|
|
81
|
+
|
|
82
|
+
const createCodecView = (method) => new Proxy({}, {
|
|
83
|
+
get: (_, key) => transport[key]?.[method],
|
|
84
|
+
ownKeys: () => Reflect.ownKeys(transport),
|
|
85
|
+
getOwnPropertyDescriptor: (_, key) => key in transport
|
|
86
|
+
? { configurable: true, enumerable: true, value: transport[key][method] }
|
|
87
|
+
: undefined
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
export const decoders = createCodecView('decode');
|
|
91
|
+
export const encoders = createCodecView('encode');
|
|
92
|
+
|
|
93
|
+
export const init = async () => {
|
|
94
|
+
const register = await getRegister();
|
|
95
|
+
Object.assign(transport, register.transport);
|
|
96
|
+
return register.clientInit();
|
|
97
|
+
};
|
|
63
98
|
export const handleError = async (input) => (await getRegister()).clientError(input);
|
|
99
|
+
export const reroute = async (input) => (await getRegister()).reroute(input);
|
|
64
100
|
`;
|
|
65
101
|
const createVirtualProgram = (root) => {
|
|
66
102
|
const tsProgram = path.join(root, 'src', 'program.ts');
|
|
@@ -90,7 +126,8 @@ const hasUserHook = (root, hookName) => {
|
|
|
90
126
|
const assertNoUserHooks = (root) => {
|
|
91
127
|
const serverHook = hasUserHook(root, 'hooks.server');
|
|
92
128
|
const clientHook = hasUserHook(root, 'hooks.client');
|
|
93
|
-
const
|
|
129
|
+
const universalHook = hasUserHook(root, 'hooks');
|
|
130
|
+
const hook = serverHook ?? clientHook ?? universalHook;
|
|
94
131
|
if (!hook)
|
|
95
132
|
return;
|
|
96
133
|
throw new Error(`[AzureNetPlugin] ${path.relative(root, hook)} is not allowed when AzureNetPlugin is enabled. ` +
|
|
@@ -112,21 +149,16 @@ const transformGeneratedServerInternal = (sourceCode) => {
|
|
|
112
149
|
if (!getHooksPattern.test(sourceCode)) {
|
|
113
150
|
throw new Error('[AzureNetPlugin] Unsupported SvelteKit generated server internals: get_hooks() was not found.');
|
|
114
151
|
}
|
|
115
|
-
const universalImportMatch = sourceCode.match(/\(\{\s*reroute,\s*transport\s*\}\s*=\s*await\s*import\([^)]+\)\);/);
|
|
116
|
-
const universalImport = universalImportMatch?.[0] ? `\n\t${universalImportMatch[0]}` : '';
|
|
117
152
|
const importLine = `import * as __azureNetServerHooks from '${VIRTUAL_SERVER_HOOKS_ID}';`;
|
|
118
153
|
const getHooksReplacement = `export async function get_hooks() {
|
|
119
|
-
\tlet reroute;
|
|
120
|
-
\tlet transport;${universalImport}
|
|
121
|
-
|
|
122
154
|
\treturn {
|
|
123
155
|
\t\thandle: __azureNetServerHooks.handle,
|
|
124
|
-
\t\thandleFetch:
|
|
156
|
+
\t\thandleFetch: __azureNetServerHooks.handleFetch,
|
|
125
157
|
\t\thandleError: __azureNetServerHooks.handleError,
|
|
126
|
-
\t\thandleValidationError:
|
|
158
|
+
\t\thandleValidationError: __azureNetServerHooks.handleValidationError,
|
|
127
159
|
\t\tinit: __azureNetServerHooks.init,
|
|
128
|
-
\t\treroute,
|
|
129
|
-
\t\ttransport
|
|
160
|
+
\t\treroute: __azureNetServerHooks.reroute,
|
|
161
|
+
\t\ttransport: await __azureNetServerHooks.getTransport()
|
|
130
162
|
\t};
|
|
131
163
|
}`;
|
|
132
164
|
const transformed = ensureVirtualImport(sourceCode, `// ${GENERATED_MARKER}\n${importLine}`).replace(getHooksPattern, getHooksReplacement);
|
|
@@ -142,6 +174,11 @@ const transformGeneratedClientApp = (sourceCode) => {
|
|
|
142
174
|
if (!handleErrorPattern.test(sourceCode)) {
|
|
143
175
|
throw new Error('[AzureNetPlugin] Unsupported SvelteKit generated client app: default handleError was not found.');
|
|
144
176
|
}
|
|
177
|
+
const decodersPattern = /export const decoders = Object\.fromEntries\(Object\.entries\(hooks\.transport\)\.map\(\(\[k, v\]\) => \[k, v\.decode\]\)\);/;
|
|
178
|
+
const encodersPattern = /export const encoders = Object\.fromEntries\(Object\.entries\(hooks\.transport\)\.map\(\(\[k, v\]\) => \[k, v\.encode\]\)\);/;
|
|
179
|
+
if (!decodersPattern.test(sourceCode) || !encodersPattern.test(sourceCode)) {
|
|
180
|
+
throw new Error('[AzureNetPlugin] Unsupported SvelteKit generated client app: transport codecs were not found.');
|
|
181
|
+
}
|
|
145
182
|
let transformed = ensureVirtualImport(sourceCode, `// ${GENERATED_MARKER}\nimport * as __azureNetClientHooks from '${VIRTUAL_CLIENT_HOOKS_ID}';`);
|
|
146
183
|
transformed = transformed.replace(handleErrorPattern, 'handleError: __azureNetClientHooks.handleError');
|
|
147
184
|
if (/^\s*init:\s*[^,\n]+,?/m.test(transformed)) {
|
|
@@ -150,6 +187,10 @@ const transformGeneratedClientApp = (sourceCode) => {
|
|
|
150
187
|
else {
|
|
151
188
|
transformed = transformed.replace(/handleError:\s*__azureNetClientHooks\.handleError,?/m, 'handleError: __azureNetClientHooks.handleError,\n\tinit: __azureNetClientHooks.init,');
|
|
152
189
|
}
|
|
190
|
+
transformed = transformed.replace(/^\s*reroute:\s*[^,\n]+,?/m, '\treroute: __azureNetClientHooks.reroute,');
|
|
191
|
+
transformed = transformed.replace(/^\s*transport:\s*[^,\n]+,?/m, '\ttransport: __azureNetClientHooks.transport');
|
|
192
|
+
transformed = transformed.replace(decodersPattern, 'export const decoders = __azureNetClientHooks.decoders;');
|
|
193
|
+
transformed = transformed.replace(encodersPattern, 'export const encoders = __azureNetClientHooks.encoders;');
|
|
153
194
|
return transformed;
|
|
154
195
|
};
|
|
155
196
|
export const AzureNetPlugin = (options) => {
|
package/dist/shared/app/App.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type ContextData } from '../../external/edges/ServerContext.js';
|
|
2
2
|
import { type IServerMiddleware } from './middleware/ServerMiddleware.js';
|
|
3
|
-
import type { Handle, HandleClientError, HandleServerError, RequestEvent, ServerInit } from '@sveltejs/kit';
|
|
3
|
+
import type { Handle, HandleClientError, HandleFetch, HandleServerError, HandleValidationError, RequestEvent, Reroute, ServerInit, Transport } from '@sveltejs/kit';
|
|
4
4
|
import { type IClientMiddleware } from './middleware/ClientMiddleware.js';
|
|
5
5
|
import { useLogger } from '../logger/index.js';
|
|
6
6
|
type MaybePromise<T> = T | Promise<T>;
|
|
@@ -11,7 +11,7 @@ type AppDependencyFactories<TApp> = Record<string, AppDependencyFactory<TApp>>;
|
|
|
11
11
|
type ResolvedDependencies<T> = {
|
|
12
12
|
[K in keyof T]: T[K] extends (...args: never[]) => infer TReturn ? TReturn : never;
|
|
13
13
|
};
|
|
14
|
-
type BuilderFlags = Partial<Record<'use' | 'useClient' | 'useClientInit' | 'useClientError' | 'useServerInit' | 'useServer' | 'useServerError', true>>;
|
|
14
|
+
type BuilderFlags = Partial<Record<'use' | 'useClient' | 'useClientInit' | 'useClientError' | 'useServerInit' | 'useServer' | 'useServerError' | 'useServerFetch' | 'useServerValidationError' | 'useReroute' | 'useTransport', true>>;
|
|
15
15
|
type WithFlag<TFlags extends BuilderFlags, TKey extends keyof BuilderFlags> = TFlags & Record<TKey, true>;
|
|
16
16
|
type BuilderDependencies<TBuilder> = TBuilder extends {
|
|
17
17
|
readonly __types__?: infer TDependencies;
|
|
@@ -55,6 +55,14 @@ export interface AppServerErrorContext<TDependencies extends Record<string, unkn
|
|
|
55
55
|
message: string;
|
|
56
56
|
useLogger: typeof useLogger;
|
|
57
57
|
}
|
|
58
|
+
export type AppServerFetchContext<TDependencies extends Record<string, unknown>> = Parameters<HandleFetch>[0] & {
|
|
59
|
+
Container: AppContainer<TDependencies>;
|
|
60
|
+
requestContext: ContextData;
|
|
61
|
+
};
|
|
62
|
+
export type AppServerValidationErrorContext<TDependencies extends Record<string, unknown>> = Parameters<HandleValidationError>[0] & {
|
|
63
|
+
Container: AppContainer<TDependencies>;
|
|
64
|
+
requestContext: ContextData;
|
|
65
|
+
};
|
|
58
66
|
export type AppUniversalLifecycleCallback<TDependencies extends Record<string, unknown>> = (context: AppUniversalLifecycleContext<TDependencies>) => MaybePromise<void>;
|
|
59
67
|
export type AppClientLifecycleCallback<TDependencies extends Record<string, unknown>> = (context: AppClientLifecycleContext<TDependencies>) => MaybePromise<void>;
|
|
60
68
|
export type AppClientInitLifecycleCallback<TDependencies extends Record<string, unknown>> = (context: AppClientInitLifecycleContext<TDependencies>) => MaybePromise<void>;
|
|
@@ -62,6 +70,9 @@ export type AppClientErrorCallback<TDependencies extends Record<string, unknown>
|
|
|
62
70
|
export type AppServerInitLifecycleCallback = ServerInit;
|
|
63
71
|
export type AppServerLifecycleCallback<TDependencies extends Record<string, unknown>> = (context: AppServerLifecycleContext<TDependencies>) => MaybePromise<Response | void>;
|
|
64
72
|
export type AppServerErrorCallback<TDependencies extends Record<string, unknown>> = (context: AppServerErrorContext<TDependencies>) => ReturnType<HandleServerError>;
|
|
73
|
+
export type AppServerFetchCallback<TDependencies extends Record<string, unknown>> = (context: AppServerFetchContext<TDependencies>) => ReturnType<HandleFetch>;
|
|
74
|
+
export type AppServerValidationErrorCallback<TDependencies extends Record<string, unknown>> = (context: AppServerValidationErrorContext<TDependencies>) => ReturnType<HandleValidationError>;
|
|
75
|
+
export type AppRerouteCallback = Reroute;
|
|
65
76
|
export type CreateAppBuilder<TDependencies extends Record<string, unknown>, TFlags extends BuilderFlags = object> = {
|
|
66
77
|
readonly __types__?: TDependencies;
|
|
67
78
|
dependencies<TNext extends AppDependencyFactories<AppContainer<TDependencies>>>(dependencies: TNext): CreateAppBuilder<TDependencies & ResolvedDependencies<TNext>, TFlags>;
|
|
@@ -79,6 +90,14 @@ export type CreateAppBuilder<TDependencies extends Record<string, unknown>, TFla
|
|
|
79
90
|
useServer(callback: AppServerLifecycleCallback<TDependencies>): CreateAppBuilder<TDependencies, WithFlag<TFlags, 'useServer'>>;
|
|
80
91
|
}> & OnceMethod<TFlags, 'useServerError', {
|
|
81
92
|
useServerError(callback: AppServerErrorCallback<TDependencies>): CreateAppBuilder<TDependencies, WithFlag<TFlags, 'useServerError'>>;
|
|
93
|
+
}> & OnceMethod<TFlags, 'useServerFetch', {
|
|
94
|
+
useServerFetch(callback: AppServerFetchCallback<TDependencies>): CreateAppBuilder<TDependencies, WithFlag<TFlags, 'useServerFetch'>>;
|
|
95
|
+
}> & OnceMethod<TFlags, 'useServerValidationError', {
|
|
96
|
+
useServerValidationError(callback: AppServerValidationErrorCallback<TDependencies>): CreateAppBuilder<TDependencies, WithFlag<TFlags, 'useServerValidationError'>>;
|
|
97
|
+
}> & OnceMethod<TFlags, 'useReroute', {
|
|
98
|
+
useReroute(callback: AppRerouteCallback): CreateAppBuilder<TDependencies, WithFlag<TFlags, 'useReroute'>>;
|
|
99
|
+
}> & OnceMethod<TFlags, 'useTransport', {
|
|
100
|
+
useTransport(transport: Transport): CreateAppBuilder<TDependencies, WithFlag<TFlags, 'useTransport'>>;
|
|
82
101
|
}>;
|
|
83
102
|
export interface AppRegistrar {
|
|
84
103
|
(): MaybePromise<void>;
|
|
@@ -86,7 +105,11 @@ export interface AppRegistrar {
|
|
|
86
105
|
clientError: HandleClientError;
|
|
87
106
|
serverInit: ServerInit;
|
|
88
107
|
serverError: HandleServerError;
|
|
108
|
+
serverFetch: HandleFetch;
|
|
109
|
+
serverValidationError: HandleValidationError;
|
|
89
110
|
handle: Handle;
|
|
111
|
+
reroute: Reroute;
|
|
112
|
+
transport: Transport;
|
|
90
113
|
}
|
|
91
114
|
export interface CreateAppInstance<TDependencies extends Record<string, unknown>> {
|
|
92
115
|
Container: AppContainer<TDependencies>;
|
package/dist/shared/app/App.js
CHANGED
|
@@ -79,6 +79,22 @@ const createBuilder = (dependencies, callbacks) => {
|
|
|
79
79
|
setCallback(callbacks, 'useServerError', callback);
|
|
80
80
|
return builder;
|
|
81
81
|
},
|
|
82
|
+
useServerFetch(callback) {
|
|
83
|
+
setCallback(callbacks, 'useServerFetch', callback);
|
|
84
|
+
return builder;
|
|
85
|
+
},
|
|
86
|
+
useServerValidationError(callback) {
|
|
87
|
+
setCallback(callbacks, 'useServerValidationError', callback);
|
|
88
|
+
return builder;
|
|
89
|
+
},
|
|
90
|
+
useReroute(callback) {
|
|
91
|
+
setCallback(callbacks, 'useReroute', callback);
|
|
92
|
+
return builder;
|
|
93
|
+
},
|
|
94
|
+
useTransport(transport) {
|
|
95
|
+
setCallback(callbacks, 'useTransport', transport);
|
|
96
|
+
return builder;
|
|
97
|
+
},
|
|
82
98
|
dependencies(nextDependencies) {
|
|
83
99
|
for (const [key, factory] of Object.entries(nextDependencies)) {
|
|
84
100
|
dependencies.set(key, factory);
|
|
@@ -195,6 +211,27 @@ export const createApp = (callback, name = DEFAULT_APP_NAME) => {
|
|
|
195
211
|
message
|
|
196
212
|
});
|
|
197
213
|
};
|
|
214
|
+
const runServerFetch = (input) => {
|
|
215
|
+
if (!callbacks.useServerFetch)
|
|
216
|
+
return input.fetch(input.request);
|
|
217
|
+
return callbacks.useServerFetch({
|
|
218
|
+
...input,
|
|
219
|
+
Container,
|
|
220
|
+
requestContext: getServerRequestContext()
|
|
221
|
+
});
|
|
222
|
+
};
|
|
223
|
+
const runServerValidationError = (input) => {
|
|
224
|
+
if (!callbacks.useServerValidationError) {
|
|
225
|
+
console.error('Remote function schema validation failed:', input.issues);
|
|
226
|
+
return { message: 'Bad Request' };
|
|
227
|
+
}
|
|
228
|
+
return callbacks.useServerValidationError({
|
|
229
|
+
...input,
|
|
230
|
+
Container,
|
|
231
|
+
requestContext: getServerRequestContext()
|
|
232
|
+
});
|
|
233
|
+
};
|
|
234
|
+
const reroute = (input) => callbacks.useReroute?.(input);
|
|
198
235
|
const handle = async ({ event, resolve }) => {
|
|
199
236
|
const requestContext = getServerRequestContext();
|
|
200
237
|
const flags = getLifecycleFlags(appKey, requestContext);
|
|
@@ -227,7 +264,11 @@ export const createApp = (callback, name = DEFAULT_APP_NAME) => {
|
|
|
227
264
|
clientError: runClientError,
|
|
228
265
|
serverInit: runServerInit,
|
|
229
266
|
serverError: runServerError,
|
|
230
|
-
|
|
267
|
+
serverFetch: runServerFetch,
|
|
268
|
+
serverValidationError: runServerValidationError,
|
|
269
|
+
handle,
|
|
270
|
+
reroute,
|
|
271
|
+
transport: callbacks.useTransport ?? {}
|
|
231
272
|
});
|
|
232
273
|
return {
|
|
233
274
|
Container,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { createApp, type AppClientErrorCallback, type AppClientErrorContext, type AppClientInitLifecycleCallback, type AppClientInitLifecycleContext, type AppClientLifecycleCallback, type AppClientLifecycleContext, type AppContainer, type AppRegistrar, type AppServerErrorCallback, type AppServerErrorContext, type AppServerInitLifecycleCallback, type AppServerInitLifecycleContext, type AppServerLifecycleCallback, type AppServerLifecycleContext, type AppUniversalLifecycleCallback, type AppUniversalLifecycleContext, type CreateAppInstance } from './App.js';
|
|
1
|
+
export { createApp, type AppClientErrorCallback, type AppClientErrorContext, type AppClientInitLifecycleCallback, type AppClientInitLifecycleContext, type AppClientLifecycleCallback, type AppClientLifecycleContext, type AppContainer, type AppRegistrar, type AppServerErrorCallback, type AppServerErrorContext, type AppServerFetchCallback, type AppServerFetchContext, type AppServerInitLifecycleCallback, type AppServerInitLifecycleContext, type AppServerLifecycleCallback, type AppServerLifecycleContext, type AppServerValidationErrorCallback, type AppServerValidationErrorContext, type AppRerouteCallback, type AppUniversalLifecycleCallback, type AppUniversalLifecycleContext, type CreateAppInstance } from './App.js';
|
|
2
2
|
export type { IClientMiddleware } from './middleware/ClientMiddleware.js';
|
|
3
3
|
export type { IServerMiddleware } from './middleware/ServerMiddleware.js';
|
|
4
4
|
export type { EnsureRoute, EnsureRouteSource, EnsureRouteTarget } from './middleware/Shared.js';
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
type MaybePromise<T> = T | PromiseLike<T>;
|
|
2
|
+
type WaitUntil = (promise: Promise<unknown>) => void;
|
|
3
|
+
type WaitUntilTarget = WaitUntil | {
|
|
4
|
+
waitUntil: WaitUntil;
|
|
5
|
+
};
|
|
6
|
+
export declare class BackgroundTask<T = void> implements Promise<T> {
|
|
7
|
+
#private;
|
|
8
|
+
readonly [Symbol.toStringTag] = "Promise";
|
|
9
|
+
private constructor();
|
|
10
|
+
static run<T = void>(task: () => MaybePromise<T>): BackgroundTask<T>;
|
|
11
|
+
waitUntil(target: WaitUntilTarget): this;
|
|
12
|
+
then<TResult1 = T, TResult2 = never>(onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null, onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null): Promise<TResult1 | TResult2>;
|
|
13
|
+
catch<TResult = never>(onrejected?: ((reason: unknown) => TResult | PromiseLike<TResult>) | null): Promise<T | TResult>;
|
|
14
|
+
finally(onfinally?: (() => void) | null): Promise<T>;
|
|
15
|
+
}
|
|
16
|
+
export {};
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export class BackgroundTask {
|
|
2
|
+
[Symbol.toStringTag] = 'Promise';
|
|
3
|
+
#promise;
|
|
4
|
+
constructor(task) {
|
|
5
|
+
try {
|
|
6
|
+
this.#promise = Promise.resolve(task());
|
|
7
|
+
}
|
|
8
|
+
catch (error) {
|
|
9
|
+
this.#promise = Promise.reject(error);
|
|
10
|
+
}
|
|
11
|
+
void this.#promise.catch(() => undefined);
|
|
12
|
+
}
|
|
13
|
+
static run(task) {
|
|
14
|
+
return new BackgroundTask(task);
|
|
15
|
+
}
|
|
16
|
+
waitUntil(target) {
|
|
17
|
+
if (typeof target === 'function') {
|
|
18
|
+
target(this.#promise);
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
target.waitUntil(this.#promise);
|
|
22
|
+
}
|
|
23
|
+
return this;
|
|
24
|
+
}
|
|
25
|
+
then(onfulfilled, onrejected) {
|
|
26
|
+
return this.#promise.then(onfulfilled, onrejected);
|
|
27
|
+
}
|
|
28
|
+
catch(onrejected) {
|
|
29
|
+
return this.#promise.catch(onrejected);
|
|
30
|
+
}
|
|
31
|
+
finally(onfinally) {
|
|
32
|
+
return this.#promise.finally(onfinally);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { BackgroundTask } from './BackgroundTask.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { BackgroundTask } from './BackgroundTask.js';
|
|
@@ -17,5 +17,5 @@ export interface ProviderSettings<T extends ServiceMap, D extends Record<string,
|
|
|
17
17
|
register: ProviderFactory<T, D>;
|
|
18
18
|
}
|
|
19
19
|
export declare const createBoundaryProvider: <T extends ServiceMap, D extends Record<string, ProviderWithType<ServiceMap>>>(name: string, settings: ProviderSettings<T, D>) => ProviderWithType<T>;
|
|
20
|
-
export declare function cleanupProvider(name: string): void
|
|
20
|
+
export declare function cleanupProvider(name: string): Promise<void>;
|
|
21
21
|
export {};
|
|
@@ -152,14 +152,17 @@ export const createBoundaryProvider = (name, settings) => {
|
|
|
152
152
|
};
|
|
153
153
|
return providerFn;
|
|
154
154
|
};
|
|
155
|
-
export function cleanupProvider(name) {
|
|
155
|
+
export async function cleanupProvider(name) {
|
|
156
156
|
const cleanupCache = async (cache) => {
|
|
157
157
|
const promises = [];
|
|
158
158
|
for (const [key, service] of cache.entries()) {
|
|
159
159
|
if (service && typeof service === 'object' && 'dispose' in service) {
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
promises.push(disposeResult.catch((err) => console.error(`Error disposing ${name}.${key}:`, err)));
|
|
160
|
+
try {
|
|
161
|
+
const disposeResult = service.dispose();
|
|
162
|
+
promises.push(Promise.resolve(disposeResult).catch((err) => console.error(`Error disposing ${name}.${key}:`, err)));
|
|
163
|
+
}
|
|
164
|
+
catch (err) {
|
|
165
|
+
console.error(`Error disposing ${name}.${key}:`, err);
|
|
163
166
|
}
|
|
164
167
|
}
|
|
165
168
|
}
|
|
@@ -168,18 +171,19 @@ export function cleanupProvider(name) {
|
|
|
168
171
|
};
|
|
169
172
|
if (BROWSER) {
|
|
170
173
|
const cache = clientCache.get(name);
|
|
171
|
-
|
|
172
|
-
void cleanupCache(cache);
|
|
173
|
-
}
|
|
174
|
+
clientCache.delete(name);
|
|
174
175
|
providerProxyCache.delete(name);
|
|
175
176
|
clientBootFlags.delete(name);
|
|
177
|
+
if (cache)
|
|
178
|
+
await cleanupCache(cache);
|
|
176
179
|
}
|
|
177
180
|
else {
|
|
178
181
|
const context = RequestContext.current();
|
|
179
182
|
const providers = context.data.providers;
|
|
180
183
|
if (providers?.has(name)) {
|
|
181
184
|
const cache = providers.get(name);
|
|
182
|
-
|
|
185
|
+
providers.delete(name);
|
|
186
|
+
await cleanupCache(cache);
|
|
183
187
|
}
|
|
184
188
|
}
|
|
185
189
|
}
|
|
@@ -26,12 +26,6 @@ export class ClassMirror {
|
|
|
26
26
|
},
|
|
27
27
|
has(proxyTarget, prop) {
|
|
28
28
|
return Reflect.has(proxyTarget, prop) || Reflect.has(proxyTarget[MIRROR_TARGET], prop);
|
|
29
|
-
},
|
|
30
|
-
ownKeys(proxyTarget) {
|
|
31
|
-
return [...new Set([...Reflect.ownKeys(proxyTarget), ...Reflect.ownKeys(proxyTarget[MIRROR_TARGET])])];
|
|
32
|
-
},
|
|
33
|
-
getOwnPropertyDescriptor(proxyTarget, prop) {
|
|
34
|
-
return Reflect.getOwnPropertyDescriptor(proxyTarget, prop) ?? Reflect.getOwnPropertyDescriptor(proxyTarget[MIRROR_TARGET], prop);
|
|
35
29
|
}
|
|
36
30
|
});
|
|
37
31
|
}
|
|
@@ -15,6 +15,8 @@ export type CookieOptions = {
|
|
|
15
15
|
* All methods are static and operate without creating instances.
|
|
16
16
|
*/
|
|
17
17
|
export declare class UniversalCookie {
|
|
18
|
+
private static serialize;
|
|
19
|
+
private static deserialize;
|
|
18
20
|
/**
|
|
19
21
|
* Sets a cookie with the specified key, value, and options.
|
|
20
22
|
* Serializes non-string values as JSON.
|
|
@@ -6,6 +6,36 @@ import { RequestContext } from '../../external/edges/ServerContext.js';
|
|
|
6
6
|
* All methods are static and operate without creating instances.
|
|
7
7
|
*/
|
|
8
8
|
export class UniversalCookie {
|
|
9
|
+
static serialize(value) {
|
|
10
|
+
if (typeof value === 'string')
|
|
11
|
+
return value;
|
|
12
|
+
const serialized = JSON.stringify(value);
|
|
13
|
+
if (serialized === undefined)
|
|
14
|
+
throw new TypeError('Cookie value is not JSON-serializable.');
|
|
15
|
+
return serialized;
|
|
16
|
+
}
|
|
17
|
+
static deserialize(value, decodeLegacy = false) {
|
|
18
|
+
try {
|
|
19
|
+
return JSON.parse(value);
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
if (!decodeLegacy)
|
|
23
|
+
return value;
|
|
24
|
+
}
|
|
25
|
+
let decodedValue;
|
|
26
|
+
try {
|
|
27
|
+
decodedValue = decodeURIComponent(value);
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return value;
|
|
31
|
+
}
|
|
32
|
+
try {
|
|
33
|
+
return JSON.parse(decodedValue);
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return decodedValue;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
9
39
|
/**
|
|
10
40
|
* Sets a cookie with the specified key, value, and options.
|
|
11
41
|
* Serializes non-string values as JSON.
|
|
@@ -17,21 +47,14 @@ export class UniversalCookie {
|
|
|
17
47
|
* @returns {void}
|
|
18
48
|
*/
|
|
19
49
|
static set(name, value, options) {
|
|
50
|
+
const serializedValue = this.serialize(value);
|
|
20
51
|
if (BROWSER) {
|
|
21
|
-
Cookies.set(name,
|
|
52
|
+
Cookies.set(name, serializedValue, options);
|
|
22
53
|
return;
|
|
23
54
|
}
|
|
24
55
|
else {
|
|
25
56
|
const event = RequestContext.current().event;
|
|
26
57
|
if (event) {
|
|
27
|
-
const encodedKey = encodeURIComponent(name);
|
|
28
|
-
let serializedValue;
|
|
29
|
-
if (typeof value === 'string') {
|
|
30
|
-
serializedValue = encodeURIComponent(value);
|
|
31
|
-
}
|
|
32
|
-
else {
|
|
33
|
-
serializedValue = encodeURIComponent(JSON.stringify(value));
|
|
34
|
-
}
|
|
35
58
|
let expires;
|
|
36
59
|
if (options?.expires !== undefined) {
|
|
37
60
|
if (typeof options.expires === 'number') {
|
|
@@ -43,7 +66,7 @@ export class UniversalCookie {
|
|
|
43
66
|
expires = options.expires;
|
|
44
67
|
}
|
|
45
68
|
}
|
|
46
|
-
event.cookies.set(
|
|
69
|
+
event.cookies.set(name, serializedValue, {
|
|
47
70
|
...options,
|
|
48
71
|
path: options?.path ?? '/',
|
|
49
72
|
httpOnly: options?.httpOnly ?? false,
|
|
@@ -64,22 +87,15 @@ export class UniversalCookie {
|
|
|
64
87
|
*/
|
|
65
88
|
static get(name) {
|
|
66
89
|
if (BROWSER) {
|
|
67
|
-
|
|
90
|
+
const value = Cookies.get(name, { parse: false });
|
|
91
|
+
return value === null ? undefined : this.deserialize(value);
|
|
68
92
|
}
|
|
69
93
|
else {
|
|
70
94
|
const event = RequestContext.current().event;
|
|
71
95
|
if (event) {
|
|
72
|
-
const
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
const decodedValue = decodeURIComponent(cookieValue);
|
|
76
|
-
try {
|
|
77
|
-
return JSON.parse(decodedValue);
|
|
78
|
-
}
|
|
79
|
-
catch {
|
|
80
|
-
return decodedValue;
|
|
81
|
-
}
|
|
82
|
-
}
|
|
96
|
+
const cookieValue = event.cookies.get(name) ?? event.cookies.get(encodeURIComponent(name));
|
|
97
|
+
if (cookieValue !== undefined)
|
|
98
|
+
return this.deserialize(cookieValue, true);
|
|
83
99
|
return undefined;
|
|
84
100
|
}
|
|
85
101
|
return undefined;
|
|
@@ -94,7 +110,8 @@ export class UniversalCookie {
|
|
|
94
110
|
*/
|
|
95
111
|
static getAll() {
|
|
96
112
|
if (BROWSER) {
|
|
97
|
-
|
|
113
|
+
const allCookies = Cookies.getAll({ parse: false });
|
|
114
|
+
return Object.fromEntries(Object.entries(allCookies).map(([name, value]) => [name, this.deserialize(String(value))]));
|
|
98
115
|
}
|
|
99
116
|
else {
|
|
100
117
|
const event = RequestContext.current().event;
|
|
@@ -102,12 +119,7 @@ export class UniversalCookie {
|
|
|
102
119
|
if (event) {
|
|
103
120
|
const allCookies = event.cookies.getAll();
|
|
104
121
|
for (const singleCookie of allCookies) {
|
|
105
|
-
|
|
106
|
-
result[singleCookie.name] = JSON.parse(singleCookie.value);
|
|
107
|
-
}
|
|
108
|
-
catch {
|
|
109
|
-
result[singleCookie.name] = singleCookie.value;
|
|
110
|
-
}
|
|
122
|
+
result[singleCookie.name] = this.deserialize(singleCookie.value, true);
|
|
111
123
|
}
|
|
112
124
|
}
|
|
113
125
|
return result;
|
|
@@ -154,7 +166,10 @@ export class UniversalCookie {
|
|
|
154
166
|
static toCredentials() {
|
|
155
167
|
const all = this.getAll() ?? {};
|
|
156
168
|
return Object.entries(all)
|
|
157
|
-
.map(([
|
|
169
|
+
.map(([key, value]) => {
|
|
170
|
+
const serialized = typeof value === 'string' ? value : JSON.stringify(value);
|
|
171
|
+
return `${encodeURIComponent(key)}=${encodeURIComponent(serialized)}`;
|
|
172
|
+
})
|
|
158
173
|
.join('; ');
|
|
159
174
|
}
|
|
160
175
|
}
|
package/dist/shared/index.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
export { UniversalCookie, type CookieOptions } from './cookie/index.js';
|
|
2
|
+
export { BackgroundTask } from './background-task/index.js';
|
|
2
3
|
export { AppEvents } from './event-bus/index.js';
|
|
3
4
|
export { ClassMirror } from './class-mirror/index.js';
|
|
4
5
|
export { createBoundaryProvider, cleanupProvider, type ProviderSettings } from './boundary-provider/index.js';
|
|
5
|
-
export
|
|
6
|
+
export * from './app/index.js';
|
|
6
7
|
export { useLogger, LoggerErrors, type ILoggerError, type ILoggerSettings } from './logger/index.js';
|
|
7
8
|
export { useRedirect, type IRedirectSettings, type RedirectStatus } from './redirect/index.js';
|
package/dist/shared/index.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
export { UniversalCookie } from './cookie/index.js';
|
|
2
|
+
export { BackgroundTask } from './background-task/index.js';
|
|
2
3
|
export { AppEvents } from './event-bus/index.js';
|
|
3
4
|
export { ClassMirror } from './class-mirror/index.js';
|
|
4
5
|
export { createBoundaryProvider, cleanupProvider } from './boundary-provider/index.js';
|
|
5
|
-
export
|
|
6
|
+
export * from './app/index.js';
|
|
6
7
|
export { useLogger, LoggerErrors } from './logger/index.js';
|
|
7
8
|
export { useRedirect } from './redirect/index.js';
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { AppError, type IAppError } from '../app-error/index.js';
|
|
2
|
+
import { BackgroundTask } from '../background-task/index.js';
|
|
2
3
|
export declare enum LoggerErrors {
|
|
3
4
|
AzureNetKitInternal = 0,
|
|
4
5
|
AzureNetAppError = 1,
|
|
@@ -20,4 +21,4 @@ export interface ILoggerSettings {
|
|
|
20
21
|
filterLog?: (error: ILoggerError) => boolean;
|
|
21
22
|
includeOnly?: LoggerErrors[];
|
|
22
23
|
}
|
|
23
|
-
export declare const useLogger: (error: unknown, settings: ILoggerSettings) => void
|
|
24
|
+
export declare const useLogger: (error: unknown, settings: ILoggerSettings) => BackgroundTask<void>;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { AppError, AzureNetKitInternalError } from '../app-error/index.js';
|
|
2
2
|
import { BROWSER } from '../../external/tools/index.js';
|
|
3
3
|
import { RequestContext } from '../../external/edges/ServerContext.js';
|
|
4
|
+
import { BackgroundTask } from '../background-task/index.js';
|
|
4
5
|
export var LoggerErrors;
|
|
5
6
|
(function (LoggerErrors) {
|
|
6
7
|
LoggerErrors[LoggerErrors["AzureNetKitInternal"] = 0] = "AzureNetKitInternal";
|
|
@@ -50,24 +51,28 @@ const getFetcher = () => {
|
|
|
50
51
|
export const useLogger = (error, settings) => {
|
|
51
52
|
const preparedError = prepareError(error);
|
|
52
53
|
if (settings.filterLog && settings.filterLog(preparedError)) {
|
|
53
|
-
return;
|
|
54
|
+
return BackgroundTask.run(() => undefined);
|
|
54
55
|
}
|
|
55
56
|
if (settings.includeOnly && !settings.includeOnly.includes(preparedError.type)) {
|
|
56
|
-
return;
|
|
57
|
+
return BackgroundTask.run(() => undefined);
|
|
57
58
|
}
|
|
58
59
|
const prefix = settings?.prefix ?? '[Logger]';
|
|
59
60
|
const errorMessage = prefix + preparedError.message + (settings?.joinToLog ? settings.joinToLog(preparedError) : '');
|
|
60
61
|
console.log(errorMessage);
|
|
61
|
-
if (settings.collector)
|
|
62
|
-
|
|
62
|
+
if (!settings.collector)
|
|
63
|
+
return BackgroundTask.run(() => undefined);
|
|
64
|
+
const { collector } = settings;
|
|
65
|
+
return BackgroundTask.run(async () => {
|
|
63
66
|
try {
|
|
64
|
-
|
|
65
|
-
settings.collector?.onError?.(err);
|
|
66
|
-
return;
|
|
67
|
-
});
|
|
67
|
+
await getFetcher()(collector.request(preparedError));
|
|
68
68
|
}
|
|
69
69
|
catch (err) {
|
|
70
|
-
|
|
70
|
+
try {
|
|
71
|
+
collector.onError?.(err);
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
71
76
|
}
|
|
72
|
-
}
|
|
77
|
+
});
|
|
73
78
|
};
|