@langchain/langgraph-checkpoint 0.0.2 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -4,6 +4,52 @@ exports.JsonPlusSerializer = void 0;
4
4
  /* eslint-disable @typescript-eslint/no-explicit-any */
5
5
  /* eslint-disable no-instanceof/no-instanceof */
6
6
  const load_1 = require("@langchain/core/load");
7
+ function isLangChainSerializable(value) {
8
+ return (typeof value.lc_serializable === "boolean" && Array.isArray(value.lc_id));
9
+ }
10
+ function isLangChainSerializedObject(value) {
11
+ return (value !== null &&
12
+ value.lc === 1 &&
13
+ value.type === "constructor" &&
14
+ Array.isArray(value.id));
15
+ }
16
+ const _serialize = (value, seen = new WeakSet()) => {
17
+ const defaultValue = _default("", value);
18
+ if (defaultValue === null) {
19
+ return "null";
20
+ }
21
+ else if (typeof defaultValue === "string") {
22
+ return JSON.stringify(defaultValue);
23
+ }
24
+ else if (typeof defaultValue === "number" ||
25
+ typeof defaultValue === "boolean") {
26
+ return defaultValue.toString();
27
+ }
28
+ else if (typeof defaultValue === "object") {
29
+ if (seen.has(defaultValue)) {
30
+ throw new TypeError("Circular reference detected");
31
+ }
32
+ seen.add(defaultValue);
33
+ if (Array.isArray(defaultValue)) {
34
+ const result = `[${defaultValue
35
+ .map((item) => _serialize(item, seen))
36
+ .join(",")}]`;
37
+ seen.delete(defaultValue);
38
+ return result;
39
+ }
40
+ else if (isLangChainSerializable(defaultValue)) {
41
+ return JSON.stringify(defaultValue);
42
+ }
43
+ else {
44
+ const entries = Object.entries(defaultValue).map(([k, v]) => `${JSON.stringify(k)}:${_serialize(v, seen)}`);
45
+ const result = `{${entries.join(",")}}`;
46
+ seen.delete(defaultValue);
47
+ return result;
48
+ }
49
+ }
50
+ // Only be reached for functions or symbols
51
+ return JSON.stringify(defaultValue);
52
+ };
7
53
  async function _reviver(value) {
8
54
  if (value && typeof value === "object") {
9
55
  if (value.lc === 2 && value.type === "undefined") {
@@ -42,7 +88,7 @@ async function _reviver(value) {
42
88
  return value;
43
89
  }
44
90
  }
45
- else if (value.lc === 1) {
91
+ else if (isLangChainSerializedObject(value)) {
46
92
  return (0, load_1.load)(JSON.stringify(value));
47
93
  }
48
94
  else if (Array.isArray(value)) {
@@ -94,24 +140,8 @@ function _default(_key, obj) {
94
140
  }
95
141
  class JsonPlusSerializer {
96
142
  _dumps(obj) {
97
- const jsonString = JSON.stringify(obj, (key, value) => {
98
- if (value && typeof value === "object") {
99
- if (Array.isArray(value)) {
100
- // Handle arrays
101
- return value.map((item) => _default(key, item));
102
- }
103
- else {
104
- // Handle objects
105
- const serialized = {};
106
- for (const [k, v] of Object.entries(value)) {
107
- serialized[k] = _default(k, v);
108
- }
109
- return serialized;
110
- }
111
- }
112
- return _default(key, value);
113
- });
114
- return new TextEncoder().encode(jsonString);
143
+ const encoder = new TextEncoder();
144
+ return encoder.encode(_serialize(obj));
115
145
  }
116
146
  dumpsTyped(obj) {
117
147
  if (obj instanceof Uint8Array) {
@@ -1,6 +1,52 @@
1
1
  /* eslint-disable @typescript-eslint/no-explicit-any */
2
2
  /* eslint-disable no-instanceof/no-instanceof */
3
3
  import { load } from "@langchain/core/load";
4
+ function isLangChainSerializable(value) {
5
+ return (typeof value.lc_serializable === "boolean" && Array.isArray(value.lc_id));
6
+ }
7
+ function isLangChainSerializedObject(value) {
8
+ return (value !== null &&
9
+ value.lc === 1 &&
10
+ value.type === "constructor" &&
11
+ Array.isArray(value.id));
12
+ }
13
+ const _serialize = (value, seen = new WeakSet()) => {
14
+ const defaultValue = _default("", value);
15
+ if (defaultValue === null) {
16
+ return "null";
17
+ }
18
+ else if (typeof defaultValue === "string") {
19
+ return JSON.stringify(defaultValue);
20
+ }
21
+ else if (typeof defaultValue === "number" ||
22
+ typeof defaultValue === "boolean") {
23
+ return defaultValue.toString();
24
+ }
25
+ else if (typeof defaultValue === "object") {
26
+ if (seen.has(defaultValue)) {
27
+ throw new TypeError("Circular reference detected");
28
+ }
29
+ seen.add(defaultValue);
30
+ if (Array.isArray(defaultValue)) {
31
+ const result = `[${defaultValue
32
+ .map((item) => _serialize(item, seen))
33
+ .join(",")}]`;
34
+ seen.delete(defaultValue);
35
+ return result;
36
+ }
37
+ else if (isLangChainSerializable(defaultValue)) {
38
+ return JSON.stringify(defaultValue);
39
+ }
40
+ else {
41
+ const entries = Object.entries(defaultValue).map(([k, v]) => `${JSON.stringify(k)}:${_serialize(v, seen)}`);
42
+ const result = `{${entries.join(",")}}`;
43
+ seen.delete(defaultValue);
44
+ return result;
45
+ }
46
+ }
47
+ // Only be reached for functions or symbols
48
+ return JSON.stringify(defaultValue);
49
+ };
4
50
  async function _reviver(value) {
5
51
  if (value && typeof value === "object") {
6
52
  if (value.lc === 2 && value.type === "undefined") {
@@ -39,7 +85,7 @@ async function _reviver(value) {
39
85
  return value;
40
86
  }
41
87
  }
42
- else if (value.lc === 1) {
88
+ else if (isLangChainSerializedObject(value)) {
43
89
  return load(JSON.stringify(value));
44
90
  }
45
91
  else if (Array.isArray(value)) {
@@ -91,24 +137,8 @@ function _default(_key, obj) {
91
137
  }
92
138
  export class JsonPlusSerializer {
93
139
  _dumps(obj) {
94
- const jsonString = JSON.stringify(obj, (key, value) => {
95
- if (value && typeof value === "object") {
96
- if (Array.isArray(value)) {
97
- // Handle arrays
98
- return value.map((item) => _default(key, item));
99
- }
100
- else {
101
- // Handle objects
102
- const serialized = {};
103
- for (const [k, v] of Object.entries(value)) {
104
- serialized[k] = _default(k, v);
105
- }
106
- return serialized;
107
- }
108
- }
109
- return _default(key, value);
110
- });
111
- return new TextEncoder().encode(jsonString);
140
+ const encoder = new TextEncoder();
141
+ return encoder.encode(_serialize(obj));
112
142
  }
113
143
  dumpsTyped(obj) {
114
144
  if (obj instanceof Uint8Array) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@langchain/langgraph-checkpoint",
3
- "version": "0.0.2",
3
+ "version": "0.0.3",
4
4
  "description": "Library with base interfaces for LangGraph checkpoint savers.",
5
5
  "type": "module",
6
6
  "engines": {