-
Notifications
You must be signed in to change notification settings - Fork 21.4k
/
serializer.rb
63 lines (52 loc) · 1.66 KB
/
serializer.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# frozen_string_literal: true
require_relative "extensions"
module ActiveSupport
module MessagePack
module Serializer # :nodoc:
SIGNATURE = "\xCC\x80".b.freeze # == 128.to_msgpack
SIGNATURE_INT = 128
def dump(object)
message_pack_pool.packer do |packer|
packer.write(SIGNATURE_INT)
packer.write(object)
packer.full_pack
end
end
def load(dumped)
message_pack_pool.unpacker do |unpacker|
unpacker.feed_reference(dumped)
raise "Invalid serialization format" unless unpacker.read == SIGNATURE_INT
unpacker.full_unpack
end
end
def signature?(dumped)
dumped.getbyte(0) == SIGNATURE.getbyte(0) && dumped.getbyte(1) == SIGNATURE.getbyte(1)
end
def message_pack_factory
@message_pack_factory ||= ::MessagePack::Factory.new
end
def message_pack_factory=(factory)
@message_pack_pool = nil
@message_pack_factory = factory
end
delegate :register_type, to: :message_pack_factory
def warmup
message_pack_pool # eagerly compute
end
private
def message_pack_pool
@message_pack_pool ||= begin
unless message_pack_factory.frozen?
Extensions.install(message_pack_factory)
install_unregistered_type_handler
message_pack_factory.freeze
end
message_pack_factory.pool(ENV.fetch("RAILS_MAX_THREADS", 5).to_i)
end
end
def install_unregistered_type_handler
Extensions.install_unregistered_type_error(message_pack_factory)
end
end
end
end