Upgrade to Pro — share decks privately, control downloads, hide ads and more …

RubyKaigi Hack Space in Tokyo & 函館最速 "予習" 会 / ...

RubyKaigi Hack Space in Tokyo & 函館最速 "予習" 会 / RubyKaigi Hack Space in Tokyo & The Fastest Briefing of RubyKaigi 2026 in Hakodate

RubyKaigi Hack Space in Tokyo & 函館最速 "予習" 会の資料です #rubykaigi2026_saisoku

Avatar for moznion

moznion

May 27, 2025
Tweet

More Decks by moznion

Other Decks in Programming

Transcript

  1.  Ͳ͜ʹ॓Λߏ͑Δ΂͖͔ɺͱ͍͏໰͍ ࠷଎༧शձ w ౬ͷ઒Թઘ w ࣮͸खࠒͳ஋ஈͷྑ͍Թઘ͕॓͋Γ·͢ w ձ৔͕ΊͬͪΌ͍ۙ w

    ޒྏֲपล w ҿΉͳΒجຊతʹ͜͜ʹདྷΔ͜ͱʹͳΔ w ޒྏֲެԂपลɺͰ͸ͳ͍͜ͱʹ஫ҙ جຊԿ΋ͳ͍Ͱ͢  w ޒྏֲӺपลɺͰ͸ͳ͍͜ͱʹ஫ҙ ͬͪ͜ͷํ͕Կ΋ͳ͍  w ձ৔͕͍ͦͦۙ͜͜ ࢢిͰʙ෼ఔ౓
  2.  4FSWFS4FOU&WFOUT 44& ؆қྫ ͕͜͜)5514FTTJPO < HTTP/1.1 200 OK <

    cache-control: no-cache, no-transform < content-type: text/event- stream < x-accel-buffering: no < Transfer-Encoding: chunkedd ࠷଎༧शձ
  3. class Another Mi ddleware ... end  3BDL.JEEMFXBSF͓͞Β͍ IUUQTEPDTQZMPOTQSPKFDUPSHQSPKFDUTQZMPOTXFCGSBNFXPSLFOMBUFTUDPODFQUTIUNMXTHJNJEEMFXBSF class

    Something Mi ddleware def initialize(app, options = {}) @app = app end def call(env) # Do something @app.call(env) end end ࠷଎༧शձ
  4. class Another Mi ddleware ... end  3BDL.JEEMFXBSF͓͞Β͍ IUUQTEPDTQZMPOTQSPKFDUPSHQSPKFDUTQZMPOTXFCGSBNFXPSLFOMBUFTUDPODFQUTIUNMXTHJNJEEMFXBSF class

    Something Mi ddleware def initialize(app, options = {}) @app = app end def call(env) # Do something @app.call(env) end end ͭ·Γ ͦ΅͘ʹ΍Δͱ SFRSFTͱಉظ͢Δ ࠷଎༧शձ
  5.  8PSLBSPVOE ετϦʔϛϯάϨεϙϯεͷΤϯυϙΠϯτΛແࢹ͢Δ class ConditionalCom mi tteeResponseValidator IGNORE_LI S T

    = Set[ '/v1/your/sse/endpoint' ].freeze def initialize(app, options = {}) @app = app @ m i ddleware = Com mi ttee: :Mi ddleware : : ResponseValidation.ne w( app, options) end def call(env) # IGNORE_LI S T ʹؚ·ΕΔPATH_INFOͷ৔߹͸Com m i ttee: : M i ddleware : : ResponseValidation ΛεΩοϓ͢Δ return @app.call(env) if IGNORE_LI S T . include?(env['PATH_INFO']) @ m i ddleware.call(env) end end ࠷଎༧शձ
  6.  ͳΜͱ͔͍ͨ͠ʜʜ def handle(request) status, headers, response = @app.call(request.env) if

    strea m i ng_response?(headers) response = Rack :: BodyProxy.ne w( response) do begin validate(request, status, headers, response) rescue = > e handle_exception(e, request.env) raise e if @raise end end else begin validate(request, status, headers, response) rescue Com m i ttee :: InvalidResponse handle_exception ($ ! , request.env) raise if @raise return @error_class.ne w ( 500, :invalid_response, $ ! . m essage).render unless @ i gnore_error rescue JSON : : ParserError handle_exception ($ ! , request.env) raise Com m i ttee :: InvalidResponse if @raise return @error_class.ne w ( 500, :invalid_response, "Response wasn't valid JSON.").render unless @i gnore_error end end [status, headers, response] end ࠷଎༧शձ
  7.  ͳΜͱ͔͍ͨ͠ʜʜ def handle(request) status, headers, response = @app.call(request.env) if

    strea m i ng_response?(headers) response = Rack :: BodyProxy.ne w( response) do begin validate(request, status, headers, response) rescue = > e handle_exception(e, request.env) raise e if @raise end end else begin validate(request, status, headers, response) rescue Com m i ttee :: InvalidResponse handle_exception ($ ! , request.env) raise if @raise return @error_class.ne w ( 500, :invalid_response, $ ! . m essage).render unless @ i gnore_error rescue JSON : : ParserError handle_exception ($ ! , request.env) raise Com m i ttee :: InvalidResponse if @raise return @error_class.ne w ( 500, :invalid_response, "Response wasn't valid JSON.").render unless @i gnore_error end end [status, headers, response] end ࠷଎༧शձ
  8.  3BDL#PEZ1SPYZΛ࢖͏ͱ͍͏ͷ͸Ͳ͏͔ if strea mi ng_response?(headers) response = Rack ::

    BodyProxy.ne w( response) do begin validate(request, status, headers, response) rescue => e handle_exception(e, request.env) raise e if @raise end end else ࠷଎༧शձ