Orbito - Dokumentacja modułówOrbito - Dokumentacja modułów
Wprowadzenie
Pierwsze kroki
API
Komunikacja
Widoki
Wdrożenie
Społeczność
For AI agents
Wprowadzenie
Pierwsze kroki
API
Komunikacja
Widoki
Wdrożenie
Społeczność
For AI agents
  • Komunikacja między modułami

    • Komunikacja między modułami
    • Core.callModule – bezpośrednie wywołania
    • Hooki – komunikacja luźno powiązana

Core.callModule – bezpośrednie wywołania

Core.callModule pozwala wywołać metodę zarejestrowaną w dowolnym innym module zainstalowanym na tej samej instancji Orbito. Wywołanie przechodzi przez serwer Orbito, który przekazuje je do odpowiedniego kontenera i zwraca wynik.

Składnia

const result = await Core.callModule(moduleId, methodName, params)
ParametrTypOpis
moduleIdstringIdentyfikator modułu docelowego (np. 'core/orders')
methodNamestringNazwa metody zarejestrowanej przez Core.registerMethod
paramsobjectArgumenty przekazywane do metody

Porady

Metoda jest asynchroniczna i zawsze zwraca Promise. Używaj await.

Kontekst firmy

companyId nie jest przekazywane – platforma ustala je na podstawie tożsamości połączenia. Wywołanie zawsze trafia do modułu tej samej firmy. Szczegóły w Kontekst firmy.

Moduł zainstalowany kilka razy

Adresowanie po kodzie modułu jest jednoznaczne tylko wtedy, gdy firma ma jedną aktywną instalację modułu docelowego. Gdy ma ich więcej (np. trzy sklepy Prestashop), platforma odrzuca wywołanie błędem AMBIGUOUS_MODULE_TARGET – wtedy użyj Core.callInstanceMethod.

Core.callInstanceMethod

Wywołuje metodę konkretnej instalacji modułu, adresowanej po instanceId. To wariant callModule dla modułów instalowanych wielokrotnie.

const result = await Core.callInstanceMethod(targetInstanceId, methodName, params)
ParametrTypOpis
targetInstanceIdstringIdentyfikator instancji modułu docelowego
methodNamestringNazwa metody zarejestrowanej przez Core.registerMethod
paramsobjectArgumenty przekazywane do metody

Platforma sprawdza, że instancja docelowa należy do tej samej firmy – identyfikator instancji z innej firmy zostanie odrzucony takim samym komunikatem jak identyfikator nieistniejący.

Skąd wziąć instanceId:

  • z this.caller.instanceId / ctx.caller.instanceId, gdy odpowiadasz instancji, która sama Cię wywołała lub odpaliła hook,
  • z własnej konfiguracji modułu (użytkownik wybiera sklep na ekranie ustawień),
  • z Core.getInstanceId() po stronie modułu, który chce się „przedstawić" innemu modułowi.

Przykład – fallback z kodu modułu na instancję:

const { Core } = require('@orbito/api-lib');

async function syncOrders(shopInstanceId) {
  try {
    return await Core.callModule('core/prestashop', 'syncOrders', {});
  } catch (err) {
    if (err.code !== 'AMBIGUOUS_MODULE_TARGET') throw err;

    // Firma ma kilka sklepów – trzeba wskazać konkretny
    return await Core.callInstanceMethod(shopInstanceId, 'syncOrders', {});
  }
}

Przykład – odpowiedź do instancji, która nas wywołała:

Core.registerMethod('stock.reserve', async (params, ctx) => {
  const reservation = await reserve(params);

  if (ctx.caller) {
    // Odsyłamy potwierdzenie dokładnie do tego sklepu, który prosił o rezerwację
    await Core.callInstanceMethod(ctx.caller.instanceId, 'stock.reserved', {
      reservationId: reservation._id
    });
  }

  return reservation;
});

Przykłady

Pobranie szczegółów zamówienia

const { Core, Log } = require('@orbito/api-lib');

Core.registerMethod('invoice.generate', async (params, ctx) => {
  // Pobranie danych zamówienia z modułu core/orders
  const order = await Core.callModule(
    'core/orders',
    'order.get',
    { orderId: params.orderId }
  );

  Log.info('Pobrano zamówienie do faktury', { orderId: order._id });

  // ... generowanie faktury na podstawie order ...

  return { invoiceId: generatedId };
});

Łańcuch wywołań

Moduły mogą wywoływać siebie nawzajem, budując bardziej złożone przepływy:

Core.registerMethod('shipment.create', async (params, ctx) => {
  // 1. Pobierz zamówienie
  const order = await Core.callModule('core/orders', 'order.get', {
    orderId: params.orderId
  });

  // 2. Pobierz dane klienta
  const customer = await Core.callModule('core/customers', 'customer.get', {
    customerId: order.customerId
  });

  // 3. Utwórz przesyłkę
  const shipment = await createShipment(order, customer);

  return shipment;
});

Obsługa błędów

Core.callModule rzuci wyjątek w następujących sytuacjach:

  • moduł docelowy nie jest zainstalowany dla danej firmy,
  • firma ma kilka aktywnych instalacji modułu docelowego – błąd ma wtedy err.code === 'AMBIGUOUS_MODULE_TARGET', a wywołanie trzeba powtórzyć przez Core.callInstanceMethod,
  • metoda o podanej nazwie nie istnieje (nie została zarejestrowana),
  • handler metody w module docelowym rzucił wyjątek.

Core.callInstanceMethod rzuci wyjątek również wtedy, gdy wskazana instancja nie istnieje, jest wyłączona albo należy do innej firmy (komunikat jest w tych przypadkach identyczny – platforma nie zdradza istnienia cudzych instancji).

Zawsze opakuj wywołanie w try/catch:

Core.registerMethod('process', async (params, ctx) => {
  let order;

  try {
    order = await Core.callModule('core/orders', 'order.get', {
      orderId: params.orderId
    });
  } catch (err) {
    Log.error('Nie udało się pobrać zamówienia', {
      orderId: params.orderId,
      error: err.message
    });
    // Zwróć czytelny błąd zamiast pozwolić wyjątkowi propagować
    return { success: false, error: 'Zamówienie niedostępne' };
  }

  // ... dalsza logika ...
});

Cykliczne wywołania

Unikaj sytuacji, w której moduł A wywołuje moduł B, a moduł B wywołuje moduł A. Orbito nie chroni przed cyklami – spowodują one błąd przekroczenia czasu lub przepełnienie stosu.

Ostatnio zaktualizowano:: 29.07.2026, 09:25
Contributors: Wiktor Koźmiński
Prev
Komunikacja między modułami
Next
Hooki – komunikacja luźno powiązana