40 lines
1.3 KiB
TypeScript
40 lines
1.3 KiB
TypeScript
import type { Interceptor } from '@connectrpc/connect';
|
|
import { createValidator } from '@bufbuild/protovalidate';
|
|
import { Code, ConnectError, createClient } from '@connectrpc/connect';
|
|
import { createConnectTransport } from '@connectrpc/connect-web';
|
|
import { goto } from '$app/navigation';
|
|
import { page } from '$app/state';
|
|
import { ItemService } from '$lib/connect/item/v1/item_pb';
|
|
import { AuthService } from '$lib/connect/user/v1/auth_pb';
|
|
import { UserService } from '$lib/connect/user/v1/user_pb';
|
|
|
|
const redirector: Interceptor = (next) => async (req) => {
|
|
try {
|
|
return await next(req);
|
|
} catch (e) {
|
|
const error = ConnectError.from(e);
|
|
if (error.code === Code.Unauthenticated) {
|
|
const redirectURL = new URL(page.url);
|
|
redirectURL.pathname = '/auth';
|
|
redirectURL.searchParams.append(
|
|
'redir',
|
|
encodeURIComponent(page.url.pathname + page.url.search)
|
|
);
|
|
|
|
await goto(redirectURL);
|
|
}
|
|
throw e;
|
|
}
|
|
};
|
|
|
|
const transport = createConnectTransport({
|
|
baseUrl: `${window.location.origin}/grpc`,
|
|
interceptors: [redirector]
|
|
});
|
|
|
|
export const AuthClient = createClient(AuthService, transport);
|
|
export const UserClient = createClient(UserService, transport);
|
|
export const ItemClient = createClient(ItemService, transport);
|
|
|
|
export const Validator = createValidator();
|