MCPcopy
hub / github.com/Effect-TS/effect / unpack

Function unpack

packages/platform/src/MsgPack.ts:105–155  ·  view source on GitHub ↗
()

Source from the content-addressed store, hash-verified

103 * @category constructors
104 */
105export const unpack = <IE = never, Done = unknown>(): Channel.Channel<
106 Chunk.Chunk<unknown>,
107 Chunk.Chunk<Uint8Array>,
108 IE | MsgPackError,
109 IE,
110 Done,
111 Done
112> =>
113 Channel.flatMap(
114 Channel.sync(() => new Unpackr()),
115 (packr) => {
116 let incomplete: Uint8Array | undefined = undefined
117 const unpack = (value: Chunk.Chunk<Uint8Array>) =>
118 Effect.try({
119 try: () =>
120 Chunk.flatMap(value, (buf) => {
121 if (incomplete !== undefined) {
122 const chunk = new Uint8Array(incomplete.length + buf.length)
123 chunk.set(incomplete)
124 chunk.set(buf, incomplete.length)
125 buf = chunk
126 incomplete = undefined
127 }
128 try {
129 return Chunk.unsafeFromArray(packr.unpackMultiple(buf).flat())
130 } catch (error_) {
131 const error: any = error_
132 if (error.incomplete) {
133 incomplete = buf.subarray(error.lastPosition)
134 return Chunk.unsafeFromArray(error.values ?? [])
135 }
136 throw error
137 }
138 }),
139 catch: (cause) => new MsgPackError({ reason: "Unpack", cause })
140 })
141
142 const loop: Channel.Channel<Chunk.Chunk<unknown>, Chunk.Chunk<Uint8Array>, IE | MsgPackError, IE, Done, Done> =
143 Channel.readWithCause({
144 onInput: (input: Chunk.Chunk<Uint8Array>) =>
145 Channel.zipRight(
146 Channel.flatMap(unpack(input), Channel.write),
147 loop
148 ),
149 onFailure: (cause) => Channel.failCause(cause),
150 onDone: Channel.succeed
151 })
152
153 return loop
154 }
155 )
156
157/**
158 * @since 1.0.0

Callers 2

unpackSchemaFunction · 0.70
duplexFunction · 0.70

Calls 3

syncMethod · 0.80
failCauseMethod · 0.80
setMethod · 0.65

Tested by

no test coverage detected