Skip to content

Commit

Permalink
Merge pull request #117 from sima-land/38-examples-bun
Browse files Browse the repository at this point in the history
Шаг 70 #38
  • Loading branch information
krutoo committed Mar 12, 2024
2 parents 3065a97 + 782b8bb commit 2148d3b
Show file tree
Hide file tree
Showing 11 changed files with 175 additions and 157 deletions.
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);
}

0 comments on commit 2148d3b

Please sign in to comment.