code: def on_source(self, time, price, size):
      if not self.bars or self.bars[-1].volume >= self._volume:
          bar = Bar(time, price, price, price, price, size, 1)
          self.bars.append(bar)
      else:
          bar = self.bars[-1]
          bar.high = max(bar.high, price)
          bar.low = min(bar.low, price)
          bar.close = price
          bar.volume += size
          bar.count += 1
      if bar.volume >= self._volume:
          self.bars.updateEvent.emit(self.bars, True)
          self.emit(self.bars)
  
imports: from dataclasses import dataclass, field
  from datetime import datetime
  from typing import ClassVar, List, Optional, Union
  from eventkit import Event, Op
  from ib_insync.contract import Contract
  from ib_insync.objects import DOMLevel, Dividends, FundamentalRatios, MktDepthData, OptionComputation, TickByTickAllLast, TickByTickBidAsk, TickByTickMidPoint, TickData
  from ib_insync.util import dataclassRepr, isNan
label_desc: Use image node_id 2 for calling the VolumeBars obj's underlying member method code with example usage: obj.on_source(time, price, size) without return types