Advanced

μ„œλ²„μ—μ„œ React μƒνƒœ μ‚¬μš©ν•˜κΈ°

ν•¨μˆ˜μ—μ„œ React μƒνƒœ μ‚¬μš©ν•˜κΈ°

μš”μ²­μ΄ λ“€μ–΄μ˜¨ 경우 μ‹€ν–‰λ˜λŠ” ν•¨μˆ˜ λ‚΄μ—μ„œ, μ„œλ²„κ°€ μ‹€ν–‰λ˜κ³  μžˆλŠ” React λ‚΄λΆ€μ˜ μƒνƒœ 값을 μ‚¬μš©ν•˜κ³  싢은 κ²½μš°κ°€ μžˆμŠ΅λ‹ˆλ‹€. 그런 경우 useWrpServer의 λ‘λ²ˆμ§Έ 인자 값을 μ‚¬μš©ν•˜κ³ , ν•¨μˆ˜ λ‚΄μ—μ„œ res와 ν•¨κ»˜ getStateλ₯Ό μΈμžλ‘œλΆ€ν„° λ°›μ•„μ˜€μ„Έμš”.

const Server = () => {
  const [state, setState] = useState();
  useWrpServer(channel, { state }, [
    [
      methodDescriptors.getTextValue,
      ({ res, getState }) => {
        const { state } = getState();
        res.header({});
        res.send({ text: "hello" });
        res.end({});
      },
    ],
  ]);
};

getStateλŠ” μ‹€ν–‰λ˜λŠ” μ‹œμ μ˜ 값을 받아와 λ°˜ν™˜ν•΄μ€λ‹ˆλ‹€. ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ getState의 호좜 μ‹œκΈ°λ₯Ό μ‘°μ ˆν•˜λ©΄ μ§€μ†μ μœΌλ‘œ λ³€ν•˜λŠ” 값을 μ›ν•˜λŠ” μ‹œμ μ—μ„œ κ°€μ Έμ˜¬ 수 μžˆμŠ΅λ‹ˆλ‹€.

React μƒνƒœκ°€ λ³€ν•  λ•Œλ§ˆλ‹€ 응닡 보내기

Streaming rpc의 경우 React μƒνƒœ 값이 λ³€ν•  λ•Œλ§ˆλ‹€ 응닡을 보내고 싢은 κ²½μš°κ°€ μžˆμŠ΅λ‹ˆλ‹€. 이런 경우 ν•¨μˆ˜ λ‚΄μ—μ„œ stateChangesλ₯Ό μ‚¬μš©ν•˜μ„Έμš”.

const Server = () => {
  const [state, setState] = useState();
  useWrpServer(channel, { state }, [
    [
      methodDescriptors.getSliderValue,
      ({ req, res, stateChanges }) => {
        res.header({});
        const value = getState().state;
        const off = stateChanges.on("state", (value) => res.send({ value }));
        req.metadata?.on("cancel-response", teardown);
        req.metadata?.on("close", teardown);
        function teardown() {
          off();
          res.end({});
        }
      },
    ],
  ]);
};

μœ„μ˜ μ˜ˆμ œλŠ” μ—¬λŸ¬ 응닡을 보낼 수 μžˆλŠ” Server streaming rpcλ₯Ό κ΅¬ν˜„ν•œ κ²ƒμž…λ‹ˆλ‹€. stateκ°€ λ³€ν•  λ•Œλ§ˆλ‹€ 값을 보내며, close(연결이 λŠμ–΄μ§„ 경우), cancel-response(ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ 응닡을 그만 λ³΄λ‚΄λΌλŠ” 경우) μ΄λ²€νŠΈκ°€ 였면 μƒνƒœμ— λŒ€ν•œ ꡬ독을 μ€‘μ§€ν•˜κ³  응닡을 λ§ˆλ¬΄λ¦¬ν•©λ‹ˆλ‹€.