Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Шаг 70 #38 #117

Merged
merged 2 commits into from
Mar 12, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions src/preset/bun-handler/providers/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,13 @@ export const HandlerProviders = {
const abortController = resolve(KnownToken.Http.Fetch.abortController);
const context = resolve(KnownToken.Http.Handler.context);

// @todo https://github.com/sima-land/isomorph/issues/69
// const cookieStore = resolve(KnownToken.Http.Fetch.cookieStore);
// const forwardedSetCookie: string[] = [];
// const unsubscribeCookieStore = cookieStore.subscribe(setCookieList => {
// forwardedSetCookie.push(...setCookieList);
// });

const getAssets = typeof assetsInit === 'function' ? assetsInit : () => assetsInit;

const elementToString = (element: JSX.Element) => {
Expand Down Expand Up @@ -137,6 +144,16 @@ export const HandlerProviders = {
};

const enhancer = applyMiddleware(
// @todo https://github.com/sima-land/isomorph/issues/69
// async (request, next) => {
// const response = await next(request);
// for (const item of forwardedSetCookie) {
// response.headers.append('set-cookie', item);
// }
// unsubscribeCookieStore();
// return response;
// },

// ВАЖНО: прерываем исходящие в рамках обработчика http-запросы
async (request, next) => {
const response = await next(request);
Expand Down
21 changes: 3 additions & 18 deletions src/preset/node-handler/providers/cookie-store.ts
Original file line number Diff line number Diff line change
@@ -1,29 +1,14 @@
import { createCookieStore } from '../../../http';
import type { Resolve } from '../../../di';
import { CookieStore, createCookieStore } from '../../../http';
import { KnownToken } from '../../../tokens';

/**
* Провайдер хранилища cookie для исходящих запросов.
* @param resolve Функция для получения зависимости по токену.
* @return Хранилище cookie.
*/
export function provideCookieStore(resolve: Resolve) {
export function provideCookieStore(resolve: Resolve): CookieStore {
const context = resolve(KnownToken.ExpressHandler.context);

const store = createCookieStore(context.req.header('cookie'));

// @todo
// store.subscribe(setCookieList => {
// for (const setCookie of setCookieList) {
// const parsed = parseSetCookieHeader(setCookie);

// if (!parsed) {
// return;
// }

// context.res.cookie(parsed.name, parsed.value, parsed.attrs);
// }
// });

return store;
return createCookieStore(context.req.header('cookie'));
}
10 changes: 10 additions & 0 deletions src/preset/node-handler/providers/handler-main.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,16 @@ export function provideHandlerMain(resolve: Resolve): VoidFunction {
return result;
};

// @todo https://github.com/sima-land/isomorph/issues/69
// const cookieStore = resolve(KnownToken.Http.Fetch.cookieStore);
// cookieStore.subscribe(setCookieList => {
// for (const setCookie of setCookieList) {
// const parsed = parseSetCookieHeader(setCookie);

// parsed && res.cookie(parsed.name, parsed.value, parsed.attrs);
// }
// });

return async () => {
try {
const assets = await getAssets();
Expand Down
16 changes: 7 additions & 9 deletions src/preset/web/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,12 @@ import {
provideAxiosLogHandler,
provideReduxMiddlewareSaga,
} from '../isomorphic/providers';
import {
provideConfigSource,
provideLogger,
provideKnownHttpApiHosts,
provideFetchMiddleware,
provideAxiosMiddleware,
provideBridgeClientSide,
} from './providers';
import { provideConfigSource } from './providers/config-source';
import { provideLogger } from './providers/logger';
import { provideKnownHttpApiHosts } from './providers/known-http-api-hosts';
import { provideFetchMiddleware } from './providers/fetch-middleware';
import { provideAxiosMiddleware } from './providers/axios-middleware';
import { provideSsrBridgeClientSide } from './providers/ssr-bridge-client-side';

/**
* Возвращает preset с зависимостями для frontend-микросервисов в браузере.
Expand All @@ -33,7 +31,7 @@ export function PresetWeb(customize?: PresetTuner): Preset {
preset.set(KnownToken.Axios.factory, provideAxiosFactory);
preset.set(KnownToken.Axios.middleware, provideAxiosMiddleware);
preset.set(KnownToken.Axios.Middleware.Log.handler, provideAxiosLogHandler);
preset.set(KnownToken.SsrBridge.clientSide, provideBridgeClientSide);
preset.set(KnownToken.SsrBridge.clientSide, provideSsrBridgeClientSide);
preset.set(KnownToken.Http.Api.knownHosts, provideKnownHttpApiHosts);
preset.set(KnownToken.Http.fetch, provideFetch);
preset.set(KnownToken.Http.Fetch.middleware, provideFetchMiddleware);
Expand Down
15 changes: 15 additions & 0 deletions src/preset/web/providers/axios-middleware.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { Resolve } from '../../../di';
import { KnownToken } from '../../../tokens';
import { HttpStatus } from '../../isomorphic/utils/http-status';
import { logMiddleware } from '../../../utils/axios';

/**
* Провайдер фабрики http-клиентов.
* @param resolve Функция для получения зависимости по токену.
* @return Фабрика.
*/
export function provideAxiosMiddleware(resolve: Resolve) {
const logHandler = resolve(KnownToken.Axios.Middleware.Log.handler);

return [HttpStatus.axiosMiddleware(), logMiddleware(logHandler)];
}
14 changes: 14 additions & 0 deletions src/preset/web/providers/config-source.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { ConfigSource, createConfigSource } from '../../../config';

/**
* Провайдер источника конфигурации.
* @return Источник конфигурации.
*/
export function provideConfigSource(): ConfigSource {
// ВАЖНО: по умолчанию рассчитываем на process.env который предоставляется сборщиком (например webpack)
if (typeof process !== 'undefined' && process.env) {
return createConfigSource(process.env);
}

return createConfigSource({});
}
16 changes: 16 additions & 0 deletions src/preset/web/providers/fetch-middleware.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import { Resolve } from '../../../di';
import { KnownToken } from '../../../tokens';
import { FetchLogging } from '../../isomorphic/utils/fetch-logging';
import { log } from '../../../http';

/**
* Провайдер промежуточных слоев для fetch.
* @param resolve Функция для получения зависимости по токену.
* @return Фабрика.
*/
export function provideFetchMiddleware(resolve: Resolve) {
const logger = resolve(KnownToken.logger);

// ВАЖНО: если появятся еще промежуточные слои - не забыть разделить логирование на 2 части (ошибки и данные)
return [log(new FetchLogging(logger))];
}
130 changes: 0 additions & 130 deletions src/preset/web/providers/index.ts

This file was deleted.

24 changes: 24 additions & 0 deletions src/preset/web/providers/known-http-api-hosts.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import { Resolve } from '../../../di';
import { KnownToken } from '../../../tokens';
import { KnownHttpApiKey } from '../../isomorphic/types';
import { HttpApiHostPool } from '../../isomorphic/utils/http-api-host-pool';

/**
* Провайдер известных http-хостов.
* @param resolve Функция для получения зависимости по токену.
* @return Пул известных http-хостов.
*/
export function provideKnownHttpApiHosts(resolve: Resolve): HttpApiHostPool<KnownHttpApiKey> {
const source = resolve(KnownToken.Config.source);

return new HttpApiHostPool<KnownHttpApiKey>(
{
ilium: 'PUBLIC_API_URL_ILIUM',
simaV3: 'PUBLIC_API_URL_SIMALAND_V3',
simaV4: 'PUBLIC_API_URL_SIMALAND_V4',
simaV6: 'PUBLIC_API_URL_SIMALAND_V6',
chponkiV2: 'PUBLIC_API_URL_CHPONKI_V2',
},
source,
);
}
55 changes: 55 additions & 0 deletions src/preset/web/providers/logger.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
import {
BrowserClient,
Hub,
defaultIntegrations,
defaultStackParser,
makeFetchTransport,
} from '@sentry/browser';
import { Resolve } from '../../../di';
import { Logger, createLogger } from '../../../log';
import { KnownToken } from '../../../tokens';
import { createSentryHandler } from '../../../log/handler/sentry';

/**
* Провайдер Logger'а.
* @param resolve Функция для получения зависимости по токену.
* @return Logger.
*/
export function provideLogger(resolve: Resolve): Logger {
const source = resolve(KnownToken.Config.source);
const config = resolve(KnownToken.Config.base);

const client = new BrowserClient({
transport: makeFetchTransport,
stackParser: defaultStackParser,
dsn: source.require('PUBLIC_SENTRY_DSN'),
release: source.require('SENTRY_RELEASE'),
environment: source.require('PUBLIC_SENTRY_ENVIRONMENT'),
integrations: [...defaultIntegrations],
});

const hub = new Hub(client);

hub.setTag('url', window.location.href);

const logger = createLogger();

logger.subscribe(createSentryHandler(hub));

if (config.env === 'development') {
logger.subscribe(event => {
switch (event.type) {
case 'debug':
// eslint-disable-next-line no-console
console.debug(event.data);
break;
case 'error':
// eslint-disable-next-line no-console
console.error(event.data);
break;
}
});
}

return logger;
}
14 changes: 14 additions & 0 deletions src/preset/web/providers/ssr-bridge-client-side.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { Resolve } from '../../../di';
import { KnownToken } from '../../../tokens';
import { BridgeClientSide, SsrBridge } from '../../../utils/ssr';

/**
* Провайдер клиентской части "моста" для передачи данных между сервером и клиентом.
* @param resolve Функция для получения зависимости по токену.
* @return Клиентская часть "моста".
*/
export function provideSsrBridgeClientSide(resolve: Resolve): BridgeClientSide<unknown> {
const config = resolve(KnownToken.Config.base);

return SsrBridge.resolve(config.appName);
}
Loading